文章目录
- Spring 如何解决循环依赖问题
- `@resource` 与 `@autowire` 同时存在时谁生效
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());}@Configurationstatic class Config {@Beanpublic Bean3 bean3() {return new Bean3();}@Beanpublic Bean4 bean4() {return new Bean4();}@Beanpublic 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 , 如果有,那写的那个人肯定第二天不用来上班了。