Spring autowire在特定配置中不起作用

时间:2013-01-31 14:04:36

标签: java spring initialization javabeans autowired

我的内部@Autowired有问题。我发布了简化的代码结构。我有两个用@Configuration注释的类和两个简单​​的bean。在D类中,自动装配的bean不会注入。所以我想知道在不改变结构的情况下解决NPE是否可行?

A类:

@Configuration
public class A {

    @Autowired
    private B b;

    @Bean
    publict Other other() {
        b.doFoo();
        Other other = new Other();
    }

    @Bean
    public C c() {            
        return new C();
    }
}

B组:

@Configuration
public class B {

    @Bean
    public D d() {
        return new D();
    }

    public void doFoo() {
        d().doBar();
    }
}
C类内部结构无关紧要。所以D级:

public class D {

    @Autowired
    C c;

    public void doBar() {
        c.doFooBar(); // And here we got NPE
    }
}

我必须注意到,如果我将bean D的初始化从B移动到A并将其自动装配到B,一切正常:

@Configuration
public class A {

    @Autowired
    private B b;

    @Bean
    publict Other other() {
        b.doFoo();
        Other other = new Other()
    }

    @Bean
    public C c() {            
        return new C();
    }

    @Bean
    public D d() {
        return new D();
    }
}

@Configuration
public class B {

    @Autowired
    private D d;

    public void doFoo() {
        d.doBar();
    }
}

但这种方法并不合适。

2 个答案:

答案 0 :(得分:0)

D类也应该用@Component或类似的东西注释。只有春豆很容易自动装配。

答案 1 :(得分:0)

让我们分析第B课。在该类中,当您调用doFoo()方法时,您已执行d().doBar();,这就像您手动创建类D的实例一样,没有任何Spring。您直接调用d()方法,就像您推送new D().doBar()一样。如果您想使用spring创建D,请在课程B中添加此内容:

@Autowired
private D d;

并将您的方法doFoo()更改为:

d.doBar();

你问题的关键部分是:

  

并将其自动连接到B一切正常

这也是一个答案。