2

Bean内の@Autowiredに問題があります。簡略化されたコード構造を投稿しました。@Configurationで注釈が付けられた2つのクラスと2つの単純な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などの注釈を付ける必要があります。春の豆だけが自動配線の影響を受けやすくなります。

于 2013-01-31T14:08:51.033 に答える
0

クラスを2番目に分析してみましょうB。そのクラスでは、Springを使用せずに、クラスのインスタンスを手動で作成したのと同じように、doFoo()実行したメソッドを呼び出します。メソッドを直接呼び出したのは、パットしたのと同じです。春で作成したい場合は、クラスにこれを追加してください:d().doBar();Dd()new D().doBar()DB

@Autowired
private D d;

doFoo()メソッドを次のように変更します。

d.doBar();

あなたの質問の重要な部分は次のとおりです。

そしてそれをBに自動配線しましたすべてがうまく機能します

これも答えです。

于 2013-01-31T14:51:54.457 に答える