Spring的循环依赖
Bean的产生
class—>beanDefinition(bean的各种信息,1.scope 2.isLazy 3.beanClass…)—>实例化(得到一个对象)—>填充属性—>BeanNameAware(设置bean名字)—>InitializingBean(初始化bean)—>单例池Map<beanName,Object>
被Spring管理的对象叫bean user属性是有值的
自己new出来的对象只能叫对象 user属性是没有值的
Bean的生命周期
User实体类
package com.yyq.pojo;
import org.springframework.stereotype.Component;
@Component
public class User {
}
Userservice
package com.yyq.service;
import com.yyq.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class UserService {
@Autowired
private User user;
}
AppConfig
package com.yyq;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan("com.yyq")
public class AppConfig {
}
MyBeanFactoryPostProcessor BeanFactory的后置处理器(这里可以拿到BeanDefinition)
package com.yyq.processor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
GenericBeanDefinition userServiceBeanDefinition = //Spring内部用GenericBeanDefinition
(GenericBeanDefinition)configurableListableBeanFactory.getBeanDefinition("userService");
System.out.println(userServiceBeanDefinition.getBeanClass());
}
}
Test
package com.yyq;
import com.yyq.service.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
UserService bean = applicationContext.getBean(UserService.class);//bean
UserService userService = new UserService();//对象
}
}
这里在MyBeanFactoryPostProcessor拿到了UserService
Bean的后置处理器(BeanPostProcessor用来加工bean)---->填充属性—>BeanNameAware(设置bean名字)—>InitializingBean(初始化bean)—>单例池Map<beanName,Object>
BeanFactory的后置处理器(BeanFactoryPostProcessor)—>启动扫描包—>放在beanDefinitionMap—>BeanFactoryPostProcessor---->BeanFactory(1.beanDefinitionMap 2. singletonObjects 3. beanDefinitionName 4. factoryBeanObjectCache 5.aliasMap 6.BeanPostProcessor)
循环依赖结论
spring容器启动–>scan扫描包–>将扫描的信息放在beandefinitionMap中–>spring对beandefinitionMap进行一次扫描(判断是否单列,是否懒加载,名字是否符合)–>可以通过beanfactorypostprocessor修改bean工厂
判断X是否在单例池中–>没有的话开始实例化X–>推断X的构造方法–>判断X是否提前暴露–>没有提前暴露–>生成objectfactory暴露到二级缓存中–>属性填充–>发现依赖Y–>开始走Y的生命周期–>Y做属性填充的时候需要依赖X–>又走X的生命周期–>X存在objectfactory–>将X的objectfactory注入,完成依赖注入–>通过beanpostprocessor我们可以修改objectory即修改bean