弹簧.使用java配置解析循环依赖关系,而不需要@Autowired

前端之家收集整理的这篇文章主要介绍了弹簧.使用java配置解析循环依赖关系,而不需要@Autowired前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有循环依赖和 java配置.虽然用xml配置解决它很简单,我无法解决它与java配置没有@Autowired.豆:
  1. public class A {
  2. private B b;
  3.  
  4. public B getB() {
  5. return b;
  6. }
  7.  
  8. public void setB(B b) {
  9. this.b = b;
  10. }
  11. }
  12.  
  13. public class B {
  14. private A a;
  15.  
  16. public A getA() {
  17. return a;
  18. }
  19.  
  20. public void setA(A a) {
  21. this.a = a;
  22. }
  23. }

我已经尝试过(我已经读过@Bean注释Spring不会调用方法,每次bean被引用,但在这种情况下,它实际上一直被调用):

  1. @Configuration
  2. public class Config {
  3. @Bean
  4. public A a() {
  5. A a = new A();
  6. a.setB(b());
  7. return a;
  8. }
  9.  
  10. @Bean
  11. public B b() {
  12. B b = new B();
  13. b.setA(a());
  14. return b;
  15. }
  16. }

而且,用@Autowired的配置类字段:

  1. @Configuration
  2. public class Config {
  3. @Autowired
  4. A a;
  5. @Autowired
  6. B b;
  7.  
  8. @Bean
  9. public A a() {
  10. A a = new A();
  11. a.setB(b);
  12. return a;
  13. }
  14.  
  15. @Bean
  16. public B b() {
  17. B b = new B();
  18. b.setA(a);
  19. return b;
  20. }
  21. }

此外,我已经尝试所有上述与@Lazy注释.没有帮助但是,如果我用@Autowired注释A和B的设置器,效果会很好.但这不是我现在想要的.我做错了什么,有没有办法解决循环依赖在java配置没有使用@Autowired?

解决方法

你想要得到的行为如下
  1. A a = new A();
  2. B b = new B();
  3. a.setB(b);
  4. b.setA(a);

@Bean方法不给你.他们运行完成以提供一个bean实例.

您基本上必须部分创建一个实例,然后在创建另一个实例时完成初始化.

  1. @Configuration
  2. class Config {
  3. @Bean
  4. public A a() {
  5. A a = new A();
  6. return a;
  7. }
  8.  
  9. @Bean
  10. public B b() {
  11. B b = new B();
  12. A a = a();
  13. b.setA(a);
  14. a.setB(b);
  15. return b;
  16. }
  17. }

要么

  1. @Bean
  2. public B b(A a) {
  3. B b = new B();
  4. b.setA(a);
  5. a.setB(b);
  6. return b;
  7. }

猜你在找的Java相关文章