Spring Ioc启动流程分析

SpringIOC容器初始化流程12大步源码解析 目录 1.概要 2.AnnotationConfigApplicationContext构造器 3.容器刷新第一步--prepareRefresh()准备上下文环境 4.第二步创建工厂实例 5. 第三步预准备工厂 6.第四步postProcessBeanFactory 7. 第五步执行所有的BeanFactory后置增强器 8. 第六步注册所有的bean的后置处理器 BeanPostProcessors 9. 第七步初始化国际化组件 10. 第八步初始化事件多播器组件 11. 第九步o 阅读详情

上一篇我们解析了设计模式的代理模式,在这里再做一次Spring Ioc启动流程的分析,然后再引入到SpringAOP 的原理上来

ok,我们先看下Spring Ioc启动的大致流程吧

目前Spring 启动流程大致分析如图

在测试类中 ApplicationContext ac = new ClassPathXmlApplicationContext(“applicationContext.xml”);

找到启动的入口:
在这里插入图片描述
在 ClassPathXmlApplicationContext 的实例化方法中,找到refresh() 方法
在这里插入图片描述
在这里插入图片描述
此处调用的是 AbstractApplicitionContext 中的refresh() 方法进入启动,代码如下:

public void refresh() throws BeansException, IllegalStateException {
    
    synchronized (this.startupShutdownMonitor) {
    StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
      // Prepare this context for refreshing.
      // 准备 刷新容器的上下文context信息 注:此 applicationContext是BeanFactory接口的实现类
      //设置容器的启动和激活状态,初始化环境和资源信息
      prepareRefresh();
      // Tell the subclass to refresh the internal bean factory.
      // 创建 beanFactory 容器对象,及初始的一些容器对象
      // 注:beanFactory属性 为 此 applicationContext 对象中的一个属性
      // 加载beanDefinition 信息到 beanFactory(默认是DefaultListableBeanFactory)的 beanDefinitionMap 容器中去
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
      // 为 beanFactory 准备一些信息 类加载器classLoader
      // BeanExpressionResolver 表达式解析器
      // BeanPostProcessor bean的后置处理器  
      // 需要忽略的 Aware接口 等
      // Prepare the bean factory for use in this context.
      prepareBeanFactory(beanFactory);
      try {
       // Allows post-processing of the bean factory in context subclasses.
      // debug进来看是个空方法,什么也没有, do nothing
      // 看了方法的注释意思是 在标准初始化之后 修改 applicationContext的
      // 内部的beanFactory        
      postProcessBeanFactory(beanFactory);
      
      StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
      // Invoke factory processors registered as beans in the context.
      // 调用 BeanFactoryPostProcessor的 postProcessBeanFactory()方法对 beanDefinition 的信息做处理  
      invokeBeanFactoryPostProcessors(beanFactory);
      // Register bean processors that intercept bean creation.
      // 注册 beanPostProcessor 到 beanFactory 中去
       registerBeanPostProcessors(beanFactory);
      // do nothing 
       beanPostProcess.end();
       // Initialize message source for this context.
      // 初始化 MessageSource 用于处理国际化资源
      initMessageSource();
        // Initialize event multicaster for this context.
      // 初始化 应用事件的 多播器-广播器 用于分发应用事件给监听者
       initApplicationEventMulticaster();
       // Initialize other special beans in specific context subclasses.
      // 初始化其他bean和进行其他上下文初始化 主要用于扩展  do nothing 
        onRefresh();
        // Check for listener beans and register them.
      // 注册事件监听器 到 applicationContext/beanFactory 中
       registerListeners();
        // Instantiate all remaining (non-lazy-init) singletons.
      // 完成 beanFactory中普通单例Bean 的创建和初始化, 进入创建bean的流程
       finishBeanFactoryInitialization(beanFactory);
        // Last step: publish corresponding event.
      // 启动完成,资源回收,分发"刷新完成"事件
        finishRefresh();

      }catch (BeansException ex) {
        if (logger.isWarnEnabled()) {
          logger.warn("Exception encountered during context initialization - " +
             "cancelling refresh attempt: " + ex);
        }
        // Destroy already created singletons to avoid dangling resources.
        destroyBeans();
        // Reset 'active' flag.
        cancelRefresh(ex);
        // Propagate exception to caller.
        throw ex;
      }
      finally {
        // Reset common introspection caches in Spring's core, since we
        // might not ever need metadata for singleton beans anymore...
        resetCommonCaches();
        contextRefresh.end();
      }
    }
  }

