spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
注解自动装配注意的点
@Autowired注入
1、同一类型实例可以使用@Autowired注入多次,并且所有注入的实例都是同一个实例;
2、当对接口进行注入时,应该为每个实现类指明相应的id,否则Spring将报错。
@Service("stu1")
接口Student的实现类1
@Service("stu2")
接口Student的实现类2
Spring就会根据字段名称默认去bean工厂找相应的bean进行注入,注意名称不能够随便取的,要和注入的属性名一致。或者使用名称装配可以结合@Qualifier注解进行使用。
@Autowired
private Student stu1;
或者
@Autowired
@Qualifier("stu1")
private Student stu;
如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)
@Autowired @Qualifie("userService") 是直接按照名字进行搜索,也就是说,对于UserServiceImpl 上面@Service注解必须
写名字,不写就会报错,而且名字必须是@Autowired @Qualifie("userService") 保持一致。
@Autowired/@Resource的异同
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入。Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
而如果你不用注解,用xml文件的时候,对于注入Bean的时候要求写一个id,xml文件时候的id就相当于这里的名字。
对于源码层面,bean实例化的时候,@Resource使用的是CommonAnnotationBeanPostProcessor后置处理器,而@Autowired使用的是AutowiredAnnotationBeanPostProcessor后置处理器
定义Bean的作用域和生命过程
@Scope("prototype")
值有:singleton,prototype,session,request,session,globalSession