为了账号安全,请及时绑定邮箱和手机立即绑定

Spring为什么推荐使用构造器注入

标签:
Java
一、Spring常见的注入方式

1、field注入

@Controller
public class TestController {

  @Autowired
  private TestService testService;
  
}

2、构造器注入

@Controller
public class TestController {
  
  private final TestService testService;
  
  @Autowried
  public TestController(TestService testService) {
    this.testService = testService;
  }
}

3、setter注入

@Controller
public class TestController {
  
  private final TestService testService;
  
  @Autowired
  public void setTestService(TestService testService) {
    this.testService = testService;
  }
}
二、构造器注入的好处

构造器注入的方式,能够保证注入的依赖不可变,并确保需要的依赖不为空。此外,构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态

依赖不可变:定义的属性为声明为final。

依赖不为空:当要实例化Controller类的时候,由于自己实现了有参数的构造函数,所以不会调用默认的构造函数,那么久需要Spring容器传入所需要的参数,传入的参数存在两种情况:1、有该类型的参数->传入,OK。2、无该类型的参数->报错。 构造器注入保证不会为空。

完全初始化的状态:向构造器传参之前,要确保注入的内容不为空,那么肯定要调用依赖组件的构造方法完成实例化,而在Java类加载实例化的过程中,构造方法是最后一步(之前如果有父类先初始化父类,然后初始化成员变量,最后才是构造方法)。所以返回来的都是初始化之后的状态。

三、使用Field注入的弊端

1、对于IOC容器以外的环境,除了使用反射来提供它所需要的依赖外,无法复用该实现类。且在不调用的情况下,存在将无法发现NPE的隐患。

2、使用field注入可能导致循环依赖,即A里面注入B,B里面注入A。如果使用构造器注入,在spring项目启动的时候,就会抛出BeanCurrentlyInCreationException异常,从而提醒你避免循环依赖。如果使用field注入的话,启动的时候不会报错,在使用哪个bean的时候才会报错。

四、总结

使用构造器注入的好处:

1、保证依赖不可变(final关键字)

2、保证依赖不为空(省去代码检查)

3、保证返回调用的代码的时候是完全初始化的状态

4、避免了循环依赖

5、提升了代码的可复用性

五、集成Lombok
@Service
@RequiredArgsConstructor(onConstructor=@__(@Autowired))
public class TestService {
  private final TestMapper testMapper;
}

对应生成的代码:

@Service
@public class TestService {
  private final TestMapper testMapper;
  
  @Autowired
  public TestService(final TestMapper testMapper){
    this.testMapper = testMapper;
  }
}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消