Spring循环依赖
什么是Spring的循环依赖?循环依赖会存在哪些问题?
公众号:架构技术精选 纯技术、源码解析的公众号
示例:AService依赖BService; BService依赖AService
@Service
public class AService {
//
@Autowired
public BService bService;
}
@Service
public class BService {
@Autowired
public AService aService;
}
上面演示的例子就是循环注入
如果改为多例的化,运行时就会报错,循环引用异常,找不到对象
@Scope("prototype")
Spring中的循环依赖问题在单例的情况下,Spring是已经帮我们解决好了,多例没有解决循环依赖问题。
为啥,多例的情况下 Spring没有去解决循环依赖问题?
因为在多例的情况下,设置的多例的对象没有明确哪一个,就会产生循环依赖问题。
Spring多例我们要:如何解决循环依赖问题?
我们可以自己去:明确指定引用那个对象
@Service
@Scope("prototype")
public class AService {
// @Autowired
public BService bService;
// 为什么Aservice在创建的时候 为什么Bservice比ASERVICE 先创建
public AService() {
System.out.println("AService被Java的反射技术创建");
}
public void setbService(BService bService) {
this.bService = bService;
}
}
@Service
@Scope("prototype")
public class BService {
// @Autowired
public AService aService;
public void setaService(AService aService) {
this.aService = aService;
}
}
public class SpringApp {
public static void main(String[] args) {
// 1. ioc容器在创建的时候所有的单例对象是不是会被创建
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
// // 对例子情况 当你在调用的时候才获取
AService aSerivce = applicationContext.getBean("AService", AService.class);
BService bSerivce = applicationContext.getBean("BService", BService.class);
aSerivce.setbService(bSerivce);
bSerivce.setaService(aSerivce);
// 循环引用异常 找不到对象
/**
* 思考问题?如果我们的项目对象必须要是多例?而且必须要循环引用 明确的指定引用那个对象
*/
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println(beanDefinitionNames[i]);
}
SpringBean循环依赖三级缓存概念
思考问题:单例对象在什么时候创建?
在IOC容器被创建的时候创建
多例的情况下,是在getbean()调用的情况下创建。多例对象每次用完就会去销毁掉。
SpringBean Aservice对象被创建流程步骤源码分析
AnnotationConfigApplicationContext applicationCo