質問
@Component アノテーションが付けられたクラスでは、@Resource または @Autowired アノテーションが使用されます。そうすると、依存関係の注入が失敗します。
これは、Spring がそれらをロードする順序が異なるためです。@Component アノテーションを使用して Bean を Spring コンテナにインスタンス化する場合、@Autowired がこの Bean 内にあるため、この時点では @Autowired は自動ロードを完了していないため、挿入されたサービスは null です
@Component と @Autowired または @Resource
Spring アプリケーションでは、 @Component アノテーションを使用して、クラスを自動的にスキャンできるコンポーネントとしてマークします。Spring コンテナが起動すると、 @Component アノテーションが付けられたクラスをスキャンし、それらを Bean にインスタンス化します。これらの Bean は、アプリケーションで使用するために Spring コンテナの Bean ファクトリに追加されます。
@Autowired アノテーションは、Spring アプリケーションでの依存関係の注入に使用されます。Spring コンテナが @Autowired アノテーションを持つ Bean を作成すると、注入に一致する型が自動的に検索されます。一致する型が複数見つかった場合は、例外がスローされます。
@Resource アノテーションは、Spring アプリケーションでの依存関係の注入にも使用できます。Spring コンテナが @Resource アノテーションを付けた Bean を作成する場合、インジェクションでは名前の一致が優先されます。一致する名前が見つからない場合は、タイプの一致が注入に使用されます。
したがって、Spring アプリケーションでは、@Component アノテーション付きクラスは、@Autowired または @Resource アノテーション付きクラスの前にロードされます。@Autowired アノテーションは依存関係注入の型マッチングを優先し、@Resource アノテーションは依存関係注入の名前マッチングを優先します。
依存関係注入に @Component、@Autowired、または @Resource アノテーションを使用する場合は、次の点にも注意する必要があります。
@Autowired アノテーションを使用して複数の一致するタイプを挿入する場合は、@Qualifier アノテーションを使用して特定の Bean 名を指定できます。
@Autowired または @Resource アノテーションを使用して不要な依存関係を挿入する場合は、@Autowired(required=false) または @Resource(required=false) を使用できます。
@Autowired または @Resource アノテーションを使用して挿入する依存関係が存在しない場合は、@Autowired(required=false) または @Resource(required=false) を使用してコード内で適切に処理できます。
@Autowired または @Resource アノテーションを使用して挿入された依存関係を null にしたい場合は、@Autowired(required=false) または @Resource(required=false) を使用して、コード内でそれに応じて処理できます。
@Autowired または @Resource アノテーションを使用して挿入された依存関係を null にしたい場合は、@Autowired(required=false) または @Resource(required=false) を使用して、コード内でそれに応じて処理できます。
解決
@Component
public class Test {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// @Autowired
// private UserServer userServer;
private static UserServer userServer;
@Autowired
public void setUserServer(UserServer userServer) {
Test.userServer = userServer;
}
}
@Autowired
メソッドにアノテーションを配置すると、クラスがロードされた後にこのメソッドのパラメータが自動的に挿入され、メソッドが 1 回実行されます。