Spring Ioc

Spring IoC

一、Spring Ioc 和 DI

Spring IoC(Inversion of Control),即控制反转,是一种设计思想,是将对象交给Ioc容器创建, 而不需要自己手动创建,降低了程序的耦合度。

DI(Dependency Injection),即依赖注入,是Ioc的一种实现方式,注入对象所需的对象、资源、数据。

二、DI(依赖注入)的三种方式

1.构造方法注入(Constructor)

对以下对象进行依赖注入:

package com.qingsongxyz.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {

    private String name;

    private String age;

    private String gender;
}

name属性对应构造函数参数名,value为注入的值

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.qingsongxyz.pojo.User">
        <constructor-arg name="name" value="张三"/>
        <constructor-arg name="age" value="18"/>
        <constructor-arg name="gender" value="男"/>
    </bean>
</beans>

也可以使用index对应构造函数的参数

<bean id="user" class="com.qingsongxyz.pojo.User">
    <constructor-arg index="0" value="张三"/>
    <constructor-arg index="1" value="18"/>
    <constructor-arg index="2" value="男"/>
</bean>

扩展: c命名空间注入

//需要添加c命名空间xmlns:c="http://www.springframework.org/schema/c"
<bean id="user" class="com.qingsongxyz.pojo.User" c:name="张三" c:age="18" c:gender="男"/>
//使用构造器对应下标
<bean id="user" class="com.qingsongxyz.pojo.User" c:_0="张三" c:_1="18" c:_2="男"/>
2.setter方式注入

使用property进行set注入,该类需要提供相应参数的setXXX()方法

<bean class="com.qingsongxyz.pojo.User">
    <property name="name" value="张三"/>
    <property name="age" value="18"/>
    <property name="gender" value="男"/>
</bean>

特殊类型属性注入:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Various {
    private Person person;
    private int[] number;
    private List<String> school;
    private Map<String, Float> grade;
}
<bean id="person" class="com.qingsongxyz.pojo.Person"></bean>

<bean id="various" class="com.qingsongxyz.pojo.Various">
    <!--引用类型注入-->
    <property name="person" ref="person"/>    
    <!--数组注入-->
    <property name="number">
        <array>
            <value>1</value>
            <value>2</value>
            <value>3</value>
            <value>4</value>
            <value>5</value>
        </array>
    </property>
    
    <!--List注入-->
    <property name="school">
        <list>
            <value>"湖北大学"</value>
            <value>"武汉大学"</value>
        </list>
    </property>
    
    <!--Map注入-->
    <property name="grade">
        <map>
            <entry key="语文" value="90"/>
            <entry key="数学" value="60"/>
            <entry key="英语" value="100"/>
        </map>
    </property>
</bean>

扩展: p命名空间注入

//需要添加p命名空间xmlns:p="http://www.springframework.org/schema/p"
<bean id="user" class="com.qingsongxyz.pojo.User" p:name="张三" p:age="18" p:gender="男"/>
3.注解注入

使用@Autowired、@Resource、@Inject进行注入

注意:官方推荐使用构造器注入方式,能够保证注入的组件不可变,并且确保需要的依赖不为空(避免空指针的情况)!

循环依赖:使用字段注入可能会导致循环依赖,即A里面注入B,B里面又注入A:

public class A {
    @Autowired
    private B b;
}

public class B {
    @Autowired
    private A a;
}

使用构造器注入,在spring项目启动的时候,就会抛出BeanCurrentlyInCreationException异常从而提醒你避免循环依赖,如果是字段注入的话,启动的时候不会报错,在使用那个bean的时候才会报错。

测试:

@Test
public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    User user = context.getBean("user", User.class);
    System.out.println(user);
    //User(name=张三, age=18, gender=男)
}

三、Bean的范围

在xml中配置Bean的时候声明scope

<!--scope默认为singleton-->
<bean id="user" class="com.qingsongxyz.pojo.User" scope="singleton">
*1.singleton

https://www.docs4dev.com/images/spring-framework/5.1.3.RELEASE/singleton.png

Spring创建对象默认为单例范围(singleton),在IoC容器中只创建一个该类的实例

*2.prototype

https://www.docs4dev.com/images/spring-framework/5.1.3.RELEASE/prototype.png

原型范围,每次需要该对象都创建一个新的对象实例

3.request

HTTP 请求的request范围

4.session

HTTP 请求的session范围

5.application

HTTP 请求的application范围

5.websocket

websocket范围

四、懒加载、初始化方法和销毁方法

<bean id="user" class="com.qingsongxyz.pojo.User" lazy-init="true">

lazy-init默认为false,当设置懒加载时,只有使用该对象时才创建该对象,可以减少内存消耗

public class MyBean {
    
    public void init(){
        System.out.println("MyBean的init()执行...");
    }
    
    public void destroyMethod(){
        System.out.println("MyBean的destroy()执行...");
    }
}

<bean id="bean" class="com.qingsongxyz.pojo.MyBean" init-method="init" destroy-method="destroyMethod"/>

当初始化bean对象时触发init-method方法,销毁对象时触发destroy-method方法

测试:

    @Test
public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    MyBean bean = context.getBean("bean", MyBean.class);
    //关闭上下文,销毁bean
    ((ClassPathXmlApplicationContext)context).close();
    //MyBean的init()执行...
    //MyBean的destroy()执行...
}

五、工厂方法创建Bean的实例

Dog类

package com.qingsongxyz.autowire;

public class Dog {
    private String name;

    public void bark()
    {
        System.out.println("小狗" + name + "汪汪叫~");
    }

    public Dog() {
    }

    public Dog(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                '}';
    }
}

首先创建工厂类

package com.qingsongxyz.factory;

import com.qingsongxyz.autowire.Dog;

public class DogFactory {

    /**
     * 静态工厂方法
     * @return
     */
    public static Dog createDog(){
        return new Dog("大黄");
    }

    /**
     * 实例工厂方法
     * @return
     */
    public Dog createDogInstance(){
        return new Dog("小白");
    }
}
<!--静态工厂方法创建对象实例-->
<bean id="yellowDog" class="com.qingsongxyz.factory.DogFactory" factory-method="createDog"/>

<!--实例工厂方法创建对象实例-->
<bean id="dogFactory" class="com.qingsongxyz.factory.DogFactory"/>
<bean id="whiteDog" factory-bean="dogFactory" factory-method="createDogInstance"/>

测试:

@Test
public void factoryTest(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Dog yellowDog = context.getBean("yellowDog", Dog.class);
    System.out.println(yellowDog.getName()); //大黄
    
    Dog whiteDog = context.getBean("whiteDog", Dog.class);
    System.out.println(whiteDog.getName());  //小白
}

六、基于java配置Spring

package com.qingsongxyz.hello;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Hello {
    private String str;

    public void show()
    {
        System.out.println("Hello world!");
    }
}
import com.hubu.hello.Hello;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {
    @Bean
    public Hello getHello()
    {
        return new Hello("Hello world!!!");
    }
}

