Autowired
默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class)
如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找applicationContext.getBean("bookDao") @Qualifier("bookDao")
问题
对象的外部可见性
可能导致循环依赖
无法设置注入的对象为final,也无法注入静态变量
单实例组件依赖多实例组件,无法单例
@Qualifier 精确指定
在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用
构造器的注入
通过构造器的方式将Bean注入到字段中
构造器注入能够保证注入的组件不可变,并且确保需要的依赖不为空
这样就可以将变量设置为final,并且传递的肯定是一个对象,避免出现空指针异常
若是出现字段注入中循环依赖的问题,在项目启动时会非常形象的将错误跑出来
private final ResultUtils resultUtils;
@Autowired
public CommonResponseDataAdvice(final ResultUtils resultUtils) {
this.resultUtils = resultUtils;
}
另一种写法
@Component @RequiredArgsConstructor public class AccessFilter implements Filter { private final RestTemplate restTemplate; }
Setter的依赖注入
@Component
public class SetterBasedInjection {
private InjectedBean injectedBean;
// 可以去掉
@Autowired
public void setInjectedBean(InjectedBean injectedBean) {
this.injectedBean = injectedBean;
}
@Resource
默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。
public class LaController {
//按类型注入
@Resource(type=LaService.class)
private LaService laService;
}