Spring IOC容器启动步骤 主要就是调用的refresh() 方法中的这13个方法

  1. prepareRefresh();

  2. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

  3. prepareBeanFactory(beanFactory);

  4. postProcessBeanFactory(beanFactory);

  5. invokeBeanFactoryPostProcessors(beanFactory);

  6. registerBeanPostProcessors(beanFactory);

  7. beanPostProcess.end();

  8. initMessageSource();

  9. initApplicationEventMulticaster();

  10. onRefresh();

  11. registerListeners();

  12. finishBeanFactoryInitialization(beanFactory);

  13. finishRefresh();

上面方法全部执行完成之后创建出 ApplicationContext 的实例对象 ac

ac 中含有 beanFactory 的实例对象DefaultListableBeanFactory
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述其中 我们主要分析Spring IOC 中 普通的Bean对象的创建过程

也就是 第12个方法的

主要执行流程为
AbstractApplicationContext.finishBeanFactoryInitialization(beanFactory)---->
DefaultListableBeanFactory.preInstantiateSingletons()—>

AbstractBeanFactory.getBean(String name) —>

AbstractBeanFactory.doGetBean() ----->

AbstractAutowireCapableBeanFactory.createBean()—>

AbstractAutowireCapableBeanFactory.doCreateBean()—>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
再到 doCreateBean() 方法中的


// doCreateBean() 
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
      throws BeanCreationException {

    // Instantiate the bean.
    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
      instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
      // 创建bean 的实例
      instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
      mbd.resolvedTargetType = beanType;
    }
    // Allow post-processors to modify the merged bean definition.
    synchronized (mbd.postProcessingLock) {
      if (!mbd.postProcessed) {
        try {
          applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
        }
        catch (Throwable ex) {
          throw new BeanCreationException(mbd.getResourceDescription(), beanName,
              "Post-processing of merged bean definition failed", ex);
        }
        mbd.postProcessed = true;
      }
    }

    // Eagerly cache singletons to be able to resolve circular references
    // even when triggered by lifecycle interfaces like BeanFactoryAware.
    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
        isSingletonCurrentlyInCreation(beanName));
    if (earlySingletonExposure) {
      if (logger.isTraceEnabled()) {
        logger.trace("Eagerly caching bean '" + beanName +
            "' to allow for resolving potential circular references");
      }
      addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    }

    // Initialize the bean instance.
    Object exposedObject = bean;
    try {
    // 装配 bean 实例的属性信息
      populateBean(beanName, mbd, instanceWrapper);
      // 实例化 bean 信息
      exposedObject = initializeBean(beanName, exposedObject, mbd);
    }
    catch (Throwable ex) {
      if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
        throw (BeanCreationException) ex;
      }
      else {
        throw new BeanCreationException(
            mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
      }
    }
    if (earlySingletonExposure) {
      Object earlySingletonReference = getSingleton(beanName, false);
      if (earlySingletonReference != null) {
        if (exposedObject == bean) {
          exposedObject = earlySingletonReference;
        }
        else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
          String[] dependentBeans = getDependentBeans(beanName);
          Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
          for (String dependentBean : dependentBeans) {
            if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
              actualDependentBeans.add(dependentBean);
            }
          }
          if (!actualDependentBeans.isEmpty()) {
            throw new BeanCurrentlyInCreationException(beanName,
                "Bean with name '" + beanName + "' has been injected into other beans [" +
                StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
                "] in its raw version as part of a circular reference, but has eventually been " +
                "wrapped. This means that said other beans do not use the final version of the " +
                "bean. This is often the result of over-eager type matching - consider using " +
                "'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
          }
        }
      }
    }
    // Register bean as disposable.
    try {
      registerDisposableBeanIfNecessary(beanName, bean, mbd);
    }
    catch (BeanDefinitionValidationException ex) {
      throw new BeanCreationException(
          mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
    }
    return exposedObject;
  }

// 使用反射 创建 bean的实例
instanceWrapper = createBeanInstance(beanName, mbd, args);


