「ナゲッツ・セーリングプログラム」に参加しています
まず第一に、私のタイトルが虚偽、誇張、消耗の疑いがあることを認めず、本題に直行します。
最初に下から: 我们在类上使用 Lombok的@RequiredArgsConstructor 注解来替代类中的多处@Autowired和@Resource
.
依存性注入
Spring での 3 種類の依存性注入を確認しましょう。
- プロパティ注入
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 の存在が見つからないなどの明らかな欠点があります。
- コンストラクター注入
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.
代わりにプロパティ注入を使用
- セッター注入
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)的方式,直接通过构造器的方式来完成注入,不仅能够省略简化许多代码,也解决了属性注入可能存在的空指针问题。