Java で @Component を使用した後に @Resource または @Autowired を使用する場合の注入失敗の問題の解決策

質問


@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 回実行されます。

おすすめ

転載: blog.csdn.net/Angel_asp/article/details/132405392