/**
   * Create a new instance for the specified bean, using an appropriate instantiation strategy:
   * factory method, constructor autowiring, or simple instantiation.
   * @param beanName the name of the bean
   * @param mbd the bean definition for the bean
   * @param args explicit arguments to use for constructor or factory method invocation
   * @return a BeanWrapper for the new instance
   */
  protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    // Make sure bean class is actually resolved at this point.
    Class<?> beanClass = resolveBeanClass(mbd, beanName);

    if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
      throw new BeanCreationException(mbd.getResourceDescription(), beanName,
          "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
    }

    Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
    if (instanceSupplier != null) {
      return obtainFromSupplier(instanceSupplier, beanName);
    }

    if (mbd.getFactoryMethodName() != null) {
      return instantiateUsingFactoryMethod(beanName, mbd, args);
    }

    // Shortcut when re-creating the same bean...
    boolean resolved = false;
    boolean autowireNecessary = false;
    if (args == null) {
      synchronized (mbd.constructorArgumentLock) {
        if (mbd.resolvedConstructorOrFactoryMethod != null) {
          resolved = true;
          autowireNecessary = mbd.constructorArgumentsResolved;
        }
      }
    }
    if (resolved) {
      if (autowireNecessary) {
        return autowireConstructor(beanName, mbd, null, null);
      }
      else {
        return instantiateBean(beanName, mbd);
      }
    }
    // Candidate constructors for autowiring?
    // 决定 使用哪些构造函数来 实例化 bean对象
    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
        mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
      return autowireConstructor(beanName, mbd, ctors, args);
    }
    // Preferred constructors for default construction?
    // 在 beanDefinition 信息中指定优先使用的 构造器
    ctors = mbd.getPreferredConstructors();
    if (ctors != null) {
      return autowireConstructor(beanName, mbd, ctors, null);
    }
    // No special handling: simply use no-arg constructor.
    // 若无特别的指定, 则默认会使用无参的构造函数 
    return instantiateBean(beanName, mbd);
  }

  /**
   * 使用 默认的构造函数 创建 bean实例对象
   * Instantiate the given bean using its default constructor.
   * @param beanName the name of the bean
   * @param mbd the bean definition for the bean
   * @return a BeanWrapper for the new instance
   */
  protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {
    try {
      Object beanInstance;
      if (System.getSecurityManager() != null) {
        beanInstance = AccessController.doPrivileged(
            (PrivilegedAction<Object>) () -> getInstantiationStrategy().instantiate(mbd, beanName, this),
            getAccessControlContext());
      }
      else {
        beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);
      }
      BeanWrapper bw = new BeanWrapperImpl(beanInstance);
      initBeanWrapper(bw);
      return bw;
    }
    catch (Throwable ex) {
      throw new BeanCreationException(
          mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
    }
  }

// 装配 bean中的属性 比如: 若在UserServiceImpl 中如果有userDao 这个属性,则在这一步给 userDao 这个属性装配到UserServiceImpl 这个bean的实例对象中去
populateBean(beanName, mbd, instanceWrapper);

// 初始化 bean
exposedObject = initializeBean(beanName, exposedObject, mbd);

初始化initializeBean()方法代码如下:
AbstractAutowireCapableBeanFactory.initializeBean()

/** 
    * @see BeanNameAware
     * @see BeanClassLoaderAware
     * @see BeanFactoryAware
     * @see #applyBeanPostProcessorsBeforeInitialization
     * @see #invokeInitMethods
     * @see #applyBeanPostProcessorsAfterInitialization
     */
  protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    if (System.getSecurityManager() != null) {
      AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
        invokeAwareMethods(beanName, bean);
        return null;
      }, getAccessControlContext());
    }
    else {
    // 调用 Aware 方法 设置容器属性到 bean实例中
       invokeAwareMethods(beanName, bean);
    }

    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
      // 应用 beanPostProcessor 的 初始化前方法增强
      wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }

    try {
    //调用 bean的初始化方法  afterPropertiesSet() -- invokeCustomInitMethod
      invokeInitMethods(beanName, wrappedBean, mbd);
    }
    catch (Throwable ex) {
      throw new BeanCreationException(
          (mbd != null ? mbd.getResourceDescription() : null),
          beanName, "Invocation of init method failed", ex);
    }
    if (mbd == null || !mbd.isSynthetic()) {
    // 应用 beanPostProcessor 的 初始化后方法的增强
      wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }

    return wrappedBean;
  }

至此,bean对应的实例对象创建并初始化完成

第12个方法执行完成 则 所有的bean实例化对象 都被创建并初始化,被放在了DefaultListableBeanFactory 的 Map<String, Object> singletonObjects容器中 ----> 此Map 容器则是常说的Spring Ioc的容器

