参考慕课网spring入门篇
@Autowired对类成员变量、方法及构造函数进行标注,完成自动装配的工作。它是由BeanPostProcessor处理的,所以不能再自己的BeanPostProcessor或BeanFactoryPostProcessor类型应用这些注解,这些类型必须通过xml或者@Bean注解加载
一、注解setter方法
private AutoTest autoTest;
@Autowired
public void setAutoTest(AutoTest autotest) {
this.autoTest = autoTest;
}
二、注解构造器或成员变量
public class Test {
@Autowired
private AutoTest autoTest;
private SimpleTest simpleTest;
@Autowired
public Test(SimpleTest simpleTest) {
this.simpleTest = simpleTest;
}
}
注解成员变量与注解setter方法类似。
默认情况下,如果找不到合适的bean会导致autowiring识别抛出异常,可以通过 @Autowired(reuqired = false)
避免,每个类只能有一个构造器被标记为required = true。@Autowired的必要属性,可以使用@Required注解。
三、注解其他的解析依赖性接口
比如: BeanFactory, ApplicationContext, Environment, ResourceLoader, ApplicationEventPublisher, and MessageSource
public class MovieRecommender {
@Autowired
private ApplicatoinContext context;
// ...
}
四、注解数组和key为String的Map
注解给需要该类型的数组的字段或方法,以提供ApplicationContext中的所有特定类型的bean。
如果希望数组有序,可以让bean实现org.springframework.core.Ordered接口或使用@Order注解
@Component
public class BeanInvoker {
@Autowired
private List<BeanInterface> list;
@Autowired
private Map<String, BeanInterface> map;
五、@Autowired, @Qualifier和@Resource
如果一个接口有多个实现类,可以使用@Qualifier进行注解,如:
@Service
public class InjectionServiceImpl implements InjectionService {
// @Autowired
// @Qualifier("injectionDAOImpl1")
private InjectionDAO injectionDAO;
// @Autowired
// public InjectionServiceImpl(@Qualifier("injectionDAOImpl1") InjectionDAO injectionDAO) {
// this.injectionDAO = injectionDAO;
// }
@Autowired
public void setInjectionDAO(@Qualifier("injectionDAOImpl1") InjectionDAO injectionDAO) {
this.injectionDAO = injectionDAO;
}
- 对于按类型自动装配可能多个bean实例的情况,可以用@Qualifier缩小范围或指定唯一,也可以用于指定单独的构造器参数或方法参数,如上面代码。也可用于注解集合类型变量。
- 如果通过名字进行注解注入,主要使用的不是@Autowired + @Qualifier,而是使用@Resource注解。
- @Autowired适用于fields,constructor,multi-argument methods这些允许在参数级别使用@Qualifier缩小注解范围的情况;@Resource适用于成员变量、只有一个参数的setter方法情况
- 可以使用java文件和xml文件两种方式自定义@Qualifier