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。