1

私は現在、次のようなフィールドを持つ多数のクラスを持っています

private MyStuff myStuff = new MyStuff();

すべてのクラスが使用する MyStuff シングルトンがあれば望ましいでしょう。私たちのプロジェクトには、いくつかの Bean を含む MyConfiguration クラスがありますが、少なくとも直接的には使用されていないように見えるため、例として使用することはできません。MyConfiguration クラスで MyStuff Bean を作成し、それを他のクラスに注入するように依頼されました。

私がこれまでに持っているもの:

@Configuration
public class MyConfiguration
{
    @Bean
    public MyStuff myStuff() 
    {
        return new MyStuff();
    }
}

public SomeClass 
{
    public void dealWithStuff()
    {
        someStuff.myMethod();
    }
    @Autowired
    private MyStuff someStuff;
}

これはコンパイルされますが、実行されません。myMethod() を呼び出そうとすると、someStuff が null になります。どうやら、Bean が表示されないか、接続されていません。私は何が欠けていますか?

4

3 に答える 3

1

私は仮定を立てるつもりなので、間違っている場合は訂正してください。あなたはSomeClass自分自身のインスタンスを作成しています。何かのようなもの

SomeClass someInstance = new SomeClass();

Spring コンポーネントの外側。

この場合、Spring は処理すらしていないため、Spring が何かを注入することをどのように期待しますか。

Spring に、他の Bean を注入する必要があるオブジェクト (Bean) を作成させる必要があります。

于 2013-09-15T21:14:06.157 に答える
0

コードでわかるように、オブジェクト参照名は「someStuff」ですが、myStuff を参照しているため、someStuff.myMethod(); を使用する必要があります。

于 2013-09-14T02:53:52.263 に答える
0

問題はネーミングです。完全な説明についてはthisを参照してください。

If you intend to express annotation-driven injection by name, do not primarily use @Autowired, even if is technically capable of referring to a bean name through @Qualifier values. Instead, use the JSR-250 @Resource annotation, which is semantically defined to identify a specific target component by its unique name, with the declared type being irrelevant for the matching process.

これは、次のようなことを行う必要があることを意味します。

@Resource(name="myStuff")
public void setSomeStuff(MyStuff someStuff){
    this.someStuff = someStuff;
}

その理由は、Bean を として定義しmyStuffたが、 として参照しているためsomeStuffです。

また、シングルトン インスタンスを作成するには、次のように、Spring 構成でそのスコープをシングルトンとして定義するだけです。

@Configuration
public class MyConfiguration
{
    @Bean @Scope(BeanDefinition.SCOPE_SINGLETON)
    public MyStuff myStuff() 
    {
        return new MyStuff();
    }
}
于 2013-09-14T04:15:01.907 に答える