Spring IOC 容器的依賴注入工作可以分為兩個階段徒溪。第一個階段可以認(rèn)為是構(gòu)建和收集 Bean 定義的階段,在這個階段中纺且,我們可以通過 xml 或者 Java 代碼的方式定義一些 Bean剩晴,然后通過手動組裝或者讓容器基于某種規(guī)則自動掃描的形式曼振,將這些 Bean 定義收集到 IOC 容器中较木。下面是以XML配置的形式來注冊一些 Bean
<!-- 聲明一個 JavaBean -->
<bean id="foo" class="com.vincent.spring.Foo"/>
<!-- 聲明一個 JavaBean 并注入構(gòu)造參數(shù) -->
<bean id="dataSource" class="com.vincent.spring.DataSource">
<constructor-arg value="root"/>
<constructor-arg value="root"/>
</bean>
<!-- 指定參數(shù)名稱進(jìn)行裝配 -->
<bean id="dataSource" class="com.vincent.spring.DataSource">
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- 裝配構(gòu)造函數(shù)參數(shù)是 List 類型的 JavaBean -->
<bean id="foo" class="com.vincent.spring.Foo">
<constructor-arg>
<list>
<value>100</value>
<value>200</value>
<value>300</value>
</list>
</constructor-arg>
</bean>
<!-- 裝配構(gòu)造函數(shù)參數(shù)是 Set 類型的 JavaBean -->
<bean id="foo" class="com.vincent.spring.Foo">
<constructor-arg>
<set>
<value>100</value>
<value>200</value>
<value>300</value>
</set>
</constructor-arg>
</bean>
// 聲明一個組件
@Component
// 聲明一個組件并設(shè)置它的ID
@Component("foo")
// 自動裝配一個 JavaBean
@Resource
// 裝配指定ID的 JavaBean
@Resource("foo")
// 通過構(gòu)造函數(shù)裝配 JavaBean
public class Foo {
private Bar bar;
@Autowired
public Foo(Bar bar) {
this.bar = bar;
}
}
// 忽略沒有找到的 JavaBean红符,但是這樣做容易拋出 NPE
@Resource(required = false)
如果覺得逐個收集 Bean 定義麻煩,想批量的將 Bean 收集并注冊到容器之中伐债,我們也可以配置批量掃描注冊 Bean 的方式進(jìn)行预侯。下面分別是基于 XML 和 Java 配置的方式進(jìn)行批量注冊。
<!-- 掃描一個或多個制定包下的組件 -->
<!-- 與 Java 配置不同峰锁,使用 XML 配置必須指定掃描包的范圍 -->
<context:component-scan base-package="com.vincent.spring.framework.example"/>
// 自動掃描當(dāng)前包下的組件
@ComponentScan
// 掃描一個或多個制定包下的組件
@ComponentScan(basePackages = {
"com.vincent.spring.framework.example.web", "com.vincent.spring.framework.example.service"
})
// 掃描指定類所在的包
@ComponentScan(basePackageClasses = com.vincent.spring.framework.example.SpringContextConfig.class)
當(dāng) Bean 都已經(jīng)成功注冊到 IOC 容器中后萎馅,IOC 容器會分析這些 Bean 之間的依賴關(guān)系,根據(jù)他們之間的依賴關(guān)系先后組裝它們虹蒋。比如 IOC 容器發(fā)現(xiàn) JdbcCTemplate 這個 Bean 依賴于 dataSource校坑,它就會將這個 Bean 注入給依賴它的那個 Bean 直到所有的 Bean 都依賴注入完成拣技。至此,所有的 Bean 都組裝完成耍目。