继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

咻沐怵
关注TA
已关注
手记 1
粉丝 0
获赞 0
一、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;
  }
}
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP