文章目录
- 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());
}
@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 , 如果有,那写的那个人肯定第二天不用来上班了。