“ 最近在研究大佬代码的时候,学到一种比较高大上的注入方式,今天我们就一起来看看”
众所周知 Spring Bean 的注入方式一般有三种:
1、构造器注入
2、Setter注入
3、基于注解的 @Autowired
自动装配(Field 注入)
其实在大部分人的开发过程中用的最多的应该都是 @Autowired 这种方式进行注入,因为这种方式比较简便,看起来也比较明了
但是官方是比较推荐我们使用 构造器 来进行注入,为什么不推荐我们使用自动装配的方法呢?
今天我们来看看对比一下这两种注入方式,看看到底该使用哪一种
01
—
@Autowired 注入
// Autowired注入public class Demo(){ @Autowired private DemoTest demoTest;}
优点
代码比较少,看起来简洁明了
新增依赖十分方便,不需要修改原有代码
注入简单,只需要使用
@Autowired
注解或者@Resource
注解
缺点
比较容易出现空指针异常,而且在编译时期是不会暴露出来,这就导致了空指针异常无法尽早的暴露出来
对单元测试不友好,如果使用 Field 注入,那么进行单元测试就需要初始化整个Spring 环境,会将所有 Bean 实例化
会出现循环依赖的隐患
// Autowired注入public class DemoTest(){ @Autowired private Demo demo;}
// Autowired注入public class Demo(){ @Autowired private DemoTest demoTest;}
容易破坏单一职责原则
02
—
构造器注入
public class Demo(){ // 用 final 修饰,遵从依赖不可变原则 priavate final DemoTest demoTest; public Demo(DemoTest demoTest){ this.demoTest = demoTest; }}
优点
解决了依赖循环的问题(spring 的三层缓存机制)
强依赖处理,在编译阶段就能暴露出问题
方便单元测试
可以明确的指出依赖关系
缺点
代码冗余,阅读不友好
但是这个缺点,我们可以通过 Lombok 来进行解决,只需要在类上增加注解 @AllArgsConstructor
@AllArgsConstructorpublic class Demo(){ // 用 final 修饰,遵从依赖不可变原则 priavate final DemoTest demoTest;}
相信看完上面的对比之后,你的心中已经有了选择。