测试:

@Test
public void Test()
{
    ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
    Hello getHello = context.getBean("getHello", Hello.class);
    System.out.println(getHello); //Hello world!!!
}

@Configuration用于定义配置类,替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

七、Bean的生命周期

1.spring启动源码分析
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

ClassPathXmlApplicationContext 继承树:

在这里插入图片描述

ClassPathXmlApplicationContext:
public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
   this(new String[] {configLocation}, true, null);
}

ClassPathXmlApplicationContext:
//refresh = true parent = null
public ClassPathXmlApplicationContext(
    String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
    throws BeansException {

    super(parent); //调用父类AbstractXmlApplicationContext构造器
    setConfigLocations(configLocations); //保存配置文件名称
    if (refresh) {
        refresh(); //刷新上下文 (核心方法)
    }
}

AbstractRefreshableConfigApplicationContext:
private String[] configLocations; //保存传入参数(配置文件的名称)

public void setConfigLocations(@Nullable String... locations) {
    if (locations != null) {
        Assert.noNullElements(locations, "Config locations must not be null");
        this.configLocations = new String[locations.length]; 
        //循环遍历传入的参数 配置文件 依次保存起来
        for (int i = 0; i < locations.length; i++) {
            this.configLocations[i] = resolvePath(locations[i]).trim();
        }
    }
    else {
        this.configLocations = null;
    }
}

AbstractXmlApplicationContext:
public AbstractXmlApplicationContext(@Nullable ApplicationContext parent) {
    super(parent); //调用父类AbstractRefreshableConfigApplicationContext构造器
}

AbstractRefreshableConfigApplicationContext:
public AbstractRefreshableConfigApplicationContext(@Nullable ApplicationContext parent) {
    super(parent); //调用父类AbstractRefreshableApplicationContext构造器
}

AbstractRefreshableApplicationContext:
public AbstractRefreshableApplicationContext(@Nullable ApplicationContext parent) {
    super(parent); //调用父类AbstractApplicationContext构造器
}

AbstractApplicationContext:
public AbstractApplicationContext(@Nullable ApplicationContext parent) {
    this(); //调用本类的无参构造器 
    setParent(parent); //如果存在父容器 进行相应的配置
}

AbstractApplicationContext:
public AbstractApplicationContext() {
 	//创建资源模式处理器
    this.resourcePatternResolver = getResourcePatternResolver();
}

protected ResourcePatternResolver getResourcePatternResolver() {
    return new PathMatchingResourcePatternResolver(this);
}

AbstractApplicationContext:
//parent = null
public void setParent(@Nullable ApplicationContext parent) {
    this.parent = parent;
    if (parent != null) {
        Environment parentEnvironment = parent.getEnvironment();
        if (parentEnvironment instanceof ConfigurableEnvironment) {
            getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
        }
    }
}

核心方法refresh

public void refresh() throws BeansException, IllegalStateException {
   //同步代码块 确保同一时间只能有一个线程进行刷新操作
   synchronized (this.startupShutdownMonitor) {
      StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

      //完成刷新容器前的准备工作
      prepareRefresh();

      //获取新的容器,配置属性信息
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

      //准备容器
      prepareBeanFactory(beanFactory);

      try {
         //空函数 供子类定义BeanFactoryPostProcessor
         postProcessBeanFactory(beanFactory);

         StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
         
         //执行BeanFactoryPostProcessor
         invokeBeanFactoryPostProcessors(beanFactory);

         //注册BeanPostProcessors
         registerBeanPostProcessors(beanFactory);
         beanPostProcess.end();

         //初始化消息源
         initMessageSource();

         //初始化事件多播器
         initApplicationEventMulticaster();

         //空函数 供子类扩展
         onRefresh();

         //注册监听器
         registerListeners();

         //实例化所有单例bean
         finishBeanFactoryInitialization(beanFactory);

         //完成刷新操作
         finishRefresh();
      }

      catch (BeansException ex) {
         if (logger.isWarnEnabled()) {
            logger.warn("Exception encountered during context initialization - " +
                  "cancelling refresh attempt: " + ex);
         }

         //销毁已经创建的bean
         destroyBeans();

         //设置容器开启位为false
         cancelRefresh(ex);

         //抛出异常
         throw ex;
      }

      finally {
         //清空缓存
         resetCommonCaches();
         //关闭StartupStep
         contextRefresh.end();
      }
   }
}

prepareRefresh() :

protected void prepareRefresh() {
   //保存启动时间 
   this.startupDate = System.currentTimeMillis();
   //设置容器关闭位为false
   this.closed.set(false);
   //设置容器开启位为true 
   this.active.set(true);

   if (logger.isDebugEnabled()) {
      if (logger.isTraceEnabled()) {
         logger.trace("Refreshing " + this);
      }
      else {
         logger.debug("Refreshing " + getDisplayName());
      }
   }

   //加载属性信息 空函数 留给子类重写用于扩展
   initPropertySources();

   //验证需要的环境属性信息
   getEnvironment().validateRequiredProperties();
    
   -----------------------------------------------------
    //没有则创建环境对象 保存环境信息
   	public ConfigurableEnvironment getEnvironment() {
		if (this.environment == null) {
			this.environment = createEnvironment();
		}
		return this.environment;
	}
   -----------------------------------------------------

   //初始化容器预刷新监听器
   if (this.earlyApplicationListeners == null) {
      this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
   }
   else {
      this.applicationListeners.clear();
      this.applicationListeners.addAll(this.earlyApplicationListeners);
   }

   //初始化事件用于通知监听器
   this.earlyApplicationEvents = new LinkedHashSet<>();
}

在这里插入图片描述

obtainFreshBeanFactory() :

AbstractApplicationContext:
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
   refreshBeanFactory(); //刷新容器
   return getBeanFactory(); //返回容器
}

AbstractRefreshableApplicationContext:
protected final void refreshBeanFactory() throws BeansException {
    //判断当前是否存在容器
    if (hasBeanFactory()) {
        destroyBeans();
        closeBeanFactory();
    }
    try {
        //创建一个DefaultListableBeanFactory对象
        DefaultListableBeanFactory beanFactory = createBeanFactory();
        //设置序列化id
        beanFactory.setSerializationId(getId());
        //自定义容器
        customizeBeanFactory(beanFactory);
        //加载bean定义信息
        loadBeanDefinitions(beanFactory);
        //设置容器
        this.beanFactory = beanFactory;
    }
    catch (IOException ex) {
        throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
    }
}

AbstractRefreshableApplicationContext:
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
    //是否允许修改bean定义信息
    if (this.allowBeanDefinitionOverriding != null) {
        beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
    }
    //是否允许循环依赖
    if (this.allowCircularReferences != null) {
        beanFactory.setAllowCircularReferences(this.allowCircularReferences);
    }
}

