まだ @Autowired と @Resource を使用していますか?

「ナゲッツ・セーリングプログラム」に参加しています

まず第一に、私のタイトルが虚偽、誇張、消耗の疑いがあることを認めず、本題に直行します。

最初に下から: 我们在类上使用 Lombok的@RequiredArgsConstructor 注解来替代类中的多处@Autowired和@Resource.

依存性注入

Spring での 3 種類の依存性注入を確認しましょう。

  1. プロパティ注入
public class SysUserController extends BaseController {
    @Autowired
    private ISysUserService userService;

    @Resource
    private ISysRoleService roleService;
}
复制代码

@Autowired はデフォルトで型でアセンブルされ、@Resource はデフォルトで名前でアセンブルされ、名前に一致する Bean が見つからない場合は型でアセンブルされます。

また、@Qualifier は Autowired と組み合わせて使用​​して Bean の名前を指定し、名前でアセンブルすることもできます。

IDEA の変数で @Autowired を直接使用すると、警告が表示されます: Field injection is not recommended.

その理由は、コンストラクター注入メソッドを使用することが公式に推奨されているためです。これには、注入されたオブジェクトを final で変更できない、NullPointException の存在が見つからないなどの明らかな欠点があります。

  1. コンストラクター注入
public class SysUserController extends BaseController {

    private final ISysUserService userService;

    private final ISysRoleService roleService;

    public SysUserController(ISysUserService userService, ISysRoleService roleService) {
        this.userService = userService;
        this.roleService = roleService;
    }
}
复制代码

コンストラクターの依存性注入は、クラスのコンストラクターをトリガーするコンテナーによって実装され、指定された依存性注入を強制してクラスの操作を保証し、NullPointerException.

この場合、メンバー プロパティを final キーワードで変更できるだけでなく、さらに重要なことに、循環依存関係を回避できるため、Spring はコンストラクター インジェクションの使用を公式に推奨しています. 循環依存関係がある場合、Spring プロジェクトの開始時にエラーが報告されます。 .

なぜそれを解決するのではなく、避けるのですか?

因为构造器注入是通过构造方法来生成对象,其必须要先获取属性,才能生成调用构造方法进行实例化,这种情况的循环依赖是无法解决的。

A と B の 2 つの相互依存オブジェクト インジェクション メソッドが異なる場合に、Spring が循環依存を解決できるかどうかを写真で確認してみましょう。

循環依存を解決するためのコンストラクター注入:
1. コード リファクタリング2. @Lazy
アノテーション3.
代わりにプロパティ注入を使用

  1. セッター注入
public class SysUserController extends BaseController {
    
    private ISysUserService userService;

    @Autowired
    public void setUserService(ISysUserService userService) {
        this.userService = userService;
    }
}
复制代码

Setter インジェクションを使用する場合は、追加@Autowiredまたは@Resource注釈を付ける必要があることに注意してください。そうしないと、インジェクションが成功しません。

もう 1 つ注意すべき点は、プロパティ インジェクションもセッター インジェクション変数もfinalキーワードで変更できないことです。

@RequiredArgsConstructor

这里可能会有人说不推荐使用Lombok,只要我们知其然且知其所以然,那他就是一个帮助我们快速开发的好工具。

在说完Spring的三种依赖注入后,我们来认识一下Lombok的@RequiredArgsConstructor 注解。

在Lombok中,生成构造方法的注解一共有三个,分别是@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsContructor,我们这里只介绍@RequiredArgsConstructor。

@Controller
@RequiredArgsConstructor
public class SysUserController extends BaseController {

    private final ISysUserService userService;

    private ISysRoleService roleService;

   //----------------------------
}
复制代码

使用@RequiredArgsConstructor会为我们生成一个包含常量、使用final关键字修饰的变量私有构造方法

那我们就可以不使用属性注入(@Autowired和@Resource)的方式,直接通过构造器的方式来完成注入,不仅能够省略简化许多代码,也解决了属性注入可能存在的空指针问题。

おすすめ

転載: juejin.im/post/7146035741234036744