https://blog.youkuaiyun.com/hellojava6666/article/details/147977634
https://zhuanlan.zhihu.com/p/25466474643
https://www.cnblogs.com/lcxz8686TL/p/17288504.html
在之前开发Spring项目的时候,基本都会使用@Autowired 注解来注入各种需要的Bean,尤其是在service中经常会注入各种dao或者mapper,类里面开头部分有很大的空间都是用来定义各种@Autowired 注解引入的Bean对象。
在最近的看到很多Spring项目,都逐渐地看不到@Autowired 注解的身影,取而代之的是@RequiredArgsConstructor类注解加上final定义的Bean的方式实现依赖注入。而这也是推荐的构造器注入的方式,可以减少繁杂的@Autowired注解标注。
一.Spring的三种注入方式
分别是——属性注入、setter 注入、构造器注入
-
构造器注入 :利用构造方法的参数注入依赖
-
Setter注入 :调用Setter的方法注入依赖
-
字段注入 :在字段上使用
@Autowired/Resource注解
1.属性注入
这种方式是最常用的,可以使用 @Autowired 或者是 @Resource 进行注入,需要在每个Bean上都加上注解。
@Component
public class MyComponent {
@Autowired
private MyService myService;
}
2.setter注入
@Controller
public class DemoController {
private DemoService demoService;
@Autowired
public void setDemoService(DemoService demoService) {
this.demoService = demoService;
}
}
3.构造器注入
这也是目前最推荐的注入方式,根据Spring的特性,Spring的构造器注入时不需要添加@Autowired 注解。
@Component
public class RedisIdWorker {
private StringRedisTemplate stringRedisTemplate;
public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
}
}
二.Lombok的构造器注解
Lombok 提供了如 @RequiredArgsConstructor 或 @AllArgsConstructor 来自动生成构造函数,并使用 Lombok 的 @NonNull 注解来确保字段在构造时被初始化。
- @NoArgsConstructor:生成无参构造函数,适用于JPA实体类等场景。
- @AllArgsConstructor:生成包含所有字段的构造函数,可能暴露未初始化的非final字段。
- @RequiredArgsConstructor: 为类中所有
final修饰的字段或带有@NonNull注解的字段生成构造函数。
三.Spring依赖注入的优化写法
前面提到Spring可以通过构造器注入依赖,而Lombok可以自动生成类的构造函数,那么将两者结合就可以实现简洁的依赖注入写法。
@RequiredArgsConstructor类注解会为类中所有final修饰的字段生成构造函数,而Spring就可以使用该构造函数在不使用@Autowird注解的情况下自动注入所有依赖,从而简化代码编写。
典型的场景就是Controller层或Service层需要注入多个Mapper/Service接口时,减少冗余的@Autowired注解。
@Component
@RequiredArgsConstructor
public class MyComponent {
private final MyService myService;
private final MyMapper myMapper;
}
四.推荐使用构造器注入的原因
在上文中,经过优化后的依赖注入从代码上看更加清晰简洁,当然简化代码只是其中一个原因。
近年来,Spring团队已经将构造函数注入作为处理依赖注入的首选方法,逐渐放弃使用@Autowired进行依赖注入,原因如下:
1.使用@Autowired注入的问题
- 隐藏的依赖:当@Autowired应用于字段时,依赖项是在幕后注入的,这可能导致隐藏的依赖关系。这种做法使得很难了解一个类需要哪些资源才能正常工作,从而增加了测试和调试的难度。
- 不便于不可变性:字段注入允许依赖项是可变的,这使得类在以后更容易修改它们。这降低了组件的不可变性,可能导致难以追踪的bug。
-
测试困难:依赖于字段注入的组件测试起来比较棘手。由于依赖项不是通过构造函数传递的,测试时需要手动模拟或注入这些字段,这会增加不必要的样板代码。
2.构造器注入的优点
- 强制要求依赖项:构造函数注入要求在创建类实例时提供所有必需的依赖项。这确保了类在创建时始终处于有效状态,所有必要的依赖项都已设置。
- 不可变性:构造函数注入鼓励使用
final字段,这强制执行不可变性。一旦依赖项被注入,它就不能被更改,从而减少了意外修改和代码bug的风险。 - 提高测试性:使用构造函数注入测试组件更加容易。在测试中,您可以直接将模拟的依赖项传递到构造函数中,而不需要依赖Spring的内部自动装配。
1532

被折叠的 条评论
为什么被折叠?



