Spring-Context之四:Spring容器及bean的定義

黃博文發表於2014-03-15

Spring框架的核心功能之一就是控制反轉(Inversion of Control, IoC),也叫做依賴注入(dependency injection, DI)。關於依賴注入的具體內容可以參見Martin Fowler寫的一篇文章《Inversion of Control Containers and the Dependency Injection pattern》

Spring容器介面是BeanFactory,其提供了一些方法來配置和管理物件。ApplicationContext是BeanFactory的子介面,它整合了Spring的AOP特性,資訊資源管理(用於全球化),公共事件等。簡單的說,BeanFactory提供了配置框架及基本的功能,而ApplicationContext增加了更多的企業級定製功能。比如其實現類WebApplicationContext可用於web應用程式中。

在Spring中,應用程式中受Spring IoC容器管理的物件叫做bean,即bean是一個由Spring IoC容器例項化、裝配及其它管理的物件。下圖是Spring IoC容器的一個簡單圖解。

Spring-Context之四:Spring容器及bean的定義

以下列出了幾個常用的實現了ApplicationContext的容器物件。

  • AnnotationConfigApplicationContext :接收註解的class作為輸入來初始化配置。

  • GenericGroovyApplicationContext: 根據Groovy DSL來初始化配置。

  • ClassPathXmlApplicationContext:根據當前classpath下的xml檔案初始化配置。

  • FileSystemXmlApplicationContext:根據檔案系統路徑下的xml檔案初始化配置。

Bean的定義有多種方式,XML定義,Annoation定義,Java程式碼直接定義,Groovy DSL定義等。之前例子基本都演示過這些定義方法。

一個簡單的XML定義是這樣的。

1
2
3
4
5
6
7
8
9
10
<?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
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="movieService" class="huangbowen.net.service.DefaultMovieService”/>

</beans>

其包含一個id和一個class。id是一個bean的唯一標示,同一個spring容器中不能有兩個id一樣的bean,不過你也可以給bean起別名,使用name屬性即可,多個別名可以用逗號,分號或空格分開。

1
<bean id="movieService" name="service1 service2" class="huangbowen.net.service.DefaultMovieService"/>
1
<bean id="movieService" name=“service1,service2" class="huangbowen.net.service.DefaultMovieService"/>
1
<bean id="movieService" name="service1;service2" class="huangbowen.net.service.DefaultMovieService"/>

也可以使用alisa來起別名。

1
2
3
<bean id="movieService" name="service1,service2" class="huangbowen.net.service.DefaultMovieService"/>

<alias name="movieService" alias="service3"/>

如果你的bean的例項不是通過建構函式直接生成的,而是通過工廠方法生成那,那麼也有相應的配置方法。

1
<bean id="defaultMovieService" class="huangbowen.net.service.MovieServiceFactory" factory-method="GetMovieService" />
MovieServiceFactory
1
2
3
4
5
6
7
8
9
10
package huangbowen.net.service;

public class MovieServiceFactory {

    private static DefaultMovieService defaultMovieService = new DefaultMovieService();

    public static MovieService GetMovieService() {
        return defaultMovieService;
    }
}

如果bean物件是由一個例項工廠生成的,那麼應該這樣配置。

1
2
3
    <bean id="serviceLocator" class="huangbowen.net.service.MovieServiceLocator"/>

    <bean id="instantMovieService" factory-bean="serviceLocator" factory-method="GetMovieService"/>
MovieServiceLocator
1
2
3
4
5
6
7
8
9
10
package huangbowen.net.service;

public class MovieServiceLocator {

    private static DefaultMovieService defaultMovieService = new DefaultMovieService();

    public MovieService GetMovieService() {
        return defaultMovieService;
    }
}

本例中的原始碼請在我的GitHub上自行下載。

相關文章