<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0

    spring 注釋功相當(dāng)于

    以前在spring的配置文件的bean頭中加入了:

    default-autowire="byName"

    default-autowire="byType"

     

    Spring 通過一個 BeanPostProcessor@Autowired 進(jìn)行解析,所以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。

     

    @Autowired  默讓是byType

    它可以注釋到方法,也可以注釋到成員域:

    如下兩種:

    1、

    package com.web.userManagser.action;
    import org.springframework.beans.factory.annotation.Autowired;
    import com.web.userManagser.services.UserManagerService;
    public class UserManagerAction {
    @Autowired
    private UserManagerService userManagerService;
    public void sayHello(){
    this.userManagerService.sayHello();
    }
    }

     2、

    package com.web.userManagser.action;
    import org.springframework.beans.factory.annotation.Autowired;
    import com.web.userManagser.services.UserManagerService;
    public class UserManagerAction {
    private UserManagerService userManagerService;
    public void sayHello(){
    this.userManagerService.sayHello();
    }
    public UserManagerService getUserManagerService() {
    return userManagerService;
    }
    @Autowired
    public void setUserManagerService(UserManagerService userManagerService) {
    this.userManagerService = userManagerService;
    }
    }
    

     

     

    當(dāng)候選 Bean 數(shù)目不為1個時個時的應(yīng)對方法

    1、bean 數(shù)目為0個時:

     

    也就是spring 找不到一個匹配的bean, spring 就會拋出BeanCreationException 異常

     

    如上述的情況怎么解決呢。如果想讓spring 找不到bean 不報錯那么你在注釋的時候可以如下的注釋方法:

    @Autowired(required = false)

    當(dāng)然,一般情況下,使用 @Autowired 的地方都是需要注入 Bean 的,使用了自動注入而又允許不注入的情況一般僅會在開發(fā)期或測試期碰到(如為了快速啟動 Spring 容器,僅引入一些模塊的 Spring 配置文件),所以 @Autowired(required = false) 會很少用到。

     

     

    2、bean 數(shù)目不只一個,而是多個時呢?

    如果我們在spring 中配置了兩個相同的類型時,而我們的注釋又同時是通過byType時

    那么spring 就會出錯,它不知道哪個bean 是它要的。

    那么我們就可以將@Qualifier 和@Autowired 一起用

     

    用的同時就是把自動配置的方式從byType 轉(zhuǎn)向 byName,

    如下使用:

     

    配置文件中有:

    <bean id="userManagerService" class="com.web.userManagser.services.UserManagerService"/>
    <bean id="userManagerAction" class="com.web.userManagser.action.UserManagerAction"/>
    <bean id="userManagerAction1" class="com.web.userManagser.action.UserManagerAction"/>
    

     

     

    此時我們就可以:

    public class UserManagerAction {
    @Autowired
    @Qualifier("userManagerService")
    private UserManagerService userManagerService;
    public void sayHello(){
    this.userManagerService.sayHello();
    }
    }
    

     

    @Qualifier 只能和 @Autowired 結(jié)合使用,是對 @Autowired 有益的補(bǔ)充。一般來講,@Qualifier 對方法簽名中入?yún)⑦M(jìn)行注釋會降低代碼的可讀性,而對成員變量注釋則相對好一些。

     

     

     我們還可以用使用 JSR-250 的注釋

     

    要讓 JSR-250 的注釋生效,除了在 Bean 類中標(biāo)注這些注釋外,還需要在 Spring 容器中注冊一個負(fù)責(zé)處理這些注釋的 BeanPostProcessor

    <?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-2.5.xsd">
    <!-- 該 BeanPostProcessor 將自動起作用,對標(biāo)注 @Autowired 的 Bean 進(jìn)行自動注入 -->
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
    <!-- 該 BeanPostProcessor 將自動起作用,對標(biāo)注的 @Resource、@PostConstruct 以及 @PreDestroy-->
    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
    
    <!-- 移除 boss Bean 的屬性注入配置的信息 -->
    <bean id="userManagerService" class="com.web.userManagser.services.UserManagerService"/>
    <bean id="userManagerService1" class="com.web.userManagser.services.UserManagerService"/>
    <bean id="userManagerAction" class="com.web.userManagser.action.UserManagerAction"/>
    </beans>
    

     

     

    @Resource、@PostConstruct 以及 @PreDestroy。

     

     1、@Resource 有兩個屬性。

      name spring 將它解釋成bean的名字

      type spring 將它解釋成bean 的類型

     

    如果我們定義了name那么spring 就使用byName 方式注入

    如果我們定義了type 那么spring 就用byTyte方式注入

    如果兩者都沒有定義那么就默為byName

     

    @PostConstruct 和 @PreDestroy

     

    這兩個注釋定義在方法上,

    被@PostConstruct 注釋的方法,bean 被實例化后調(diào)用的。

    而被@PreDestroy 注釋的方法,bean 被銷毀時調(diào)用的。

    public class UserManagerAction {
    @Resource(name="userManagerService")
    private UserManagerService userManagerService;
    public void sayHello(){
    this.userManagerService.sayHello();
    }
    @PostConstruct
    public void ct(){
    System.out.println("ct");
    }
    @PreDestroy
    public void pro(){
    System.out.println("ct");
    }
    }

     

     

    我們知道,不管是通過實現(xiàn) InitializingBean/DisposableBean 接口,還是通過 <bean> 元素的 init-method/destroy-method 屬性進(jìn)行配置,都只能為 Bean 指定一個初始化 / 銷毀的方法。但是使用 @PostConstruct@PreDestroy 注釋卻可以指定多個初始化 / 銷毀方法,那些被標(biāo)注 @PostConstruct@PreDestroy 注釋的方法都會在初始化 / 銷毀時被執(zhí)行。

     

     

     

    使用 <context:annotation-config/> 簡化配置

     

    Spring 2.1 添加了一個新的 context 的 Schema 命名空間,該命名空間對注釋驅(qū)動、屬性文件引入、加載期織入等功能提供了便捷的配置。我們知道注釋本身是不會做任何事情的,它僅提供元數(shù)據(jù)信息。要使元數(shù)據(jù)信息真正起作用,必須讓負(fù)責(zé)處理這些元數(shù)據(jù)的處理器工作起來。

    而我們前面所介紹的 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor 就是處理這些注釋元數(shù)據(jù)的處理器。但是直接在 Spring 配置文件中定義這些 Bean 顯得比較笨拙。Spring 為我們提供了一種方便的注冊這些 BeanPostProcessor 的方式,這就是 <context:annotation-config/>。

     

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">
     <context:annotation-config/>
    <bean id="userManagerService" class="com.web.userManagser.services.UserManagerService"/>
    <bean id="userManagerAction" class="com.web.userManagser.action.UserManagerAction"/>
    </beans>
    

     

    <context:annotationconfig/> 將隱式地向 Spring 容器注冊 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor 以及 equiredAnnotationBeanPostProcessor 這 4 個 BeanPostProcessor。

    在配置文件中使用 context 命名空間之前,必須在 <beans> 元素中聲明 context 命名空間。

     

     

     

    使用 @Component

    雖然我們可以通過 @Autowired@Resource 在 Bean 類中使用自動注入功能,但是 Bean 還是在 XML 文件中通過 <bean> 進(jìn)行定義 —— 也就是說,在 XML 配置文件中定義 Bean,通過 @Autowired@Resource 為 Bean 的成員變量、方法入?yún)⒒驑?gòu)造函數(shù)入?yún)⑻峁┳詣幼⑷氲墓δ堋D芊褚餐ㄟ^注釋定義 Bean,從 XML 配置文件中完全移除 Bean 定義的配置呢?答案是肯定的,我們通過 Spring 2.5 提供的 @Component 注釋就可以達(dá)到這個目標(biāo)了。

     

    下面,我們完全使用注釋定義 Bean 并完成 Bean 之間裝配:

    package com.web.userManagser.services;
    import org.springframework.stereotype.Component;
    @Component
    public class UserManagerService {
    public void sayHello(){
    System.out.println("fuck you!");
    }
    }

     

    @Component("userManagerAction")
    public class UserManagerAction {
    @Resource(name="userManagerService")
    private UserManagerService userManagerService;
    public void sayHello(){
    this.userManagerService.sayHello();
    }
    }
    

     

    @Component 有一個可選的入?yún)ⅲ糜谥付?Bean 的名稱,在 Boss 中,我們就將 Bean 名稱定義為“boss”。一般情況下,Bean 都是 singleton 的,需要注入 Bean 的地方僅需要通過 byType 策略就可以自動注入了,所以大可不必指定 Bean 的名稱。

    在使用 @Component 注釋后,Spring 容器必須啟用類掃描機(jī)制以啟用注釋驅(qū)動 Bean 定義和注釋驅(qū)動 Bean 自動注入的策略。Spring 2.5 對 context 命名空間進(jìn)行了擴(kuò)展,提供了這一功能,請看下面的配置:

     

     

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <context:component-scan base-package="com.web"/>
    </beans>
    

     

     

    這里,所有通過 <bean> 元素定義 Bean 的配置內(nèi)容已經(jīng)被移除,僅需要添加一行 <context:component-scan/> 配置就解決所有問題了——Spring XML 配置文件得到了極致的簡化(當(dāng)然配置元數(shù)據(jù)還是需要的,只不過以注釋形式存在罷了)。<context:component-scan/> 的 base-package 屬性指定了需要掃描的類包,類包及其遞歸子包中所有的類都會被處理。

     

    <context:component-scan/> 還允許定義過濾器將基包下的某些類納入或排除。Spring 支持以下 4 種類型的過濾方式,通過下表說明:


    表 1. 掃描過濾方式

    過濾器類型 說明
    注釋 假如 com.baobaotao.SomeAnnotation 是一個注釋類,我們可以將使用該注釋的類過濾出來。
    類名指定 通過全限定類名進(jìn)行過濾,如您可以指定將 com.baobaotao.Boss 納入掃描,而將 com.baobaotao.Car 排除在外。
    正則表達(dá)式 通過正則表達(dá)式定義過濾的類,如下所示: com\.baobaotao\.Default.*
    AspectJ 表達(dá)式 通過 AspectJ 表達(dá)式定義過濾的類,如下所示: com. baobaotao..*Service+

    下面是一個簡單的例子:

     

    <context:component-scan base-package="com.web">
                 <context:include-filter type="aspectj" expression="com.web..action..*"/>
                </context:component-scan>
                

     

    值得注意的是 <context:component-scan/> 配置項不但啟用了對類包進(jìn)行掃描以實施注釋驅(qū)動 Bean 定義的功能,同時還啟用了注釋驅(qū)動自動注入的功能(即還隱式地在內(nèi)部注冊了 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor),因此當(dāng)使用 <context:component-scan/> 后,就可以將 <context:annotation-config/> 移除了。

    通過 @Scope 指定 Bean 的作用范圍

                  
    package com.baobaotao;
    import org.springframework.context.annotation.Scope;

    @Scope("prototype")
    @Component("boss")
    public class Boss {
        …
    }

    這樣,當(dāng)從 Spring 容器中獲取 boss Bean 時,每次返回的都是新的實例了。

     

     

     

    采用具有特殊語義的注釋

    Spring 2.5 中除了提供 @Component 注釋外,還定義了幾個擁有特殊語義的注釋,它們分別是:@Repository、@Service@Controller。在目前的 Spring 版本中,這 3 個注釋和 @Component 是等效的,但是從注釋類的命名上,很容易看出這 3 個注釋分別和持久層、業(yè)務(wù)層和控制層(Web 層)相對應(yīng)。雖然目前這 3 個注釋和 @Component 相比沒有什么新意,但 Spring 將在以后的版本中為它們添加特殊的功能。所以,如果 Web 應(yīng)用程序采用了經(jīng)典的三層分層結(jié)構(gòu)的話,最好在持久層、業(yè)務(wù)層和控制層分別采用 @Repository、@Service@Controller 對分層中的類進(jìn)行注釋,而用 @Component 對那些比較中立的類進(jìn)行注釋。

     

     

     

    注釋配置和 XML 配置的適用場合

    是否有了這些 IOC 注釋,我們就可以完全摒除原來 XML 配置的方式呢?答案是否定的。有以下幾點原因:

    • 注釋配置不一定在先天上優(yōu)于 XML 配置。如果 Bean 的依賴關(guān)系是固定的,(如 Service 使用了哪幾個 DAO 類),這種配置信息不會在部署時發(fā)生調(diào)整,那么注釋配置優(yōu)于 XML 配置;反之如果這種依賴關(guān)系會在部署時發(fā)生調(diào)整,XML 配置顯然又優(yōu)于注釋配置,因為注釋是對 Java 源代碼的調(diào)整,您需要重新改寫源代碼并重新編譯才可以實施調(diào)整。
    • 如果 Bean 不是自己編寫的類(如 JdbcTemplate、SessionFactoryBean 等),注釋配置將無法實施,此時 XML 配置是唯一可用的方式。
    • 注釋配置往往是類級別的,而 XML 配置則可以表現(xiàn)得更加靈活。比如相比于 @Transaction 事務(wù)注釋,使用 aop/tx 命名空間的事務(wù)配置更加靈活和簡單。

    所以在實現(xiàn)應(yīng)用中,我們往往需要同時使用注釋配置和 XML 配置,對于類級別且不會發(fā)生變動的配置可以優(yōu)先考慮注釋配置;而對于那些第三方類以及容易發(fā)生調(diào)整的配置則應(yīng)優(yōu)先考慮使用 XML 配置。Spring 會在具體實施 Bean 創(chuàng)建和 Bean 注入之前將這兩種配置方式的元信息融合在一起。

    posted on 2010-12-15 22:05 SIMONE 閱讀(530) 評論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 日韩激情无码免费毛片| 日本免费一区二区在线观看| 国产公开免费人成视频| 国产成人综合亚洲一区| 女人与禽交视频免费看| 亚洲av无码专区在线观看亚| 亚洲精品综合久久| 日韩精品无码免费专区网站| 久久精品国产亚洲av成人| 亚洲一区免费在线观看| 三级网站免费观看| 亚洲综合视频在线| 最近中文字幕无吗免费高清| 麻豆亚洲AV成人无码久久精品 | 日韩电影免费在线观看视频| 免费视频爱爱太爽了| 久9久9精品免费观看| avtt天堂网手机版亚洲| 日韩av无码久久精品免费| 美女视频黄免费亚洲| 久久亚洲AV永久无码精品| **毛片免费观看久久精品| 鲁啊鲁在线视频免费播放| 国产成人精品日本亚洲| 野花高清在线电影观看免费视频| 一级毛片在线免费播放| 亚洲精品高清国产一久久| 国产aa免费视频| 国产精品va无码免费麻豆| 免费视频成人片在线观看| 中文字幕乱码免费看电影| AAAAA级少妇高潮大片免费看| 在线aⅴ亚洲中文字幕| 国产亚洲?V无码?V男人的天堂 | 国产精品久久久久久亚洲影视| 亚洲色成人四虎在线观看| 亚洲一区二区观看播放| 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲 日韩 色 图网站| 亚洲精品宾馆在线精品酒店 | 成人免费的性色视频|