bean的自動裝配及初識註解開發
阿新 • • 發佈:2020-07-31
bean的自動裝配及初識註解開發
- 自動依賴是Spring滿足bean依賴的一種方式
- Spring會在上下文中自動尋找,並自動給bean裝配屬性
在Spring中有三種裝配方式:
- 在xml中顯示的配置
- 在java中顯示的裝配
- 隱式的自動裝配bean【重要】
測試
環境搭建:一個人有兩個寵物
1、建立實體類
Dog.java
public class Dog{
public void shout(){
System.out.println("wang~");
}
}
Cat.java
public class Cat{ public void shout(){ System.out.println("miao~"); } }
Human.java
public class Human { 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 "Address [cat=" + cat + ", dog=" + dog + ", name=" + name + "]"; } }
2、建立Spring容器
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="Cat" /> <bean id="dog" class="Dog" /> <bean id="human" class="Human"> <property name="name" value="張三" /> <property name="dog" ref="dog" /> <property name="cat" ref="cat" /> </bean> </beans>
3、例項化容器,獲取物件測試
public class MyTest {
public static void main(String[] args) {
//獲取上下文時就已經建立好了物件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//我們的物件現在都在Spring中的管理了,我們要使用,直按去裡面取出來就可以!
Human human = (Human) context.getBean("human");
human.getDog().shout();
human.getCat().shout();
}
4、優化:自動裝配
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="Cat" />
<bean id="dog" class="Dog" />
<!--
byName:會自動在容器上下文中找,和自己的物件Set方法後面的值對應的bean id
byType:會自動在容器上下文中找,和自己的物件型別屬性相同對應的bean id
-->
<bean id="human" class="Human" autowire="byName | byType">
<property name="name" value="張三" />
</bean>
</beans>
小結:
- byName 的時候,需要保證所有bean的id唯一 ,並且這個bean需 要和自動注入的屬性的set方法的值一致!
- byType 的時候,需要保證所有bean的class唯一,並且這個bean需要和自動注入的屬性的型別一致!
5、優化:使用註解自動裝配
jdk 1.5開始支援註解,Spring從2.5開始支援註解
-
要使用註解須知
-
匯入約束:context約束
-
配置註解的支援:開啟註解支援
<?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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 開啟註解支援 --> <context:annotation-config/> </beans>
-
5.1、配置檔案優化
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 開啟註解支援 -->
<context:annotation-config/>
<bean id="cat" class="Cat" />
<bean id="dog" class="Dog" />
<bean id="human" class="Human" />
</beans>
5.2、在實體類上使用註解
- @Autowired:自動裝配,可以直接寫在類屬性上或Set方法上
使用Autowired我們可以不用編寫Set方法了,前提是你這個自動裝配的屬性在IOC(Spring) 容器中存在,且符合型別byType!
public class Human {
//直接匯入,自動裝配
@Autowired
private Cat cat;
//如果顯示定義Autowired的required屬性為false, 說明這個物件可以為null, 否則不允許為null
@Autowired(required = false)
//指定裝配的值->> <bean id="dog222" class="Dog" />
@Qualifier(value="dog222")
private Dog dog;
private String name;
public Cat getCat() {
return cat;
}
@Autowired
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 "Address [cat=" + cat + ", dog=" + dog + ", name=" + name + "]";
}
}
總結:
如果@Autowired自動裝配的環境比較複雜,自動裝配無法通過一個註解[@Autowired]完成的時候、
我們可以使@Qualifier(value="xx")去配置@Autowired的使用,指定一個唯一的bean物件注入!
-
@Resource
public class Human { @Resource private Cat cat; @Resource(name="dog222") 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 "Address [cat=" + cat + ", dog=" + dog + ", name=" + name + "]"; } }
總結:@Resource 和 @Autowired 的區別:
- 都是用來自動裝配的,都可以放在屬性欄位上
- @Autowired 是通過 byType 來實現的,而且必須要求這個物件存在!也可以通過 @Qualifier(value="dog222") byName實現【常用】
- @Resource 預設通過 byName 的方式實現,如果找不到名字,則通過 byType 實現!如果兩個都找不到,則報錯!【常用】
- 執行順序不同:@Autowired 是通過 byType 來實現的,@Resource 預設通過 byName 的方式實現。