AbstractXmlApplicationContext:
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
    //创建一个XML bean信息读取器
    XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

    //设置环境信息、资源加载器、资源实体处理器
    beanDefinitionReader.setEnvironment(this.getEnvironment());
    beanDefinitionReader.setResourceLoader(this);
    beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
	
    //初始化bean信息读取器
    initBeanDefinitionReader(beanDefinitionReader);
    //加载bean定义信息
    loadBeanDefinitions(beanDefinitionReader);
}

AbstractXmlApplicationContext:
protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
    //设置开启XML自动检查
    reader.setValidating(this.validating);
}

AbstractXmlApplicationContext:
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
    Resource[] configResources = getConfigResources();
    if (configResources != null) {
        reader.loadBeanDefinitions(configResources);
    }
    
    //配置文件名称集合
    String[] configLocations = getConfigLocations();
    if (configLocations != null) {
        //使用XML bean信息读取器读取配置文件
        reader.loadBeanDefinitions(configLocations);
    }
}

AbstractBeanDefinitionReader:
public int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException {
    Assert.notNull(locations, "Location array must not be null");
    int count = 0;
    //循环遍历 计算配置文件的个数
    for (String location : locations) {
        count += loadBeanDefinitions(location);
    }
    
    //返回配置文件总数
    return count;
}

prepareBeanFactory(beanFactory) :

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
   //设置类加载器
   beanFactory.setBeanClassLoader(getClassLoader());
   //是否无论SPEL表达式, shouldIgnoreSpel默认值为false 不忽略
   if (!shouldIgnoreSpel) {
      //设置bean表达式解析器 
      beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
   }
   beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

   //配置容器 添加bean后置处理器 在依赖检查和自动装配时忽略容器底层相关接口
   beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
   beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
   beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
   beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
   beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
   beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
   beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
   beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);

   beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
   beanFactory.registerResolvableDependency(ResourceLoader.class, this);
   beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
   beanFactory.registerResolvableDependency(ApplicationContext.class, this);
    
   -----------------------------------------------------
   	public void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue) {
		Assert.notNull(dependencyType, "Dependency type must not be null");
		if (autowiredValue != null) {
			if (!(autowiredValue instanceof ObjectFactory || dependencyType.isInstance(autowiredValue))) {
				throw new IllegalArgumentException("Value [" + autowiredValue +
						"] does not implement specified dependency type [" + dependencyType.getName() + "]");
			}
             //加入自动装配Map中
			this.resolvableDependencies.put(dependencyType, autowiredValue);
		}
	}
   -----------------------------------------------------

   //添加bean后置处理器 监听内部bean
   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

   if (!NativeDetector.inNativeImage() && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
      beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
      beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
   }

   // 注册默认环境bean
   /*
    String ENVIRONMENT_BEAN_NAME = "environment";
	String SYSTEM_PROPERTIES_BEAN_NAME = "systemProperties";
	String SYSTEM_ENVIRONMENT_BEAN_NAME = "systemEnvironment";
	String APPLICATION_STARTUP_BEAN_NAME = "applicationStartup";
   */
   if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
      beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
   }
   if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
      beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
   }
   if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
      beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
   }
   if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
      beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
   }
}

registerListeners() :

protected void registerListeners() {
    //注册容器底层监听器
    for (ApplicationListener<?> listener : getApplicationListeners()) {
        getApplicationEventMulticaster().addApplicationListener(listener);
    }

    //注册配置文件中定义的监听器
    String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
    for (String listenerBeanName : listenerBeanNames) {
        getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
    }

    //发布消息
    Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
    this.earlyApplicationEvents = null;
    if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
        for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
            getApplicationEventMulticaster().multicastEvent(earlyEvent);
        }
    }
}

finishBeanFactoryInitialization():

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
   //初始化转换服务
   if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
         beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
      beanFactory.setConversionService(
            beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
   }

   //如果容器中没有注册过BeanFactoryPostProcessor,就注册一个默认的PropertySourcesPlaceholderConfigurer,用于解析注解属性值
   if (!beanFactory.hasEmbeddedValueResolver()) {
      beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
   }

   //初始化LoadTimeWeaverAware
   String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
   for (String weaverAwareName : weaverAwareNames) {
      getBean(weaverAwareName);
   }

   //关闭类加载器
   beanFactory.setTempClassLoader(null);

   //缓存bean的全限定名信息
   beanFactory.freezeConfiguration();

   //实例化所有非懒加载的单例bean
   beanFactory.preInstantiateSingletons();
}

DefaultListableBeanFactory:
public void preInstantiateSingletons() throws BeansException {
    if (logger.isTraceEnabled()) {
        logger.trace("Pre-instantiating singletons in " + this);
    }

    //保存所有的bean全限定名
    List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

    for (String beanName : beanNames) {
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        //非抽象 单例 非懒加载的bean被实例化
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            //判断该bean是否是FactoryBean类型
            if (isFactoryBean(beanName)) {
                Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                if (bean instanceof FactoryBean) {
                    FactoryBean<?> factory = (FactoryBean<?>) bean;
                    boolean isEagerInit;
                    if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                        isEagerInit = AccessController.doPrivileged(
                            (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
                            getAccessControlContext());
                    }
                    else {
                        isEagerInit = (factory instanceof SmartFactoryBean &&
                                       ((SmartFactoryBean<?>) factory).isEagerInit());
                    }
                    if (isEagerInit) {
                        getBean(beanName);
                    }
                }
            }
            else {
                getBean(beanName);
            }
        }
    }
}

AbstractBeanFactory:
@Override
public Object getBean(String name) throws BeansException {
    //真正实例化Bean
    return doGetBean(name, null, null, false);
}

finishRefresh():

protected void finishRefresh() {
   //清除容器缓存
   clearResourceCaches();

   //初始化生命周期处理器
   initLifecycleProcessor();
    
   --------------------------------------------------------
   protected void initLifecycleProcessor() {
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {
			this.lifecycleProcessor =
					beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
			if (logger.isTraceEnabled()) {
				logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");
			}
		}
		else {
             //设置默认生命周期处理器
			DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
			defaultProcessor.setBeanFactory(beanFactory);
			this.lifecycleProcessor = defaultProcessor;
			beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
			if (logger.isTraceEnabled()) {
				logger.trace("No '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "' bean, using " +
						"[" + this.lifecycleProcessor.getClass().getSimpleName() + "]");
			}
		}
	}
   --------------------------------------------------------

   //运行生命周期处理器
   getLifecycleProcessor().onRefresh();

   //发送容器刷新完成事件
   publishEvent(new ContextRefreshedEvent(this));

   //参与注册LiveBeansView MBean
   if (!NativeDetector.inNativeImage()) {
      LiveBeansView.registerApplicationContext(this);
   }
}

在这里插入图片描述

2.生命周期接口方法及其顺序

BeanFactory接口注释中告诉了我们生命周期相关接口方法执行顺序:

