@Autowired 的使用規則:
- 容器中有該類型的候選Bean
- 容器中可以含有多個該類型的候選Bean
- Spring 3.x 之前Spring容器中只能有一個Bean; 多個Bean報異常BeanCreationException
- Spring 3.x以后,可以有多個Bean使用 @Autowired 時變量名一定要和該類型多個Bean 的其中一個相同(即上文中的@Autowired private Student student;,student 就是多個Bean中其中一個bean的id)
- 若違反第4條規則,會拋出 BeanCreationException 異常
如下,我們使用的Spring版本大於3.0。
實體類 Student
public class Student{ private String name; //getter and setter... }
有兩個bean
<bean id="student" class="com.autowiredtest.entity.Student"> <property name="name" value="小紅"/> </bean> <bean id="student02" class="com.autowiredtest.entity.Student"> <property name="name" value="小明"/> </bean>
我們在使用@Autowired自動裝配實例時可以這樣寫:
@Autowired private Student student;
或
@Autowired private Student student02;
因為Student 的兩個bean id分別為student和student02,恰好我們的變量名也叫student和student02,故不會報錯。假如變量名為stu沒有對應的bean id,那么就會在使用時拋出異常BeanCreationException。
而如果Spring 使用的版本低於3.0,那么,不允許一個類有多個Bean,即使變量的名稱和bean id相同。
如果非要有多個bean怎么辦呢?
此時,可以結合@Qualifier注解一起使用,@Qualifier注解的作用就是幫助Spring容器找到bean,使用時通過@Qualifier(name="beanid")的name屬性指明要使用哪個bean,所以Spring容器就知道去注入哪個具體的bean了。那么此時Spring容器里可以有這樣的存在:一個類多個bean。
@Qualifier的作用就是消除歧義,指明使用哪個bean。
@Autowired @Qualifier(name="student02") private Student stu;
這時候我們也可以使用@Resource注解實現同樣的功能
@Resource(name="student02") private Student stu;