普通Bean创建流程都是由BeanFactory统一创建,整体流程如下图:
在这里插入图片描述
平时我们自己使用类时创建的对象都是自己手动调用 类的构造方法来创建的,但是在Spring中 相当于是把控制bean对象创建的权限交给了Spring通过反射Constructor 来创建,故而叫做 Inversion of Control 控制反转 是为Spring Ioc

关于BeanPostProcessor 和BeanFactoryPostProcessor

BeanPostProcessor 和 BeanFactoryPostProcess 都是Spring 初始化bean时对外暴露的扩展点。

由上图可看出 BeanFactoryPostProcessor 是针对于BeanDefinition类来进行增强的,允许在容器实例化bean之前读取bean的定义信息(配置元数据),并可以修改,定义一个BeanFactoryPostProcessor 需要实现该接口,并重写
接口方法
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

而 BeanPostProcessor 是针对于 Bean初始化前后的增强操作,依赖于
postProcessBeforeInitialization(Object bean, String beanName)
和
postProcessAfterInitialization(Object bean, String beanName)
这两个方法
分别在 bean对象初始化的前和后 增强扩展

而Spring Aop 的增强功能 就是通过 此处的 postProcessAfterInitialization() 初始化后的后置处理来创建 bean的代理对象来实现 切面编程 做增强扩展的

至此,Spring Ioc 的流程分析完成,至于里面还有好多细节的点,还是需要手动去debug层层跟进,调试,记录
总体上Spring Ioc的启动流程大致过程就是这样的,OK,下次我们在来分析Spring AOP 相关的内容吧

1.5 一行 refresh(),撑起整个 Spring:IoC 容器启动全链路源码拆解 Spring IoC 容器启动核心流程解析 本文深入解析 Spring 容器启动的核心方法 refresh() 的12个关键步骤: 容器准备阶段 - 记录启动时间、设置状态、初始化属性源 获取BeanFactory - 创建或刷新底层容器结构 配置标准特性 - 设置类加载器、EL解析器等 子类扩展点 - 允许子类自定义BeanFactory配置 后置处理器执行 - 处理配置类、组件扫描等 注册Bean后处理器 - 为后续Bean实例化做准备 国际化支持 - 初始化消息源组件 事件机制 - 设置事件广播器 子 阅读详情

相关推荐

详解Spring IOC 容器启动流程分析

主要介绍了Spring IOC 容器启动流程分析,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

Spring IOC容器启动整体流程

目录 一、简介 二、IOC整体流程 一、简介 Spring核心有两个: IOC:控制反转 AOP:面向切面编程 相信大家在项目中都使用过Spring进行开发,都知道Spring非常强大,那么在熟练掌握Spring进行开发后,我们有必要去了解一下其中的原理,Spring工作原理也是面试中必问的一个环节,先来看看几道常见的面试题,想想看,如果被面试官问到,你会怎么答? Spring IOC的工作原理? Spring Bean的生命周期是怎样的? Spring 中使用到了哪些设计模式? Spr

weixiaohuai的博客 3530

80MHz~100MHz频谱分析仪设计

由理论分析可知,经过乘法器后输出的信号为频率为w1+w2的高频信号和w1-w2的低频信号,除了想要采样的直流信号外,最小的信号频率为100kHz。因此,经过一系列推导可以得到该滤波器的元件C1,C2,C3,R1,R2的近似值分别为:C1=2.36nF,C2=32.1nF,C3=1.07nF,R1=1.39k,R2=2.84k。AK,此时的频率w2即为被测信号的频率,待测信号源电压幅度为,因此为了能达到直流采样的设计,我们将本振源的频率输出范围做成80~110 MHz,提高了题目的频率要求。

qq_48771816的博客 5243

Spring IOC的启动过程

Spring IOC的启动过程

Palpitate_fx的博客 3072

workbench谐响应

定义材料 打开Engineering Data定义材料,在分析时不同部分选择不同材料 建模 打开Geometry建模,我举的例子很简单就一根光秃秃的轴 因为要加轴承,在轴上创建imprint face 因为要用point mass代替轴上原来的盘,在轴上盘的位置新建一个Plane,用Slice方法将轴从XYPlane3分成两段 施加边界条件以及谐响应分析 打开Model 1.在两段轴的交界面处,创建Point Mass,输入质量与转动惯量,位置在轴线上 2.mass point promote to.