在这里插入图片描述

  1. BeanNameAware接口 setBeanName方法
  2. BeanClassLoaderAware接口 setBeanClassLoader方法
  3. BeanFactoryAware接口 setBeanFactory方法
  4. EnvironmentAware接口 setEnvironment方法
  5. EmbeddedValueResolverAware接口 setEmbeddedValueResolver方法
  6. ResourceLoaderAware接口 setResourceLoader方法 (适用于applicationContext)
  7. ApplicationEventPublisherAware接口 setApplicationEventPublisher方法 (适用于applicationContext)
  8. MessageSourceAware接口 setMessageSource方法 (适用于applicationContext)
  9. ApplicationContextAware接口 setApplicationContext方法 (适用于applicationContext)
  10. ServletContextAware接口 setServletContext方法 (适用于applicationContext)
  11. 所有BeanPostProcessor接口 postProcessBeforeInitialization方法
  12. InitializingBean接口 afterPropertiesSet方法
  13. 自定义的init-method方法
  14. 所有BeanPostProcessor接口 postProcessAfterInitialization方法
  15. 所有DestructionAwareBeanPostProcessor接口 postProcessBeforeDestruction方法
  16. DisposableBean接口 destroy方法
  17. 自定义的destroy-method方法

顺序图:

在这里插入图片描述

测试:

MyBeanFactoryPostProcessor:

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("0.MyBeanFactoryPostProcessor postProcessBeanFactory()被执行...beanFactory" + beanFactory);
    }
}

MyBeanNameAware:

public class MyBeanNameAware implements BeanNameAware {

    @Override
    public void setBeanName(String name) {
        System.out.println("\n1.MyBeanNameAware setBeanName()被执行...name = " + name);
    }
}

MyBeanClassLoaderAware:

public class MyBeanClassLoaderAware implements BeanClassLoaderAware {

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("\n2.MyBeanClassLoaderAware setBeanClassLoader()被执行...classLoader = " + classLoader);
    }
}

MyBeanFactoryAware:

public class MyBeanFactoryAware implements BeanFactoryAware {

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("\n3.MyBeanFactoryAware setBeanFactory()被执行...beanFactory = " + beanFactory);
    }
}

MyEnvironmentAware:

public class MyEnvironmentAware implements EnvironmentAware {

    @Override
    public void setEnvironment(Environment environment) {
        System.out.println("\n4.MyEnvironmentAware setEnvironment()被执行...environment = " + environment);
    }
}

MyEmbeddedValueResolverAware:

public class MyEmbeddedValueResolverAware implements EmbeddedValueResolverAware {

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        System.out.println("\n5.MyEmbeddedValueResolverAware setEmbeddedValueResolver()被执行...resolver = " + resolver);
    }
}

MyResourceLoaderAware:

public class MyResourceLoaderAware implements ResourceLoaderAware {

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        System.out.println("\n6.MyResourceLoaderAware setResourceLoader()被执行...resourceLoader = " + resourceLoader);
    }
}

MyApplicationEventPublisherAware:

public class MyApplicationEventPublisherAware implements ApplicationEventPublisherAware {

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        System.out.println("\n7.MyApplicationEventPublisherAware setApplicationEventPublisher()被执行...applicationEventPublisher = " + applicationEventPublisher);
    }
}

MyMessageSourceAware:

public class MyMessageSourceAware implements MessageSourceAware {

    @Override
    public void setMessageSource(MessageSource messageSource) {
        System.out.println("\n8.MyMessageSourceAware setMessageSource()被执行...messageSource = " + messageSource);
    }
}

MyApplicationContextAware:

public class MyApplicationContextAware implements ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("\n9.MyApplicationContextAware setApplicationContext()被执行...applicationContext = " + applicationContext);
    }
}

MyInitializingBean:

public class MyInitializingBean implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("\n10.MyInitializingBean afterPropertiesSet()被执行...");
    }
}

User类:

public class User {

    private String name;

    private String age;

    private String gender;

    public void initMethod(){
        System.out.println("\n12.init user...");
    }

    public void destroyMethod(){
        System.out.println("\n13.destroy user...");
    }

    public User() {
        System.out.println("\n11.执行User的无参构造函数...");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("执行User的setName()...");
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        System.out.println("执行User的setAge()...");
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        System.out.println("执行User的setGender()...");
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

MyDisposableBean:

public class MyDisposableBean implements DisposableBean {

    @Override
    public void destroy() throws Exception {
        System.out.println("\n14.MyDisposableBean destroy()被执行...");
    }
}

MyDestructionAwareBeanPostProcessor:

public class MyDestructionAwareBeanPostProcessor implements DestructionAwareBeanPostProcessor {

    @Override
    public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
        System.out.println("MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = " + bean + " beanName" + beanName);
    }
}

自定义BeanPostProcessor:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("bean初始化之前执行前置处理器...bean--->" + bean + " beanName = " + beanName);
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("bean初始化之后执行后置处理器...bean--->" + bean + " beanName = " + beanName);
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

配置文件:

<bean class="com.qingsongxyz.lifecycle.MyBeanNameAware"/>

<bean class="com.qingsongxyz.lifecycle.MyBeanClassLoaderAware"/>

<bean class="com.qingsongxyz.lifecycle.MyBeanFactoryAware"/>

<bean class="com.qingsongxyz.lifecycle.MyEnvironmentAware"/>

<bean class="com.qingsongxyz.lifecycle.MyEmbeddedValueResolverAware"/>

<bean class="com.qingsongxyz.lifecycle.MyResourceLoaderAware"/>

<bean class="com.qingsongxyz.lifecycle.MyApplicationEventPublisherAware"/>

<bean class="com.qingsongxyz.lifecycle.MyMessageSourceAware"/>

<bean class="com.qingsongxyz.lifecycle.MyApplicationContextAware"/>

<bean class="com.qingsongxyz.lifecycle.MyServletContextAware"/>

<!--Bean后置处理器-->
<bean class="com.qingsongxyz.lifecycle.MyBeanPostProcessor"/>

<bean class="com.qingsongxyz.lifecycle.MyInitializingBean"/>

<bean class="com.qingsongxyz.lifecycle.MyDestructionAwareBeanPostProcessor"/>

<bean class="com.qingsongxyz.lifecycle.MyDisposableBean"/>

<!--Bean工厂后置处理器-->
<bean class="com.qingsongxyz.lifecycle.MyBeanFactoryPostProcessor"/>

<!--自定义User类-->
<bean id="user" class="com.qingsongxyz.lifecycle.User" init-method="initMethod" destroy-method="destroyMethod">
    <property name="name" value="张三"/>
    <property name="age" value="18"/>
    <property name="gender" value=""/>
</bean>
</bean>

测试:

@Test
public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    User user = context.getBean("user", User.class);
    System.out.println("=============" + user + "=============");
    ((ClassPathXmlApplicationContext)context).close(); 
    //容器关闭 销毁创建的Bean 先创建的后销毁
}

