私はいくつかの答えを見つけます: https://stackoverflow.com/a/21218921/2754014 Dependency Injectionについて。 @Autowired
、@Inject
、@Resource
のような注釈はありません。この例のTwoInjectionStyles
Bean(単純な<context:component-scan base-package="com.example" />
を除く)にはXML構成がないと仮定します。
特定の注釈なしで注入することは正しいですか?
Spring 4.3以降では、コンストラクター注入に注釈は必要ありません。
public class MovieRecommender {
private CustomerPreferenceDao customerPreferenceDao;
private MovieCatalog movieCatalog;
//@Autowired - no longer necessary
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
@Autowired
public setMovieCatalog(MovieCatalog movieCatalog) {
this.movieCatalog = movieCatalog;
}
}
ただし、セッター注入には@Autowired
が必要です。私は少し前にSpring Boot 1.5.7
を使用してチェックし(Spring 4.3.11
を使用)、@Autowired
を削除したときにBeanが注入されませんでした。
はい、例は正しいです(Spring 4.3リリース以降)。ドキュメント( this for ex)によると、Beanにsingleコンストラクタがある場合、@Autowired
アノテーションは省略。
しかし、いくつかのニュアンスがあります:
1。単一のコンストラクターが存在し、セッターが@Autowired
アノテーションでマークされている場合、コンストラクターとセッターの注入の両方が次々に実行されます。
@Component
public class TwoInjectionStyles {
private Foo foo;
public TwoInjectionStyles(Foo f) {
this.foo = f; //Called firstly
}
@Autowired
public void setFoo(Foo f) {
this.foo = f; //Called secondly
}
}
2。一方、@Autowire
がまったくない場合( example のように)、 f
よりもオブジェクトはコンストラクタを介して1回注入され、setterは注入なしで一般的な方法で使用できます。