一、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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