Spring 中注入 Bean 的方式保举

打印 上一主题 下一主题

主题 1890|帖子 1890|积分 5670

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 Spring 中,注入 Bean 的方式有多种,每种方式适用于不同的场景。一样平常来说,可以选择以下几种注入方式:构造器注入setter 注入字段注入(即使用 @Autowired)以及基于注解的注入(如 @Qualifier)。每种方式都有其优缺点,下面是对每种方式的分析,并给出保举的最佳实践。
1. 构造器注入(保举方式)

构造器注入是通过构造函数来注入依靠的方式,它是最为保举的注入方式,具有以下优点:


  • 明确依靠关系:构造器注入可以强制所有必需的依靠在对象创建时就被注入,这有助于制止对象处于不完整状态(即未注入依靠的状态)。
  • 更轻易举行单位测试:构造器注入可以确保依靠在创建时就被注入,因此在举行单位测试时,可以轻松地将依靠注入到构造函数中,便于举行 Mock。
  • 不可变性:通过构造器注入,依靠关系通常是不可变的,有助于进步对象的稳固性。
  1. @Component
  2. public class MyService {
  3.     private final MyRepository myRepository;
  4.     @Autowired
  5.     public MyService(MyRepository myRepository) {
  6.         this.myRepository = myRepository;
  7.     }
  8.     public void serve() {
  9.         System.out.println("Service using " + myRepository);
  10.     }
  11. }
复制代码
总结


  • 优点:强制依靠注入,确保对象在创建时完整,适合需要确保所有依靠的场景。
  • 保举使用:对于所有必需的依靠,优先使用构造器注入。
2. Setter 注入(次选)

Setter 注入是通过 setter 方法来注入依靠。Spring 会在 Bean 创建后调用 setter 方法来注入依靠。


  • 机动性:可以选择性地注入某些依靠。
  • 不强制依靠:与构造器注入不同,setter 注入是可选的,不强制所有依靠都必须被注入,可能会导致依靠项没有被注入,从而导致潜在的 NullPointerException。
  • 适用于可选依靠:对于那些可以不注入的依靠,使用 setter 注入较为符合。
  1. @Component
  2. public class MyService {
  3.     private MyRepository myRepository;
  4.     @Autowired
  5.     public void setMyRepository(MyRepository myRepository) {
  6.         this.myRepository = myRepository;
  7.     }
  8.     public void serve() {
  9.         System.out.println("Service using " + myRepository);
  10.     }
  11. }
复制代码
总结


  • 优点:机动性较高,适用于那些依靠关系可选的场景。
  • 保举使用:对于可选的依靠,使用 setter 注入。
3. 字段注入(不保举,除非必须)

字段注入是通过直接在字段上使用 @Autowired 注解来注入依靠。Spring 会在创建 Bean 时直接注入字段。这种方式简朴,但也有一些明显的缺点。


  • 不易测试:字段注入直接操纵类的字段,无法通过构造器或 setter 举行手动注入,导致在单位测试中难以模拟依靠。
  • 不可控性:字段注入导致依靠关系不明确,不能像构造器注入那样保证对象创建时一定处于完整状态。
  • 不保举使用:字段注入不如构造器和 setter 注入明确和清晰,通常不保举在应用程序中使用。
  1. @Component
  2. public class MyService {
  3.     @Autowired
  4.     private MyRepository myRepository;
  5.     public void serve() {
  6.         System.out.println("Service using " + myRepository);
  7.     }
  8. }
复制代码
总结


  • 优点:代码简洁,易于实现。
  • 缺点:不适合严格要求测试和依靠明确的场景。
  • 保举使用:尽量制止使用,除非你对注入的依靠非常宽松,且不介怀难以举行单位测试。
4. 使用 @Qualifier 区分多个同类型 Bean

当有多个雷同类型的 Bean 时,Spring 可能无法确定注入哪一个。此时可以使用 @Qualifier 来明确指定注入的 Bean。


  • 常见应用:适用于同类型但功能不同的多个 Bean,比方有多个 DataSource 或多个服务实现类。
  • 制止冲突:使用 @Qualifier 可以明确指明应该注入哪一个 Bean,制止 Spring 抛出 NoUniqueBeanDefinitionException 非常。
  1. @Component
  2. @Qualifier("myService1")
  3. public class MyService1 implements MyService {
  4.     public void serve() {
  5.         System.out.println("Service 1");
  6.     }
  7. }
  8. @Component
  9. @Qualifier("myService2")
  10. public class MyService2 implements MyService {
  11.     public void serve() {
  12.         System.out.println("Service 2");
  13.     }
  14. }
  15. @Component
  16. public class Consumer {
  17.     private final MyService myService;
  18.     @Autowired
  19.     public Consumer(@Qualifier("myService1") MyService myService) {
  20.         this.myService = myService;
  21.     }
  22.     public void serve() {
  23.         myService.serve();
  24.     }
  25. }
复制代码
总结


  • 优点:办理了同类型 Bean 注入冲突的问题。
  • 保举使用:在同类型 Bean 存在时,通过 @Qualifier 来制止冲突。
结论



  • 首选:构造器注入,因为它提供了强依靠、清晰的依靠关系、便于测试且更具可维护性。
  • 次选:Setter 注入,适合可选依靠的场景,但在生产环境中通常照旧偏好构造器注入。
  • 制止使用:字段注入,因为它减少了依靠关系的明确性,且测试起来不方便。
总的来说,尽量在 Spring 中使用 构造器注入,只有在特别情况下(如依靠关系是可选的)才使用 setter 注入

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表