栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

一、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;
  }
}
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号