Spring學習之裝配
建立應用對象之間協作關系的行為通常稱為裝配(wiring),也是DI的本質。
三種裝配機制
- 在XML中進行顯式配置;
- 在Java中進行顯式配置;
- 隐式的bean發現機制和自動裝配;
自動裝配
-
1. 元件掃描:
@component 注解為元件(可以用@Named(“beanID”)替代,但是建議使用前者,更直覺的表明是做什麼的)
@componentScan注解啟用了元件掃描
可以使用值設定掃描的基礎包:
#1. 直接給定包名:
@componentScan(“system”)
@componentScan(basePackages=“system”)
@componentScan(basePackages=({“system”,‘video’})
#2. 指定為包中所含的類或者接口(推薦建一個空的接口作為定位,避免因代碼重構,移動了相關類而導緻掃描出問題)
@componentScan(basePackageClasses=({“position.class”,“test.class”})
2. 自動裝配:
@Autowired(required=false)
required=false表示如果沒有比對的bean就不裝配,但是需要注意在代碼中進行null 檢查,否則抛出NullPointerException
通過Java代碼裝配
-
盡管自動裝配式最推薦的,但有時不得不用顯示裝配,例如引用第三方元件,
JavaConfig_相較于XML更強大,類型安全,對重構友好。
應與業務邏輯代碼分開,避免侵入業務代碼
-
@Configuration注解
标注于類上,标明這個類是一個注解類
-
聲明bean
@Bean注解
标注于方法上,标明這個方法傳回一個對象,該對象為sprin應用上下文中的bean,方法體傳回最終産生bean執行個體的邏輯
裝配bean
引用建立bean的方法
-
@Bean
public A a()
{return new A(b());}
看起來是通過調用b()方法得到b,實際上spring會攔截調用,并直接傳回該方法所建立的bean,而不是每次都調用。
使用構造器方法裝備
-
@Bean
public A a(b)
{return new A(b);}
XML裝配
-
聲明bean
< bean id=“id” class=“package.A” />
裝配bean
< constructor-arg>元素
< bean id=“id” class=“package.A” >
< constructor-arg ref=“b” />
< /bean>
構造器注入:
非引用類型如String等值類型,使用value取代ref
可以使用list和set裝配數組,差別是set會去掉重複值
屬性注入:
使用property
使用Spring3.0所引入的c-命名空間
< bean id=“id” class=“package.A” >
< c:cd-ref=“b” />
< /bean>
不能裝配數組