web-dev-qa-db-ja.com

AutowireアノテーションなしのSpring Inject

私はいくつかの答えを見つけます: https://stackoverflow.com/a/21218921/2754014 Dependency Injectionについて。 @Autowired@Inject@Resourceのような注釈はありません。この例のTwoInjectionStyles Bean(単純な<context:component-scan base-package="com.example" />を除く)にはXML構成がないと仮定します。

特定の注釈なしで注入することは正しいですか?

9
kuba44

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が注入されませんでした。

9

はい、例は正しいです(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は注入なしで一般的な方法で使用できます。

7
Alex Saunin