目录
一、@Autowired和@Resource简介
二、@Autowired和@Resource的区别
三、@Autowired和@Resource的正确使用姿势
正文开始
一、@Autowired和@Resource简介
@Autowired、@Resource 可以对成员变量、方法或构造函数进行标注,来完成自动装配的工作。
二、@Autowired和@Resource的区别
1. @Autowired 默认按类型装配(这个注解是属于spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如@Autowired(required=false) ,如果我们想使用名称装配可以结合 @Qualifier 注解进行使用,如下:
@Autowired(required = false)
@Qualifier("baseDao")
private BaseDao baseDao;
- @Autowired 实现:
2. @Resource 默认按照名称进行装配 (JDK1.6开始支持的注解)。名称可以通过name属性进行指定。也提供按照byType 注入。
@Resource(name = "baseDao")
private BaseDao baseDao;
@Resource(type = BaseDao.class)
private BaseDao baseDao2;
- @Resource装配顺序
3. @Autowired 和 @Resource 作用域不同
三、@Autowired和@Resource的正确使用姿势
在日常工作中,我们使用Idea写代码的时候,看到之前的项目中显示有warning的提示,去看了下,是如下代码
@Autowired
private JdbcTemplate jdbcTemplate;
提示的警告信息
这段是Spring工作组的建议,大致翻译一下:
如图
Field注入警告
注入方式
- 基于构造函数的依赖注入
public class UserServiceImpl implents UserService{
private UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao){
this.userDao = userDao;
}
}
- 基于Setter的依赖注入
public class UserServiceImpl implents UserService{
private UserDao userDao;
@Autowired
public setUserDao(UserDao userDao){
this.userDao = userDao;
}
}
- 基于字段的依赖注入
public class UserServiceImpl implents UserService{
@Autowired
private UserDao userDao;
}
基于字段的依赖注入方式会在Idea当中吃到黄牌警告,但是这种使用方式使用的也最广泛,因为简洁方便.您甚至可以在一些Spring指南中看到这种注入方法,尽管在文档中不建议这样做.(有点执法犯法的感觉)
如图
基于字段的依赖注入缺点
- 对于有final修饰的变量不好使
- 掩盖单一职责的设计思想
当你看到这个类的构造方法那么多参数的时候,你自然而然的会想一下:这个类是不是违反了单一职责思想?.但是使用基于字段的依赖注入不会让你察觉,你会很沉浸在@Autowired当中
public class VerifyServiceImpl implents VerifyService{
private AccountService accountService;
private UserService userService;
private IDService idService;
private RoleService roleService;
private PermissionService permissionService;
private EnterpriseService enterpriseService;
private EmployeeService employService;
private TaskService taskService;
private RedisService redisService;
private MQService mqService;
public SystemLogDto(AccountService accountService,
UserService userService,
IDService idService,
RoleService roleService,
PermissionService permissionService,
EnterpriseService enterpriseService,
EmployeeService employService,
TaskService taskService,
RedisService redisService,
MQService mqService) {
this.accountService = accountService;
this.userService = userService;
this.idService = idService;
this.roleService = roleService;
this.permissionService = permissionService;
this.enterpriseService = enterpriseService;
this.employService = employService;
this.taskService = taskService;
this.redisService = redisService;
this.mqService = mqService;
}
}
- 与Spring的IOC机制紧密耦合
- 隐藏依赖性
- 无法对注入的属性进行安检
结论
相关文章链接:
https://www.jianshu.com/p/872440c92e8a
https://segmentfault.com/a/1190000021713094
https://mp.weixin.qq.com/s/Ba_AVEcyWEp6skMwxQ-x5A