Bean裝配方式詳解
spring裝配bean的三種方式:
- 在XML中進行顯示裝配
- 在XML中進行顯示裝配在Java中進行顯示裝配
- 在XML中進行顯示裝配隱式的Bean發現和裝配機制
一、自動化裝配Bean
Spring從兩個角度實現自動化裝配:
- 元件掃描(ComponentScan)):spring會自動發現spring應用上下文中所建立的Bean
- 自動裝配(Autowried):Spring自動滿足Bean之間的依賴
第一方面:從元件掃描的角度
- Spring會自動發現應用上下文所建立的bean
建立介面:
public interface CompactDisc{
void play();
}
建立類:
@Component
public class SgtPeppers implements CompactDisc{
public void play(){
Ststem.out.println("Hello world!");
}
}
解釋:@Component這個註解表示該類會作為元件類,並告知Spring要為這個類建立bean,但是元件掃描預設是不開啟的,我們需要顯示的配置一下Spring
建立配置類:
@ComponentScan
@Configuration
public class CDPlayerConfig{
}
解釋:@ComponentScan會在Spring啟用元件掃描,預設掃描與配置類相同的包,可以設定掃描的包,查詢帶有@Component註解的類
@Configuration表明這是一個配置類
通過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:component-scan base-package="com" /
</beans>
注意:如果你的應用程式中,所有的物件都是獨立的,彼此之間沒有任何依賴,那麼使用元件掃描就可以,但是很多物件會依賴其他的物件完成任務,這樣我們就需要一種方法將元件掃描的到的bean和他們的依賴裝配在一起,所以要了解一下自動裝配
第二方面:從自動裝配方面
通過為bean添加註解實現自動裝配,我們可以藉助@Autowried註解
通過自動裝配,將一個CompactDisc注入到CDPlayer中
@Component
public class CDPlayer implements MediaPlayer{
private CompactDisc cd;
@Autowried
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
public void play(){
cd.play();
}
}
@Autowried不僅可以用在構造器上,還可以用在屬性的setter方法上,比如CDPlayer有一個setCompactDisc方法,可以採用如下的形式實現自動化裝配
@Autowried
public void setCompactDisc(CompactDisc cd){
this.cd = cd;
}
解釋:在Spring初始化bean後,他會盡可能去滿足bean的依賴,在本例中,依賴是通過帶有@Autowried註解的方法宣告的。
不管是構造器,Setter方法還是其他的方法,Spring都會嘗試滿足方法引數上所宣告的依賴,假如只有一個bean匹配依賴的話,那麼這個bean就會被匹配進來
如果沒有匹配的bean,那麼在應用上下文建立的時候,Spring會丟擲一個異常,為了避免這種異常,可以將@Autowried的required屬性值設定為false
二、使用java顯示建立Bean
儘管在很多情況下使用元件掃描和自動裝配實現Spring的自動化配置是更為推薦的方式,但是有時候這種方案行不通,因此需要明確配置Spring,比如將第三方外掛裝配到你的應用中去,是沒有辦法在他的類上新增@Component和@Autowired註解的,因此必須採用顯示裝配的方法。
在顯示裝配的時候,javaConfig是更好的方案,因為它更為強大,型別安全,並且對重構友好。通常將JavaConfig程式碼放在單獨的包中,使它與其他應用程式邏輯分離開來。
第一步:建立配置類
建立配置類的關鍵在於為其新增@Configuration註解,此註解表明這個類是一個配置類,該類包含在spring應用上下文中如何建立bean的細節.
@Configuration
public class CDPlayConfig{
}
第二步:宣告簡單的bean
@Bean註解會告訴Spring這個方法會返回一個物件,該物件要註冊為Spring應用上下文中的Bean.
預設情況下Bean的ID與帶@Bean註解的方法名是一樣的,也可以通過name屬性指定一個名字
下面的程式碼返回了所需型別的例項,聲明瞭CompactDisc bean:
@Configuration
public class CDPlayConfig{
//Bean(name="123")
//SgtPeppers繼承CompactDisc介面
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();//返回此類的一個例項
}
}
第三步:藉助javaConfig實現依賴注入
將CompactDisc bean 注入到CDPlayer bean中
構造器注入:
@Configuration
public class CDPlayConfig{
//Bean(name="123")
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();//返回此類的一個例項
}
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppsers());
}
//或者使用下面這種方法:
/*
當Spring呼叫cdPalyer() 建立CDPlayer bean的時候,他會自動裝配一個CompactDisc到配置方法中
public CDPlayer cdPlayer(CompactDisc compactDisc){
return new CDPlayer(compactDisc);
}
*/
}
Setter方法注入
@Configuration
public class CDPlayConfig{
@bean
public CDplayer cdPlayer(CompactDisc compactDisc){
CDPlayer cdPlayer = new CDPlayer(compactDisc);
cdPlayer.setCompactDisc(compactDisc);
return cdPlayer;
}
}
三、使用XML顯示配置Bean
spring最初,XML是最主要的配置方式,在XML中建立Bean需要使用<bean>元素
<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!--配置bean-->
<bean class="com.Hello"/>
這是最簡單的XML方式的Bean宣告,僅僅指定了該Bean屬於的類,Bean的命名規則為全限定類名來命名,該Bean的名稱為“com.Hello#0”,其中“#0”是一個計數,從0開始
也可以使用id屬性來命名
<bean id="hello" class="com.Hello"/>
一般我們對需要引用的Bean指定名稱,對不需要引用的,採用自動命名即可
採用XML配置Bean的缺點:在這個簡單的Bean宣告中,我們將Bean的型別以字串的形式設定在了class屬性中,但是不能保證class屬性的值是真正的型別。
藉助構造器注入初始化Bean
1. 元素:附加檔案:https://blog.csdn.net/qq_41357573/article/details/844457432.使用spring3.0所應用的c:名稱空間 在使用之前,必須在頂部宣告其模式
xmlns:c="http://www.springframework.org/schema/c"
......
<bean id="hello" class="com.Hello" c:cd-ref="test">
<!--test為一個bean引用,而不是字面量-->
<!--只有一個構造器引數的時候,可以不使用表示引數-->
<bean id="hello" class="com.Hello" c:_-ref="test">
將字面量注入到構造器中
使用c:名稱空間
<bean id="hello" class="com.Hello" c:cd-ref="test"
c:_name="yq"
c:_age=""23/>
<!--也可以使用下面這種方式,通過引數索引裝配相同字面量-->
<bean id="hello" class="com.Hello" c:cd-ref="test"
c:_0="yq"
c:_1=""23/>
<!--如果只有一個構造器引數的話-->
<bean id="hello" class="com.Hello" c:cd-ref="test"
c:_="yq"/>
裝配集合
類:
......
//包含值
public people(String name;string age;List<String>kills){
this.name = name;
this.age = age;
thsi.kills = kills;
}
XML配置:
<!--首先使用List將其宣告為一個列表-->
<bean id="people" class="類路徑"
<constructor-arg value="yq"/>
<constructor-arg value="23"/>
<constructor-arg>
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</constructor-arg>
</bean>
實現bean引用列表的裝配:
<bean id="people" class="類路徑"
<constructor-arg value="yq"/>
<constructor-arg value="23"/>
<constructor-arg>
<list>
<ref bean="a"/>
<ref bean="b"/>
<ref bean="c"/>
</list>
</constructor-arg>
</bean>
總結: 上述三種裝配技術非常有用,但是在便利性方面,最強大的還是Spring的自動化裝配置,自動化裝配分為兩個方面,一個方面是當所有的物件之間沒有依賴時,所需要的僅是元件掃描而已,元件掃描分為java配置和XMl配置。另一方面,當物件會依賴其他物件才能完成任務時,這時就需要自動裝配。