ヒントを見ただけで、@Autowiredコメントの認知が再び更新されました

3516 ワード

@Autowiredと@Resourceはいずれも依存注入を実現するために使用できるが,前者はSpringが提供し,後者はJDK(JSR-250規格)が持参したものである.アリJava開発仕様では@Resourceが推奨されています.しかし、多くの人は、なぜそうなのか、コードのヒント情報さえ見ていない可能性があります.
この2つの注釈の機能、運用シーン、違いを徹底的に理解してみましょう.
IDEのヒント
プロジェクトで@Autowiredを使用して注入する場合は、次のコードに従います.
@RestController
public class InjectController {
    @Autowired
    private ConnectService connectService;
}


次のようなヒントが表示されます.
Field injection is not recommended 
Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".


Springチームは、「常にbeanでコンストラクション関数ベースの依存項目注入を使用します.常に強制依存項目に対して断言を使用します」と提案しています.
ヒントに基づいて、注入方法を書き直します.
@RestController
public class InjectController {

    private ConnectService connectService;

    @Autowired
    public void setConnectService(ConnectService connectService) {
        this.connectService = connectService;
    }
}


@Autowiredの注記をsetterメソッドに使用しましたが、プロンプトが消えました.もう一つの注入方法を見てみましょう.
@RestController
public class InjectController {

    private ConnectService connectService;

    @Autowired
    public InjectController(ConnectService connectService) {
        this.connectService = connectService;
    }
}


この方法では、Springチームの推奨事項と一致して、@Autowiredの注記を構築方法に使用します.この場合、警告メッセージは表示されません.
つまり、IDEプロンプトの情報は、@Autowired注釈を使用することをお勧めしないわけではありません.フィールド(Field)に直接使用しないでください.
Spring注入の仕方とシーン
Springの一般的なDI方式:コンストラクタ注入、Setter注入、フィールド注入.明らかに、私たちがよく使う方法は公式に最も推奨されていない.
上記の3つの注入方式が適用されるシーンも異なる:1、コンストラクタ注入適用は強い依存と不変性の依存を持つ;2、Setter注入はオプション性と可変性を有する依存注入に適用される.3、Field注入、できるだけ使用しないで、必要なら@Resourceを使って代替して、結合性を下げる.
Field注入の欠点
Field注入の欠点は明らかである.たとえば、コンストラクタ注入のように可変のオブジェクトを注入することができず、外部に見えない(コンストラクタとSetterが見え、privateの属性が見えない)ことに依存すると、コンポーネントがIoCコンテナ(Springなど)と密接に結合し、ユニットテストもIoCコンテナを使用する必要がある.依存が多すぎる場合の相対コンストラクタ注入は、依存が多すぎることを明らかに示すことはできない(単一の職責原則に違反する).
フィールドにこんなに多くの欠点が注入されている以上、なぜみんなは慣れているのだろうか.主な原因:便利すぎて、コードを大幅に削減しました.また、ほとんどのビジネスでは、コンストラクタで強くバインドする必要はなく、IoCコンテナを交換する可能性も極めて低い.だから、公式やIDEは強調して注意していますが、プログラマーの使用を阻止していないようです.
@Autowiredにのみ警告する理由
最も主要な理由は,@AutowiredがSpringによって提供され,特定のIoCによって提供される特定の注釈であり,フレームワークと強いバインドが形成されており,他のIoCフレームワークと交換すると注入をサポートできないためである.@ResourceはJSR-250で提供されています.IoC容器は互換性があり、容器を交換しても正常に動作します.
また,この2つの注釈の動作メカニズムにも関係する可能性がある.デフォルトでは@Autowiredはタイプ(ByType)で、@Resourceは名前(ByName)で一致します.つまり、コンテナに同じタイプのBeanが2つ存在する場合、@Autowired注入を使用するとエラーが発生し、@Resourceを使用するとより正確になります.もちろん@Autowiredでは名前を指定することもできます(@Qualifier注記も必要です).
@Autowiredおよび@Resource機能
Springでは、カスタム@Autowired注記だけでなく、@Resource、@PostConstruct、@PreDestroyのJSR-250仕様で定義された注記もいくつかサポートされています.
一方、@Autowiredと@Resourceの機能はほぼ一致しており、@Resourceの役割は@Autowiredに相当しますが、@AutowiredのデフォルトはbyTypeで自動的に注入され、@ResourceのデフォルトはbyNameで自動的に注入されます.
@Resourceには、nameとtypeの2つのコア属性があります.Spring@Resource注記のname属性をbeanの名前に、type属性をbeanのタイプに解析します.デフォルトでは、byName自動注入ポリシーは反射メカニズムによって使用されます.
@Resourceアセンブリシーン:
  • 1、nameとtypeを同時に指定した場合、Springコンテキストから唯一一致するbeanを見つけて組み立てるが、見つからない場合は異常を投げ出す.
  • 2、nameが指定されている場合は名称に従って組み立てるが、見つからない場合は異常を投げ出す.
  • 3、typeが指定されている場合、タイプに応じて組み立てられ、複数が見つからないか、見つからないか、異常が投げ出されます.
  • 4、何も指定されていない(デフォルト)場合はbyName方式でアセンブリされ、一致していない場合は元のタイプに戻ってマッチングされます.

  • 小結
    コードに対する潔癖さがあり、@Autowiredのヒント情報に慣れていないため、プロジェクト全体で@Resource注釈の使用を強くお勧めします.このヒントの底の原理を理解すれば、自分に最適な注入形式を選ぶことができるかもしれません.
    作者:プログラム新視野原文リンク:https://hello.blog.csdn.net/article/details/111307184