1. 程式人生 > >Bean基於註解的配置

Bean基於註解的配置

下面是一個使用註解定義一個DAO的Bean:

import org.springframework.stereotype.Component;

@Component("bookDao")
public class BookDao {
}

它相當於:

<bean id="bookDao" class="com.dao.bookDao" />

@Component可以被Spring容器識別,自動的將該pojo轉換為容器管理的Bean.
除了@Component外,Spring還定義了三個功能和@Component一樣的註解,分別對DAO,Service及Web層的Controller進行註解:

@Repository:用於對DAO實現類進行註解
@Service:用於對Service實現類進行註解
@Controller:用於對Controller實現類進行註解

這些雖然功能和@Component相同,但可以標識特定的bean,方便認出該bean的實際作用。

掃描註解定義的Bean

Spring提供了一個context名稱空間,它提供了掃描類包以應用註解定義Bean的方式,如下程式碼:

<context:component-scan base-package="com.libiary.dao" />

Spring會掃描這個包下的所有類,並從註解中獲取Bean的定義資訊。

如果希望掃描特定的類,而不是整個包,那麼可以使用resource-pattern屬性過濾出特定的類:

<context:component-scan base-package="com.library" 
resource-pattern="books/*.class" />

這裡將resource-pattern設定為books/*.class,Spring僅會掃描這個com.library.books子包中的類。

不過你可能需要更多的需求,比如僅需掃描實現某個特定類的類等。
這種可以通過context:component-scan及其過濾子類實現:

<context
:component-scan base-package="com.smart"> <context:include-filter type="regex" expression="com\.smart\.anno.*" /> <context:exclude-filter type="aspectj" expression="com.smart..*Controller+" /> </context:component-scan>

context:include-filter 表示要包含的過濾類。
context:exclude-filter表示要排除的目標類。

可以有若干個context:exclude-filter和context:exclude-filter。這兩個過濾元素支援多種型別的過濾表示式。
支援的型別如下:

1、type=annotation,如
org.springframework.stereotype.Component;
org.springframework.stereotype.Controller;
org.springframework.stereotype.Repository;
org.springframework.stereotype.Service;
將對目標類是否標註了某個註解進行過濾。

2、type=assignable,如com.library.XxxService。
表示所有繼承或擴充套件XxxService的類,將對目標類是否繼承或擴充套件了某個特定類進行過濾

3、type=aspectj,過濾器掃描與指定的AspectJ表示式所匹配的那些類。

4、type=regex,過濾器掃描類的名稱指定的正則表示式所匹配的那些類。

5、type=custom,該類必須實現org.springframework.core.type.TypeFilter介面。

在所有這些過濾型別中,除了custom型別外,aspectj的過濾表達能力最強。

context:component-scan還有一個use-default-filters屬性,預設是true,表示預設會對上面提到的四種註解都進行掃描。如果僅需要掃描@Controller的Bean,必須將這個屬性設為false。

所以,context:component-scan先根據exclude-filter列出不需要掃描的,再通過include-filter列出需要掃描的,再根據use-default-filters的值是否掃描特定註解的類。

以上是bean的註解配置,以及掃描註解定義的Bean。