Spring 如何解决循环依赖问题
Spring在实例化一个bean的时候,是首先递归实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。
通俗地说,就是设置两个池子:一个成品池子,一个半成品池子。能解决循环依赖的前提是:spring开启了allowCircularReferences,那么一个正在被创建的bean才会被放在半成品池子里。在注入bean,向容器获取bean的时候,优先向成品池子要,要不到,再去向半成品池子要。
@resource
与 @autowire
同时存在时谁生效
public class AutowireResourceTest { public static void main(String[] args) { DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); // bean 的定义(class,scope,初始化,销毁) // 把 Config 类交给spring容器管理 AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class) .setScope("singleton") .getBeanDefinition(); beanFactory.registerBeanDefinition("config", beanDefinition); // 给 BeanFactory 添加一些常用的后置处理器 AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory); beanFactory.getBeansOfType(BeanFactoryPostProcessor.class) .values() .forEach(i -> i.postProcessBeanFactory(beanFactory)); beanFactory.getBeansOfType(BeanPostProcessor.class) .values() .forEach(beanFactory::addBeanPostProcessor); System.out.println(beanFactory.getBean(Bean1.class).getInner()); } @Configuration static class Config { @Bean public Bean3 bean3() { return new Bean3(); } @Bean public Bean4 bean4() { return new Bean4(); } @Bean public Bean1 bean1() { return new Bean1(); } } static class Bean1 { @Autowired @Resource(name = "bean4") private Inner bean3; private Inner getInner() { return bean3; } } interface Inner {} static class Bean3 implements Inner { Bean3() { System.out.println(">>>>>>>>>.3"); } } static class Bean4 implements Inner { Bean4() { System.out.println(">>>>>>>>>>>>>.4"); } } }
autowired 与 resource(name=‘xx’) 同时存在时,注入了autowired 的bean。
这跟bean的处理顺序有关,在源码中可以找个两个bean的order的大小关系,当然我们可以手动修改bean的比较器来决定哪个bean起作用。
但是在实际应用中,一般不会同时使用autowired 和 resource , 如果有,那写的那个人肯定第二天不用来上班了。