spring提供了自動裝配(autowiring)和自動檢測(autodiscovery)用來減小XML的配置數量。spring
自動裝配bean屬性mvc
示例:ui
import com.springinaction.springdol.Instrumentalist; public class Instrumentalist{ private String song; private Object instrument; }
<bean id="instrument" class="com.springinaction.springidol.Saxophone"/> <bean id="kenny" class="com.springinaction.springdol.Instrumentalist" autowire="byName"> <property name="song" value="Jingle Bells"/> </bean>
使用註解裝配this
從spring 2.5開始,最有趣的一種裝配spring Bean的方式是使用註解自動裝配Bean屬性。spring容器默認禁用註解裝配。因此在使用基於註解的自動裝配前,咱們須要在spring配置中啓用它。最簡單的啓用方式是使用spring的context命名空間配置中的<context:annotation-config>元素。spa
<?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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config/> <!--bean declarations go here--> </beans>
這樣配置,<context:annotation-config>元素告訴spring咱們打算使用基於註解的自動裝配。一旦配置完成,咱們能夠對代碼添加註解。spring3支持以下幾種註解:code
@Autowired public void setInstrument(Instrument instrument){ this.instrument = instrument; }
這樣就能夠移除對instrument經過屬性<property>在XML中的裝配了。component
另外還能夠使用@Autowired註解直接標註屬性,並刪除setting方法:xml
@Autowired private Instrument instrument;
而且@Autowired不會受限於private關鍵字,仍然能夠被自動裝配。默認狀況下,@Autowired具備強契約特徵,若是沒有Bean能夠裝配到@Autowired所標註的屬性或參數中,自動裝配就會失敗,在這種狀況下,能夠經過設置@Autowired的required屬性爲false來配置自動裝配是可選的。blog
@Autowired(require=false) private Instrument instrument;
當有多個Bean知足裝配條件時,也會拋出異常,爲了確保咱們須要的Bean被裝配,要使用@qualifier註解。it
@Autowired @qualifier("guitar") private Instrument instrument;
如上,@qualifier註解將嘗試注入ID爲guitar的Bean。
自動檢測Bean
爲了配置spring自動檢測,須要使用<context:component-scan>元素代替<context:annotation-config>:
<?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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.springinaction.springidol"> </context:component-scan> <!--bean declarations go here--> </beans>
<context:component-scan>元素會掃描指定的包及其全部子包,並查找出可以自動註冊爲spring Bean的類。base-package屬性標識了<context:component-scan>元素全部的包。