Spring之Bean的註解自動裝配
阿新 • • 發佈:2021-02-04
前言
自動裝配是Spring滿足Bean依賴的一種方式。
XML自動裝配比起註解自動裝配還是比較繁瑣的,所以學習一下更簡便的註解自動裝配。
jdk1.5支援註解,spring2.5就支援註解了。
註解自動裝配須知:
- 匯入約束
- 配置註解的支援
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>
直接上demo:
貓類:
public class Cat {
public void shout(){
System.out.println("貓叫");
}
}
狗類:
public class Dog {
public void shout(){
System.out.println("狗叫");
}
}
人類:(一個人有一隻貓和一隻狗)
public class People { //一個人有一隻貓和一隻狗 private Cat cat; private Dog dog; private String name; public Cat getCat() { return cat; } public void setCat(Cat cat) { this.cat = cat; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "People{" + "cat=" + cat + ", dog=" + dog + ", name='" + name + '\'' + '}'; } }
beans.xml(註解自動裝配前)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="cn.Cat"></bean> <bean id="dog" class="cn.Dog"></bean> <!--byname:會自動在容器上下文中查詢,和自己物件set方法後面值對應的bean id --> <!--bytype:會自動在容器上下文中查詢,和自己物件屬性型別相同的bean --> <bean id="people" class="cn.People" autowire="byName"> <property name="name" value="詹大先生"></property> <property name="cat" ref="cat"></property> <property name="dog" ref="dog"></property> </bean> </beans>
測試類:
public class MyTest {
//主類 可以通過 psvm打出來 不用一個個程式碼去敲
public static void main(String[] args) {
//獲取Spring 的上下文物件
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
People people=context.getBean("people", People.class);
people.getCat().shout();
people.getDog().shout();
}
}
測試結果:
註解自動裝配後:
人類:(直接在實體類的屬性上加上@Autowired 即可。)
public class People {
//一個人有一隻貓和一隻狗
//註解自動裝配
@Autowired
private Cat cat;
@Autowired
private Dog dog;
private String name;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People{" +
"cat=" + cat +
", dog=" + dog +
", name='" + name + '\'' +
'}';
}
}
註解自動裝配 beans.xml(注意!這裡有很大的變化)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--註解支援-->
<context:annotation-config/>
<bean id="cat" class="cn.Cat"></bean>
<bean id="dog" class="cn.Dog"></bean>
<bean id="people" class="cn.People"></bean>
</beans>
測試結果:
@Resource
預設通過ByName的方式進行自動裝配(就是根據id來自動裝配)。
@Autowired 和 @Qualifier
假設我們要在beans.xml中再去新增一個id為dog666 型別為cn.Dog 的物件
<bean id="dog666" class="cn.Dog"></bean>
新增如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="cat" class="cn.Cat"></bean>
<bean id="dog" class="cn.Dog"></bean>
<bean id="dog666" class="cn.Dog"></bean>
<bean id="people" class="cn.People"></bean>
</beans>
此時存在2個class為cn.Dog的物件,那麼註解自動裝配單單用使 @Autowired 是不夠的。
我們就需要使用 @Autowired 和 @Qualifier搭配
//註解自動裝配
//使用 @Autowired 和 @Qualifier搭配
@Autowired
private Cat cat;
@Autowired
@Qualifier(value = "dog666")
private Dog dog;
那麼我們就可以知道,註解自動裝配預設先按照ByType方式裝配。(ByType方式:按照型別進行自動裝配)
看完如果對你有幫助,點贊支援!