Classpath掃描與組件管理: java
從Spring3.0開始,Spring JavaConfig項目提供了不少特性,包括使用java而不是xml定義bean,指的是註解 正則表達式
@Configuration,@Bean ,@Import ,@DependsOn spring
@Component是一個通用註解,可用於任何bean express
@Repository:一般用於註解DAO類,即持久層 this
@Service:一般用於註解Service類,即服務層 spa
@Controller:一般用於Controller類,即控制層MVC .net
元註解(Meta-annotations) 代理
元註解即註解的註解,許多Spring提供的註解能夠做爲本身的代碼,即"元數據註解",元註解是一個簡單的註解,能夠應用到另外一個註解 code
下列定義Service註解時,用@Component註解來修飾,@Service擁有@component註解的功能: component
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component // Spring will see this and treat @Service in the same way as @Component public @interface Service { // .... }
咱們也能夠本身定義註解.
類的自動檢測及Bean的註冊
Spring能夠自動檢測類並註冊Bean到ApplicationContext中.
例:@Service,@Component,@Repository要註冊到類上(類的註解),還有註冊在方法上的註解像@Autowired,這些註解能夠被自動檢測到的
註冊在類上的,則能夠做爲Bean自動註冊到ApplicationContext中去
爲了可以檢測這些類並註冊相應的Bean,須要在xml文件中配置下面內容:
<context:component-scan base-package="org.example" />
自動掃描org.example包下面的類
<context:component-scan>包含<context:annotation-config>,一般在使用前者後,就再也不使用後者.由於使用前者後,已經包含後者的所有功能.一般使用前者
使用過濾器進行自定義掃描
默認狀況下,類被自動發現並註冊bean的條件是:使用@Component,@Repository,@Service,@Controller註解或者使用@Component註解的自定義註解
能夠經過過濾器修改上面的行爲.
如:忽略全部的@Repository註解並用"Stub"代替
<beans> <context:component-scan base-package="org.example"> <context:include-filter type="regex" expression=".*Stub.*Repository" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" /> </context:component-scan> </beans>
type類型:annotation基於註解,assignable基於類或接口,aspectj基於aspectj,regex基於正則表達式,custom基於自定義
還可以使用use-default-filters="false"禁用自動發現與註冊定義Bean
掃描過程當中組件被自動檢測,那麼Bean名稱是由BeanNameGenerator生成的(@Component,@Repository,@Service,@Controller都會有個name屬性用於顯示設置Bean Name)
@Service("myMovieLister") public class SimpleMovieLister { // .... }
也能夠本身生成Bean名稱,Bean名稱爲類名的第一個字母小寫.
也能夠自定義bean命名策略,實現BeanNameGenetator接口,並必定要包含一個無參數構造器
<beans> <context:component-scan base-package="org.example" name-generator="org.example.MyNameGenerator" /> </beans>
在
name-generator="org.example.MyNameGenerator"指定命名規則的實現
做用域
可用註解@Scope來指明做用域
也能夠自定義scope策略,實現ScopeMetadataResolver接口並提供一個無參構造器
<beans> <context:component-scan base-package="org.example" scope-resolver="org.example.MyNameGenerator" /> </beans>
代理方式
可使用scoped-proxy屬性指定代理,有三個值可選:no,interfaces,targetClass
<beans> <context:component-scan base-package="org.example" scoped-proxy="interfaces" /> </beans>