/*
0.MyBeanFactoryPostProcessor postProcessBeanFactory()被执行...beanFactoryorg.springframework.beans.factory.support.DefaultListableBeanFactory@4f970963

1.MyBeanNameAware setBeanName()被执行...name = com.qingsongxyz.lifecycle.MyBeanNameAware#0
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyBeanNameAware@29b5cd00 beanName = com.qingsongxyz.lifecycle.MyBeanNameAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyBeanNameAware@29b5cd00 beanName = com.qingsongxyz.lifecycle.MyBeanNameAware#0

2.MyBeanClassLoaderAware setBeanClassLoader()被执行...classLoader = sun.misc.Launcher$AppClassLoader@18b4aac2
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyBeanClassLoaderAware@60285225 beanName = com.qingsongxyz.lifecycle.MyBeanClassLoaderAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyBeanClassLoaderAware@60285225 beanName = com.qingsongxyz.lifecycle.MyBeanClassLoaderAware#0

3.MyBeanFactoryAware setBeanFactory()被执行...beanFactory = org.springframework.beans.factory.support.DefaultListableBeanFactory@4f970963
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyBeanFactoryAware@7113b13f beanName = com.qingsongxyz.lifecycle.MyBeanFactoryAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyBeanFactoryAware@7113b13f beanName = com.qingsongxyz.lifecycle.MyBeanFactoryAware#0

4.MyEnvironmentAware setEnvironment()被执行...environment = StandardEnvironment 
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyEnvironmentAware@45820e51 beanName = com.qingsongxyz.lifecycle.MyEnvironmentAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyEnvironmentAware@45820e51 beanName = com.qingsongxyz.lifecycle.MyEnvironmentAware#0

5.MyEmbeddedValueResolverAware setEmbeddedValueResolver()被执行...resolver = org.springframework.beans.factory.config.EmbeddedValueResolver@42d8062c
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyEmbeddedValueResolverAware@6043cd28 beanName = com.qingsongxyz.lifecycle.MyEmbeddedValueResolverAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyEmbeddedValueResolverAware@6043cd28 beanName = com.qingsongxyz.lifecycle.MyEmbeddedValueResolverAware#0

6.MyResourceLoaderAware setResourceLoader()被执行...resourceLoader = org.springframework.context.support.ClassPathXmlApplicationContext@3cd1f1c8, started on Wed Jul 06 08:47:16 CST 2022
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyResourceLoaderAware@59906517 beanName = com.qingsongxyz.lifecycle.MyResourceLoaderAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyResourceLoaderAware@59906517 beanName = com.qingsongxyz.lifecycle.MyResourceLoaderAware#0

7.MyApplicationEventPublisherAware setApplicationEventPublisher()被执行...applicationEventPublisher = org.springframework.context.support.ClassPathXmlApplicationContext@3cd1f1c8, started on Wed Jul 06 08:47:16 CST 2022
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyApplicationEventPublisherAware@5bfbf16f beanName = com.qingsongxyz.lifecycle.MyApplicationEventPublisherAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyApplicationEventPublisherAware@5bfbf16f beanName = com.qingsongxyz.lifecycle.MyApplicationEventPublisherAware#0

8.MyMessageSourceAware setMessageSource()被执行...messageSource = org.springframework.context.support.ClassPathXmlApplicationContext@3cd1f1c8, started on Wed Jul 06 08:47:16 CST 2022
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyMessageSourceAware@25af5db5 beanName = com.qingsongxyz.lifecycle.MyMessageSourceAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyMessageSourceAware@25af5db5 beanName = com.qingsongxyz.lifecycle.MyMessageSourceAware#0

9.MyApplicationContextAware setApplicationContext()被执行...applicationContext = org.springframework.context.support.ClassPathXmlApplicationContext@3cd1f1c8, started on Wed Jul 06 08:47:16 CST 2022
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyApplicationContextAware@12cdcf4 beanName = com.qingsongxyz.lifecycle.MyApplicationContextAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyApplicationContextAware@12cdcf4 beanName = com.qingsongxyz.lifecycle.MyApplicationContextAware#0
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyServletContextAware@5bcea91b beanName = com.qingsongxyz.lifecycle.MyServletContextAware#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyServletContextAware@5bcea91b beanName = com.qingsongxyz.lifecycle.MyServletContextAware#0
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyInitializingBean@5f3a4b84 beanName = com.qingsongxyz.lifecycle.MyInitializingBean#0

10.MyInitializingBean afterPropertiesSet()被执行...
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyInitializingBean@5f3a4b84 beanName = com.qingsongxyz.lifecycle.MyInitializingBean#0
bean初始化之前执行前置处理器...bean--->com.qingsongxyz.lifecycle.MyDisposableBean@27f723 beanName = com.qingsongxyz.lifecycle.MyDisposableBean#0
bean初始化之后执行后置处理器...bean--->com.qingsongxyz.lifecycle.MyDisposableBean@27f723 beanName = com.qingsongxyz.lifecycle.MyDisposableBean#0

11.执行User的无参构造函数...
执行User的setName()...
执行User的setAge()...
执行User的setGender()...
bean初始化之前执行前置处理器...bean--->User{name='张三', age='18', gender='男'} beanName = user

12.init user...
bean初始化之后执行后置处理器...bean--->User{name='张三', age='18', gender='男'} beanName = user
=============User{name='张三', age='18', gender='男'}=============
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = User{name='张三', age='18', gender='男'} beanNameuser

13.destroy user...
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyDisposableBean@27f723 beanNamecom.qingsongxyz.lifecycle.MyDisposableBean#0

14.MyDisposableBean destroy()被执行...
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyInitializingBean@5f3a4b84 beanNamecom.qingsongxyz.lifecycle.MyInitializingBean#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyServletContextAware@5bcea91b beanNamecom.qingsongxyz.lifecycle.MyServletContextAware#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyApplicationContextAware@12cdcf4 beanNamecom.qingsongxyz.lifecycle.MyApplicationContextAware#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyMessageSourceAware@25af5db5 beanNamecom.qingsongxyz.lifecycle.MyMessageSourceAware#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyApplicationEventPublisherAware@5bfbf16f beanNamecom.qingsongxyz.lifecycle.MyApplicationEventPublisherAware#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyResourceLoaderAware@59906517 beanNamecom.qingsongxyz.lifecycle.MyResourceLoaderAware#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyEmbeddedValueResolverAware@6043cd28 beanNamecom.qingsongxyz.lifecycle.MyEmbeddedValueResolverAware#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyEnvironmentAware@45820e51 beanNamecom.qingsongxyz.lifecycle.MyEnvironmentAware#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyBeanFactoryAware@7113b13f beanNamecom.qingsongxyz.lifecycle.MyBeanFactoryAware#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyBeanClassLoaderAware@60285225 beanNamecom.qingsongxyz.lifecycle.MyBeanClassLoaderAware#0
MyDestructionAwareBeanPostProcessor postProcessBeforeDestruction()被执行...bean = com.qingsongxyz.lifecycle.MyBeanNameAware@29b5cd00 beanNamecom.qingsongxyz.lifecycle.MyBeanNameAware#0
*/