my blogs include programming, math, physics.回首过去,放眼未来。 leslielee.blog.youkuaiyun.com 5886

Open5GS实战指南:Ubuntu 22.04环境下的5G核心网快速部署

本文提供Open5GS在Ubuntu 22.04环境下部署5G核心网的实战指南,涵盖环境准备、MongoDB配置、核心组件安装、WebUI部署及网络调优等关键步骤。通过详细的安装教程和常见问题解决方案,帮助开发者快速搭建开源5G核心网测试环境。

weixin_29202213的博客 539

Spring IOC的启动流程(Spring bean对象的创建过程),从理论到源码,一步分析到位

这里new了一个对象,这其实是最简单的创建IOC容器的方法,我们点进去。 这是它的构造方法,它重载了其他构造方法,点this,可以看到: 在这个方法中,我们可以看到他调用了一个刷新的方法,这个刷新就是IOC容器的刷新开启方法,我们再点进去。类:AbstractApplicationContext 可以一次正常的流程,他一共调用了12个方法来启动IOC容器。 方法主要的作用就是在容器刷新前做准备工作: 方法的主要作用是创建一个DefaultListableBeanFac

qq_53999369的博客 1701

MCGS 和 200SMART 时间同步

在实际应用中,PLC经常会因为断电原因,导致时间不准确。假设我们设置了一个投加泵,每天8-18点投加。屏幕上显示的时间和PLC内部的时间,很可能不一样。所以需要在触摸屏上读取PLC的时间,并且提供设置功能。

mmxxoo_xxmmp的博客 1521

Spring IOC 容器启动流程分析

Spring IOC 容器启动流程分析 使用 Spring 时,XML 和注解是使用得最多的两种配置方式,虽然是两种完全不同的配置方式,但对于 IOC 容器来说,两种方式的不同主要是在 BeanDefinition 的解析上。而对于核心的容器启动流程,仍然是一致的。 AbstractApplicationContext 的 refresh 方法实现了 IOC 容器启动...

Duan的博客 531

告别环境配置烦恼:Docker容器化一站式搭建Zephyr RTOS开发环境

本文详细介绍了如何使用Docker容器化技术一站式搭建Zephyr RTOS开发环境,彻底解决环境配置不一致、依赖冲突等难题。通过预构建镜像、数据卷挂载和实战编译示例,帮助开发者快速获得隔离、一致且可复现的嵌入式开发环境,大幅提升开发效率和团队协作体验。

n8m7b6v5c4的博客 189

Pytorch CIFAR10图像分类 EfficientNet v1篇

EfficientNet源自Google Brain的论文EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. 从标题也可以看出,这篇论文最主要的创新点是. 论文提出了,混合缩放,把网络缩放的三种方式:深度、宽度、分辨率,组合起来按照一定规则缩放,从而提高网络的效果。EfficientNet在网络变大时效果提升明显,把精度上限进一步提升,成为了当前最强网络。

风信子的猫Redamancy的快乐星球 1852

Spring IOC启动分析 一 加载Bean定义的流程

1、注解方式启动方法 //参数是使用@Configuration标记的类 //参数可以是多个 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); 2、加载Bean定义的流程 2.1) 把Spring内部Bean...

lihongtai的专栏 376

Linux系统故障排查思路实践教程(上)

本文主要介绍了Linux系统日志分析与常见故障排查的实用方法。首先从系统日志的分类及其涉及的日志文件进行说明;其次详细讲解了忘记用户密码的解决方案;接着对系统无法启动问题,提供了异常断电后修复文件系统、/etc/fstab文件丢失恢复等常见故障的处理方案。最后介绍了文件系统只读错误的排查思路和修复方法,包括磁盘空间检查、文件系统修复等实用技巧。全文提供了大量具体命令和操作流程,为Linux系统维护人员提供了实用的故障处理指南。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 330

Spring ioc 启动初始化流程分析《一》

IOC核心为BeanFactory接口,beandefinition装载过程,分析流程如下: 1、从ClassPathXmlApplicationContext为切入点,找到父类AbstractRefreshableApplicationContext,进入refreshBeanFactory() 2、进入loadBeanDefinitions(beanFactory); 3、loadBeanDe...

郭敬仰的博客 228

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

丨汀、的博客 4万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Tomcat启动带动Spring IoC容器启动流程源码分析

