1

Bean がここに登録されているとします。

@Configuration
public class configuration{

    @Bean(name = "MyClass")
    public MyClass getMyClass(@Value("avalue") final String s){
        return new MyClass(s);
        }
    }
}

そして、クラスには、以下のように内部でインスタンス化された別のクラスがあります (どちらにも注釈は必要ありませんか?)

public class MyClass{
    MyOtherClass myOtherClass;
    public MyClass(String s){
        this.myOtherClass = new MyOtherClass(s);
    }
}

public class MyOtherClass{
    String s;
    public MyOtherClass(String s){
        this.s = s;
    }
}

このメカニズムはどのように機能しますか?Bean インジェクション内で新しいインスタンスをインスタンス化することは安全ですか? そうすることの利点または欠点は何ですか?

MyOtherClass も Bean にして使用を避けるとしたら、これでよいでしょうか? (主に懸念事項: @Autowired と getMyclass() は適切な場所に配置されていますか、それとも冗長ですか?)

@Configuration
public class configuration{

    @Bean(name = "MyOtherClass")
    public MyOtherClass getMyOtherClass(@Value("avalue") final String s){
        return new MyOtherClass(s);
        }
    }

    @Bean(name = "MyClass")
    public MyClass getMyClass(MyClass myClass){
    //I was told the input should be myClass not myOtherClass,
    //and the return is myClass not new MyClass(myOtherClass);
    //since it's already autowired. Is that correct?
    //What if the configuration.java and MyClass.java are in different project?
        return myClass;
        }
    }
}

@Component
public class MyClass{
    MyOtherClass myOtherClass;

    @Autowired
    public MyClass(MyOtherClass myOtherClass){
        this.myOtherClass = myOtherClass;
    }
}

public class MyOtherClass{
    String s;
    public MyOtherClass(String s){
        this.s = s;
    }
}
4

2 に答える 2

1

Bean インジェクション内で新しいインスタンスをインスタンス化することは安全ですか?

はい。ただし、その新しいインスタンスは Spring によって管理されません。(当たり前だったらごめんなさい。)

しかし、おそらくもっと重要なことは、Spring とは関係なく、次のようにすることです。

public class MyClass{
    MyOtherClass myOtherClass;
    public MyClass(String s){
        this.myOtherClass = new MyOtherClass(s);
    }
}

をモックする簡単な方法がないため、単体テストは困難myOtherClassです。

Spring とはまだ関係ありませんが、単体テストを容易にするために IC を使用するようにリファクタリングします。

public class MyClass{
    private final MyOtherClass myOtherClass;
    public MyClass(MyOtherClass myOtherClass){
        this.myOtherClass = myOtherClass;
    }
}

そして、Spring Bean としてクラスを構成しますが、Bean としても持たないようにするには、MyOtherClass次のようにします。

@Configuration
public class Configuration{

    private MyOtherClass getMyOtherClass(final String s){
        return new MyOtherClass(s);
        }
    }

    @Bean(name = "MyClass")
    public MyClass getMyClass(@Value("avalue") final String s){
        return new MyClass(getMyOtherClass(s));
        }
    }
}

MyOtherClass@Component と @Autowire について投稿したものは機能しますが、Bean として公開することを避けたいように聞こえました。

于 2018-02-14T19:44:49.333 に答える