总结:

Bean的生命周期:

一系列XXXAware接口执行 —> 实例化(无参构造) —> 注入属性 —> 后置处理器前置过程 —> 初始化

—> 后置处理器后置过程 —> 销毁

后置处理器中的方法只能进行检测,无法干扰Bean的初始化

八、循环依赖

1.循环依赖场景

Spring容器中的对象默认为singleton单例的, A类的对象初始化依赖类B, B类的对象初始化依赖类A

//类A中存在属性为B类的对象
public class A {

    private B b;

    private A(){

    }
    
    public A(B b) {
        this.b = b;
    }

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }
}
//类B中存在属性为A类的对象
public class B {

    private A a;

    public B() {

    }
    
    public B(A a) {
        this.a = a;
    }

    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }
}

第一种:

<!--对象aa使用setter注入-->
<bean id="aa" class="com.qingsongxyz.circledependence.A">
    <property name="b" ref="bb"/> 
</bean>

<!--对象bb使用setter注入-->
<bean id="bb" class="com.qingsongxyz.circledependence.B">
    <property name="a" ref="aa"/>
</bean>

第二种:

<!--对象aa使用构造器注入-->
<bean id="aa" class="com.qingsongxyz.circledependence.A">
    <constructor-arg name="b" ref="bb"/>
</bean>

<!--对象bb使用构造器注入-->
<bean id="bb" class="com.qingsongxyz.circledependence.B">
	<constructor-arg name="a" ref="aa"/>
</bean>

第三种:

<!--对象aa使用setter注入-->
<bean id="aa" class="com.qingsongxyz.circledependence.A">
    <property name="b" ref="bb"/>
</bean>

<!--对象bb使用构造器注入-->
<bean id="bb" class="com.qingsongxyz.circledependence.B">
    <constructor-arg name="a" ref="aa"/>
</bean>

第四种:

<!--对象aa使用构造器注入-->
<bean id="aa" class="com.qingsongxyz.circledependence.A">
    <constructor-arg name="b" ref="bb"/>
</bean>

<!--对象bb使用构造器注入-->
<bean id="bb" class="com.qingsongxyz.circledependence.B">
    <property name="a" ref="aa"/>
</bean>

测试:

@Test
public void test(){

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    A a = context.getBean("aa", A.class);
    B b = context.getBean("bb", B.class);
    System.out.println("A = " + a + ",属性 b = " + a.getB());
    System.out.println("B = " + b + "属性 a = " + b.getA());
}

/*
第一种 两个对象都是用setter注入
-------------------------------------------------------
A = com.qingsongxyz.circledependence.A@548ad73b,属性 b = com.qingsongxyz.circledependence.B@4c762604
B = com.qingsongxyz.circledependence.B@4c762604属性 a = com.qingsongxyz.circledependence.A@548ad73b
-------------------------------------------------------
第二种 两个对象都是用构造器注入
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException:
Requested bean is currently in creation: Is there an unresolvable circular reference?
-------------------------------------------------------
第三种 A类对象用setter注入 B类对象用构造器注入
A = com.qingsongxyz.circledependence.A@5a4041cc,属性 b = com.qingsongxyz.circledependence.B@15b3e5b
B = com.qingsongxyz.circledependence.B@15b3e5b属性 a = com.qingsongxyz.circledependence.A@5a4041cc
-------------------------------------------------------
第四种 A类对象用构造器注入 B类对象用setter注入
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException:
Requested bean is currently in creation: Is there an unresolvable circular reference?
*/
2.分析实例化非懒加载Bean过程
DefaultListableBeanFactory:
public void preInstantiateSingletons() throws BeansException {
    if (logger.isTraceEnabled()) {
        logger.trace("Pre-instantiating singletons in " + this);
    }

    //所有的bean全限定名
    List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

    for (String beanName : beanNames) {
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        //非抽象 单例 非懒加载的bean被实例化
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            //判断该bean是否实现FactoryBean接口
            if (isFactoryBean(beanName)) {
                Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                if (bean instanceof FactoryBean) {
                    FactoryBean<?> factory = (FactoryBean<?>) bean;
                    boolean isEagerInit;
                    if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                        isEagerInit = AccessController.doPrivileged(
                            (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
                            getAccessControlContext());
                    }
                    else {
                        isEagerInit = (factory instanceof SmartFactoryBean &&
                                       ((SmartFactoryBean<?>) factory).isEagerInit());
                    }
                    if (isEagerInit) {
                        getBean(beanName);
                    }
                }
            }
            else {
                //获取Bean
                getBean(beanName);
            }
        }
    }
    
    for (String beanName : beanNames) {
        Object singletonInstance = getSingleton(beanName);
        if (singletonInstance instanceof SmartInitializingSingleton) {
            StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
                .tag("beanName", beanName);
            SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
            if (System.getSecurityManager() != null) {
                AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                    smartSingleton.afterSingletonsInstantiated();
                    return null;
                }, getAccessControlContext());
            }
            else {
                smartSingleton.afterSingletonsInstantiated();
            }
            smartInitialize.end();
        }
    }
}

AbstractBeanFactory:
@Override
public Object getBean(String name) throws BeansException {
    //真正实例化Bean 
    return doGetBean(name, null, null, false);
}

