2

我在 bean 中遇到了 @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();
    }
}

但这种方法不适合。

4

2 回答 2

0

D 类也应该用@Component 或类似的东西注释。只有 spring bean 容易受到自动装配的影响。

于 2013-01-31T14:08:51.033 回答
0

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

@Autowired
private D d;

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

d.doBar();

您问题的关键部分是:

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

这也是一个答案。

于 2013-01-31T14:51:54.457 回答