在学习写Service层的实现类时,发现直接在变量上注解 @Autowired 有个警告提示Field injection is not recommended 。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findAllById(int id) {
return userMapper.findAllById(id);
}
}
Field injection is not recommended
Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".
意思是说“变量依赖注入是不被建议的方式”。它建议“总是采用构造器注入的方式建立依赖注入”。
关于依赖注入一般有三种方式
#1#-> 变量注入(Field Injection)
@Autowired
private UserMapper userMapper;
#2#-> 构造器注入(Constructor Injection)
private UserMapper userMapper;
@Autowired
public UserServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
#3#-> setter方法注入 (Setter Injection)
private UserMapper userMapper;
@Autowired
public void setUserMapper(UserMapper userMapper){
this.userMapper = userMapper;
}
关于三种方式的优缺点,因为刚开始学习暂时没啥感觉,网上有很多资料分析得足够透彻了,先放在这里,以后有新的感悟再更新。
@Autowired的三种使用方式 https://www.cnblogs.com/wang-yaz/p/9340156.html
使用@Autowired注解警告Field injection is not recommended https://blog.csdn.net/zhangjingao/article/details/81094529
spring为何推荐使用构造器注入 https://www.jianshu.com/p/4694b1a82546
@Autowired的使用:推荐对构造函数进行注释 https://blog.csdn.net/hegongxu/article/details/78114437
结论
Spring3.0官方文档建议使用setter注入覆盖构造器注入。
Spring4.0官方文档建议使用构造器注入。
1-> 如果注入的属性是必选的属性,则通过构造器注入。
2-> 如果注入的属性是可选的属性,则通过setter方法注入。
3-> 至于field注入,不建议使用。