AbstractBeanFactory:
protected <T> T doGetBean(
    String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
    throws BeansException {

    String beanName = transformedBeanName(name);
    Object beanInstance;

    //先从缓存中获取对象的单例对象
    Object sharedInstance = getSingleton(beanName);
    if (sharedInstance != null && args == null) {
        if (logger.isTraceEnabled()) {
            if (isSingletonCurrentlyInCreation(beanName)) {
                logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
                             "' that is not fully initialized yet - a consequence of a circular reference");
            }
            else {
                logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
            }
        }
        beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    }

    else {
        //如果该对象正在被创建抛出异常
        if (isPrototypeCurrentlyInCreation(beanName)) {
            throw new BeanCurrentlyInCreationException(beanName);
        }

        //检查工厂中是否存在该Bean的定义信息
        BeanFactory parentBeanFactory = getParentBeanFactory();
        if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
            String nameToLookup = originalBeanName(name);
            if (parentBeanFactory instanceof AbstractBeanFactory) {
                return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
                    nameToLookup, requiredType, args, typeCheckOnly);
            }
            else if (args != null) {
                return (T) parentBeanFactory.getBean(nameToLookup, args);
            }
            else if (requiredType != null) {
                return parentBeanFactory.getBean(nameToLookup, requiredType);
            }
            else {
                return (T) parentBeanFactory.getBean(nameToLookup);
            }
        }

        if (!typeCheckOnly) {
            markBeanAsCreated(beanName);
        }

        StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
            .tag("beanName", name);
        try {
            if (requiredType != null) {
                beanCreation.tag("beanType", requiredType::toString);
            }
            RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
            checkMergedBeanDefinition(mbd, beanName, args);
            
            //检查创建的Bean的依赖
            //构造器注入的循环依赖无法解决直接抛出异常
            String[] dependsOn = mbd.getDependsOn();
            if (dependsOn != null) {
                for (String dep : dependsOn) {
                    if (isDependent(beanName, dep)) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                                        "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                    }
                    registerDependentBean(dep, beanName);
                    try {
                        getBean(dep);
                    }
                    catch (NoSuchBeanDefinitionException ex) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                                        "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
                    }
                }
            }

            if (mbd.isSingleton()) {
                //创建Bean的实例                
                sharedInstance = getSingleton(beanName, () -> {
                    try {
                        return createBean(beanName, mbd, args);
                    }
                    catch (BeansException ex) {

                        destroySingleton(beanName);
                        throw ex;
                    }
                });
                beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
            }

            else if (mbd.isPrototype()) {
                // It's a prototype -> create a new instance.
                Object prototypeInstance = null;
                try {
                    beforePrototypeCreation(beanName);
                    prototypeInstance = createBean(beanName, mbd, args);
                }
                finally {
                    afterPrototypeCreation(beanName);
                }
                beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
            }

            else {
                String scopeName = mbd.getScope();
                if (!StringUtils.hasLength(scopeName)) {
                    throw new IllegalStateException("No scope name defined for bean '" + beanName + "'");
                }
                Scope scope = this.scopes.get(scopeName);
                if (scope == null) {
                    throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                }
                try {
                    Object scopedInstance = scope.get(beanName, () -> {
                        beforePrototypeCreation(beanName);
                        try {
                            return createBean(beanName, mbd, args);
                        }
                        finally {
                            afterPrototypeCreation(beanName);
                        }
                    });
                    beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                }
                catch (IllegalStateException ex) {
                    throw new ScopeNotActiveException(beanName, scopeName, ex);
                }
            }
        }
        catch (BeansException ex) {
            beanCreation.tag("exception", ex.getClass().toString());
            beanCreation.tag("message", String.valueOf(ex.getMessage()));
            cleanupAfterBeanCreationFailure(beanName);
            throw ex;
        }
        finally {
            beanCreation.end();
        }
    }

    return adaptBeanInstance(name, beanInstance, requiredType);
}

DefaultSingletonBeanRegistry:

在这里插入图片描述

在这里插入图片描述

/*
	获取对象顺序
	1.一级缓存 singletonObjects
	2.二级缓存 earlySingletonObjects
	3.三级缓存 singletonFactories
*/
DefaultSingletonBeanRegistry:
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    //先从一级缓存singletonObjects中获取相应对象
    Object singletonObject = this.singletonObjects.get(beanName);
    //如果一级缓存中没有该对象并且该对象正在被创建
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
        //再从二级缓存earlySingletonObjects中获取相应对象
        singletonObject = this.earlySingletonObjects.get(beanName);
        //如果二级缓存中没有该对象
        if (singletonObject == null && allowEarlyReference) {
            synchronized (this.singletonObjects) {
                singletonObject = this.singletonObjects.get(beanName);
                if (singletonObject == null) {
                    singletonObject = this.earlySingletonObjects.get(beanName);
                    if (singletonObject == null) {
                        //最后从三级缓存中获取相应对象
                        ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                        //如果三级缓存中有该对象
                        if (singletonFactory != null) {
                            //调用getObject 执行lambda表达式创建对象
                            singletonObject = singletonFactory.getObject();
                            //将对象加入二级缓存中
                            this.earlySingletonObjects.put(beanName, singletonObject);
                            //将对象从三级缓存中清除
                            this.singletonFactories.remove(beanName);
                        }
                    }
                }
            }
        }
    }
    return singletonObject;
}

DefaultSingletonBeanRegistry:
//重载方法
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(beanName, "Bean name must not be null");
    synchronized (this.singletonObjects) {
        //先从一级缓存中获取该对象
        Object singletonObject = this.singletonObjects.get(beanName);
        //如果一级缓存中不存在该对象
        if (singletonObject == null) {
            if (this.singletonsCurrentlyInDestruction) {
                throw new BeanCreationNotAllowedException(beanName,
                                                          "Singleton bean creation not allowed while singletons of this factory are in destruction " +
                                                          "(Do not request a bean from a BeanFactory in a destroy method implementation!)");
            }
            if (logger.isDebugEnabled()) {
                logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
            }
            beforeSingletonCreation(beanName);
            boolean newSingleton = false;
            boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
            if (recordSuppressedExceptions) {
                this.suppressedExceptions = new LinkedHashSet<>();
            }
            try {
              	//调用ObjectFactory函数式接口中的getObject()方法 
                //即执行lambda表达式 createBean(beanName, mbd, args);
                singletonObject = singletonFactory.getObject();
                newSingleton = true;
            }
            catch (IllegalStateException ex) {
                singletonObject = this.singletonObjects.get(beanName);
                if (singletonObject == null) {
                    throw ex;
                }
            }
            catch (BeanCreationException ex) {
                if (recordSuppressedExceptions) {
                    for (Exception suppressedException : this.suppressedExceptions) {
                        ex.addRelatedCause(suppressedException);
                    }
                }
                throw ex;
            }
            finally {
                if (recordSuppressedExceptions) {
                    this.suppressedExceptions = null;
                }
                afterSingletonCreation(beanName);
            }
            if (newSingleton) {
                //将创建的对象保存到一级缓存singletonObjects
                addSingleton(beanName, singletonObject);
            }
        }
        return singletonObject;
    }
}

DefaultSingletonBeanRegistry:
protected void addSingleton(String beanName, Object singletonObject) {
    synchronized (this.singletonObjects) {
        //将创建的对象添加到一级缓存中
        this.singletonObjects.put(beanName, singletonObject);
        //将对象从三级缓存中清除
        this.singletonFactories.remove(beanName);
        //将对象从二级缓存中清除
        this.earlySingletonObjects.remove(beanName);
        this.registeredSingletons.add(beanName);
    }
}

AbstractAutowireCapableBeanFactory:
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    throws BeanCreationException {

    if (logger.isTraceEnabled()) {
        logger.trace("Creating instance of bean '" + beanName + "'");
    }
    RootBeanDefinition mbdToUse = mbd;

    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
        mbdToUse = new RootBeanDefinition(mbd);
        mbdToUse.setBeanClass(resolvedClass);
    }

    try {
        mbdToUse.prepareMethodOverrides();
    }
    catch (BeanDefinitionValidationException ex) {
        throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
                                               beanName, "Validation of method overrides failed", ex);
    }

    try {
        Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
        if (bean != null) {
            return bean;
        }
    }
    catch (Throwable ex) {
        throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                                        "BeanPostProcessor before instantiation of bean failed", ex);
    }

    try {
        //创建Bean对象实例
        Object beanInstance = doCreateBean(beanName, mbdToUse, args);
        if (logger.isTraceEnabled()) {
            logger.trace("Finished creating instance of bean '" + beanName + "'");
        }
        return beanInstance;
    }
    catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {

        throw ex;
    }
    catch (Throwable ex) {
        throw new BeanCreationException(
            mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
    }
}

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

    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
        instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
        //创建对象
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        mbd.resolvedTargetType = beanType;
    }

    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;
        }
    }

    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));
    }

    Object exposedObject = bean;
    try {
        populateBean(beanName, mbd, instanceWrapper);
        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.");
                }
            }
        }
    }

    try {
        registerDisposableBeanIfNecessary(beanName, bean, mbd);
    }
    catch (BeanDefinitionValidationException ex) {
        throw new BeanCreationException(
            mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
    }

    return exposedObject;
}