Tomcat启动带动Spring IoC容器启动流程源码分析目录概述原理概述相关工具如下:分析:小结:参考资料和推荐阅读 LD is tigger forever,CG are not brothers forever, throw the pot and shine forever. Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 654

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

一. 前言Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别。本篇就以BeanFactory基础容器接口的默认实现类XmlBeanFactory启动流程分析来入门Spring源码的学习。二. 概念要点1. 概念定义BeanDefinition:Bean元数据描述,Bean在Spring IOC容...

weixin_35645813的博客 108

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring IoC 源码系列(二)IoC 容器启动流程分析

private static final String configLocation = "applicationContext.xml"; @Test public void beanTest() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext(c...

点滴记录 632

分析spring webmvc启动流程:serlvet注册、IoC容器创建、bean初始化、MVC的流程

serlvet注册 相关代码: 在servlet中,servlet及其子元素用来注册Servlet servlet-name 指定Servlet的名称,在同一个Web应用程序中,其名称必须是唯一的 servlet-class 指定Servlet类的完整限定名(包含包名) jsp-file 指定在Web应用程序中的JSP文件的完整路径,该路径以斜杠(/)开始 – – ...

weixin_43688599的博客 277

Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

目录一. 前言二. 概念要点1. 概念定义2. 糟糕!XmlBeanFactory被废弃了3. XmlBeanFactory?!XML,你会XML解析吗?三. XmlBeanFactory启动流程分析四. XmlBeanFactory启动源码解析五. 结语六. 附录 一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别。本篇就以BeanFactory基础容器接口的默认实现类XmlBeanFact

有来技术 585

Spring IOC容器启动流程分析(一)

以XML方式启动容器 代码结构 启动流程分析 以注解方式启动容器

懵懂时光简简单单 300

深入分析 Spring IOC 容器的启动流程,说明 Bean 的加载、实例化和初始化过程中涉及的关键类和方法

作为一名有着八年 Java 开发经验的工程师,在多个大型项目中与 Spring 框架打交道的过程里,我深刻体会到理解 Spring IOC(Inversion of Control,控制反转)容器的重要性。它就像是 Spring 应用的 “心脏”,掌控着 Bean 的整个生命周期。记得在一次系统重构时,由于对 IOC 容器启动流程理解不足,导致 Bean 加载异常,花费了大量时间排查问题。从那以后,我深入研究了 Spring IOC 容器的原理,接下来就为大家分享其中的细节。

Minoz_wl的博客 565

【小家Spring】Spring IOC容器启动流程 AbstractApplicationContext#refresh()方法源码分析(二),Spring容器启动/刷新的完整总结

前言 在上一篇文章:【小家Spring】Spring IOC容器启动流程 AbstractApplicationContext#refresh()方法源码分析(一)中已经介绍了前五步,现在Spring IOC容器的工厂环境已经都准备好了。 Bean工厂可以简单理解为一个钩子容器,里面注册有众多的BeanFactoryPostProcessor以及BeanFactoryPostProcessor,接...

架构师:通透,才能写出好代码! 5939

【小家Spring】Spring IOC容器启动流程 AbstractApplicationContext#refresh()方法源码分析(一)

前言 还记得我在这篇博文:【小家Spring】Spring容器(含父子容器)的启动过程源码级别分析(含web.xml启动以及全注解驱动,和ContextLoader源码分析) 里留了几个非常重要,但是没有解释的方法。其中有一个非常重要的方法ApplicationContext#refresh()方法就是提到两次但都暂时忽略了(因为有父子容器,所以会刷新两次容器~) refresh()方法是Spri...

架构师:通透,才能写出好代码! 1万+

Spring IOC容器启动流程与Bean生命周期源码分析

文章目录1、IOC容器启动与Bean生命周期源码分析1、new ClassPathXmlApplicationContext初始化过程1、Super(parent)2、setConfigLocations(configLocations)3、refresh()1、prepareRefresh2、obtainFreshBeanFactory1、加载bean声明的一系列过程2、注册bean声明3、prepareBeanFactory4、postProcessBeanFactory2、 ApplicationCo

学无止境! 2344

Spring框架九、Spring IOC启动流程源码分析一

一、环境准备 public class MyTest { @Test public void test01() throws FileNotFoundException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application_context....

吃透Java 381
上一篇: java 代理模式[Proxy]--AOP
下一篇: Spring源码编译Could not find method compile()的问题
xiaolong_java
博客等级 码龄12年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值