Spring中Bean的定義及做用域的註解實現

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>
相關文章
相關標籤/搜索