DefaultSingletonBeanRegistryprotected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(singletonFactory, "Singleton factory must not be null");
    synchronized (this.singletonObjects) {
        //如果一级缓存中不存在该对象
        if (!this.singletonObjects.containsKey(beanName)) {
            //将该对象存入三级缓存 key:对象名 value:lambda表达式
            this.singletonFactories.put(beanName, singletonFactory);
            //将对象从二级缓存中清除
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.add(beanName);
        }
    }
}

AbstractAutowireCapableBeanFactory:
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    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);
    }

    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);
        }
    }

    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
        mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
        return autowireConstructor(beanName, mbd, ctors, args);
    }

    ctors = mbd.getPreferredConstructors();
    if (ctors != null) {
        return autowireConstructor(beanName, mbd, ctors, null);
    }

    //实例化Bean
    return instantiateBean(beanName, mbd);
}

AbstractAutowireCapableBeanFactory:
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 {
            //instantiate()
            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);
    }
}


public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
    if (!bd.hasMethodOverrides()) {
        Constructor<?> constructorToUse;
        synchronized (bd.constructorArgumentLock) {
            constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
            if (constructorToUse == null) {
                final Class<?> clazz = bd.getBeanClass();
                if (clazz.isInterface()) {
                    throw new BeanInstantiationException(clazz, "Specified class is an interface");
                }
                try {
                    if (System.getSecurityManager() != null) {
                        constructorToUse = AccessController.doPrivileged(
                            (PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);
                    }
                    else {
                        constructorToUse = clazz.getDeclaredConstructor();
                    }
                    bd.resolvedConstructorOrFactoryMethod = constructorToUse;
                }
                catch (Throwable ex) {
                    throw new BeanInstantiationException(clazz, "No default constructor found", ex);
                }
            }
        }
        
        //调用工具类BeanUtils 实例化Bean
        return BeanUtils.instantiateClass(constructorToUse);
    }
    else {
        return instantiateWithMethodInjection(bd, beanName, owner);
    }
}

BeanUtils:
public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException {
    Assert.notNull(ctor, "Constructor must not be null");
    try {
        //访问构造器
        ReflectionUtils.makeAccessible(ctor);
        if (KotlinDetector.isKotlinReflectPresent() && KotlinDetector.isKotlinType(ctor.getDeclaringClass())) {
            return KotlinDelegate.instantiateClass(ctor, args);
        }
        else {
            //参数
            Class<?>[] parameterTypes = ctor.getParameterTypes();
            Assert.isTrue(args.length <= parameterTypes.length, "Can't specify more arguments than constructor parameters");
            Object[] argsWithDefaultValues = new Object[args.length];
            for (int i = 0 ; i < args.length; i++) {
                if (args[i] == null) {
                    Class<?> parameterType = parameterTypes[i];
                    argsWithDefaultValues[i] = (parameterType.isPrimitive() ? DEFAULT_TYPE_VALUES.get(parameterType) : null);
                }
                else {
                    argsWithDefaultValues[i] = args[i];
                }
            }
            
            //反射创建对象
            return ctor.newInstance(argsWithDefaultValues);
        }
    }
    catch (InstantiationException ex) {
        throw new BeanInstantiationException(ctor, "Is it an abstract class?", ex);
    }
    catch (IllegalAccessException ex) {
        throw new BeanInstantiationException(ctor, "Is the constructor accessible?", ex);
    }
    catch (IllegalArgumentException ex) {
        throw new BeanInstantiationException(ctor, "Illegal arguments for constructor", ex);
    }
    catch (InvocationTargetException ex) {
        throw new BeanInstantiationException(ctor, "Constructor threw exception", ex.getTargetException());
    }
}

protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    Object exposedObject = bean;
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
            exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);
        }
    }
    return exposedObject;
}

总结:

1.创建Bean实例过程

​ 获取所有的beanDefinitionNames,循环调用getBean(beanName)方法,之后调用doGetBean()方法,

在这个方法中调用getSingleton()方法传入beanName和ObjectFactory对象(lambda表达式),在lambda表达式

中调用createBean()方法,然后调用doCreateBean()方法,调用createBeanInstance()方法,调用

instantiateBean()方法,调用instantiate()方法,最后使用BeanUtils工具类的instantiateClass()方法反射创建

对象实例

2.使用三级缓存解决循环依赖

三级缓存只能解决单例情况的循环依赖问题

A类对象注入方式B类对象注入方式能否解决循环依赖问题
setter注入setter注入
setter注入构造器注入
构造器注入setter注入不能
构造器注入构造器注入不能

大致过程:

在这里插入图片描述

singletonObjects:存放完成初始化的单例对象的cache (一级缓存)

earlySingletonObjects :存放完成实例化但是尚未初始化的,提前暴光的单例对象的Cache (二级缓存)

singletonFactories : 存放进入实例化阶段的单例对象工厂的cache (三级缓存)

  1. 首先实例化A类对象a,将其加入三级缓存singletonFactories中(key为对象名称a,value为lambda表达式,方法体中执行getEarlyBeanReference()函数),然后设置对象a的属性值b(B类的对象),先在一级缓存singletonObjects中查找有没有创建好的B类对象,此时显然没有,创建出的a对象b属性值为null
  2. 然后就会进行B类对象b的实例化,将其加入三级缓存singletonFactories中(key为对象名称b,value为lambda表达式,方法体中执行getEarlyBeanReference()函数),然后设置对象b的属性值a(A类的对象),先在一级缓存singletonObjects中查找有没有创建好的A类对象,由于a对象还在创建中,在一级缓存中找不到,创建出的b对象a属性值为null
  3. 此时从三级缓存中获取到之前存入的key为a的数据,调用objectFactory.getObject()方法,即调用之前存入的lambda表达式,将创建好的A类对象存入二级缓存earlySingletonObjects(key为对象名称a,value为创建好的对象a属性值b为null)并将三级缓存中的a数据清除,将这个对象暴露出去,然后设置属性值初始化对象b,此时b对象创建成功,将其加入一级缓存singletonObjects中并清除二级、三级缓存中b的数据,最后设置属性值初始化对象a,将其加入一级缓存singletonObjects中并清除二级、三级缓存中b的数据,解决循环依赖问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值