欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Spring2.X的IOC支持
在沒(méi)有注解之前,可能需要在xml中配置一個(gè)bean,并且在需要注入的類(lèi)中有相應的set方法, 注釋和 Java 代碼位于一個(gè)文件中,而 XML 配置采用獨立的配置文件,大多數配置信息在程序開(kāi)發(fā)完成后都不會(huì )調整,如果配置信息和 Java 代碼放在一起,有助于增強程序的內聚性。而采用獨立的 XML 配置文件,程序員在編寫(xiě)一個(gè)功能時(shí),往往需要在程序文件和配置文件中不停切換,這種思維上的不連貫會(huì )降低開(kāi)發(fā)效率。
Autowired
Spring 2.5 引入了 @Autowired 注釋?zhuān)梢詫︻?lèi)成員變量、方法及構造函數進(jìn)行標注,完成自動(dòng)裝配的工作。來(lái)看一下使用 @Autowired 進(jìn)行成員變量自動(dòng)注入的代碼:
package com.baobaotao;
import org.springframework.beans.factory.annotation.Autowired;
public class Boss {
@Autowired
private Car car;
}
Spring 通過(guò)一個(gè) BeanPostProcessor 對 @Autowired 進(jìn)行解析,所以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明AutowiredAnnotationBeanPostProcessor Bean。
<!-- 該 BeanPostProcessor 將自動(dòng)起作用,對標注 @Autowired 的 Bean 進(jìn)行自動(dòng)注入 -->
<bean class="org.springframework.beans.factory.annotation.
AutowiredAnnotationBeanPostProcessor"/>
當 Spring 容器啟動(dòng)時(shí),AutowiredAnnotationBeanPostProcessor 將掃描 Spring 容器中所有 Bean,當發(fā)現 Bean 中擁有 @Autowired 注釋時(shí)就找到和其匹配(默認按類(lèi)型匹配)的 Bean,并注入到對應的地方中去;Spring 將直接采用 Java 反射機制對 Boss 中的 car 這個(gè)私有成員變量進(jìn)行自動(dòng)注入。所以對成員變量使用 @Autowired 后,您大可將它們的 setter 方法(setCar() 和 setOffice())從 Boss 中刪除。
默認按類(lèi)型匹配
在默認情況下使用 @Autowired 注釋進(jìn)行自動(dòng)注入時(shí),Spring 容器中匹配的候選 Bean 數目必須有且僅有一個(gè)。當找不到一個(gè)匹配的 Bean 時(shí),Spring 容器將拋出 BeanCreationException 異常,并指出必須至少擁有一個(gè)匹配的 Bean;當不能確定 Spring 容器中一定擁有某個(gè)類(lèi)的 Bean 時(shí),可以在需要自動(dòng)注入該類(lèi) Bean 的地方可以使用 @Autowired(required = false),這等于告訴 Spring:在找不到匹配 Bean 時(shí)也不報錯。
@Qualifier
前面已經(jīng)看到,Autowired只能按類(lèi)型注入,通過(guò)Qualifier允許我們指定注入 Bean 的名稱(chēng),這樣歧義就消除了,可以通過(guò)下面的方法解決異常:
@Autowired
public void setOffice(@Qualifier("office")Office office) {
this.office = office;
}
或者
@Autowired
@Qualifier("office")
private Office office;
@Qualifier("office") 中的 office 是 Bean 的名稱(chēng),所以 @Autowired 和 @Qualifier 結合使用時(shí),自動(dòng)注入的策略就從 byType 轉變成 byName 了。
@Autowired 可以對成員變量、方法以及構造函數進(jìn)行注釋?zhuān)?@Qualifier 的標注對象是成員變量、方法入參、構造函數入參。正是由于注釋對象的不同,所以 Spring 不將 @Autowired 和 @Qualifier 統一成一個(gè)注釋類(lèi)。
@Qualifier 只能和 @Autowired 結合使用,是對 @Autowired 有益的補充。一般來(lái)講,@Qualifier 對方法簽名中入參進(jìn)行注釋會(huì )降低代碼的可讀性,而對成員變量注釋則相對好一些。
JSR-250的注解
@Resource、@PostConstruct 以及 @PreDestroy
1.@Resource
@Resource 的作用相當于 @Autowired,只不過(guò) @Autowired 按 byType 自動(dòng)注入,面 @Resource 默認按 byName 自動(dòng)注入罷了。@Resource 有兩個(gè)屬性是比較重要的,分別是 name 和 type,Spring 將 @Resource 注釋的 name 屬性解析為 Bean 的名字,而 type 屬性則解析為 Bean 的類(lèi)型。所以如果使用 name 屬性,則使用 byName 的自動(dòng)注入策略,而使用 type 屬性時(shí)則使用 byType 自動(dòng)注入策略。如果既不指定 name 也不指定 type 屬性,這時(shí)將通過(guò)反射機制使用 byName 自動(dòng)注入策略。
Resource 注釋類(lèi)位于 Spring 發(fā)布包的 lib/j2ee/common-annotations.jar 類(lèi)包中,因此在使用之前必須將其加入到項目的類(lèi)庫中。
@Resource(name = "office")
private Office office;
要讓 JSR-250 的注釋生效,除了在 Bean 類(lèi)中標注這些注釋外,還需要在 Spring 容器中注冊一個(gè)負責處理這些注釋的 BeanPostProcessor:
<bean
class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
CommonAnnotationBeanPostProcessor 實(shí)現了 BeanPostProcessor 接口,它負責掃描使用了 JSR-250 注釋的 Bean,并對它們進(jìn)行相應的操作。
2.@PostConstruct 和 @PreDestroy
Spring 容器中的 Bean 是有生命周期的,Spring 允許在 Bean 在初始化完成后以及 Bean 銷(xiāo)毀前執行特定的操作,您既可以通過(guò)實(shí)現 InitializingBean/DisposableBean 接口來(lái)定制初始化之后 / 銷(xiāo)毀之前的操作方法,也可以通過(guò) <bean> 元素的 init-method/destroy-method 屬性指定初始化之后 / 銷(xiāo)毀之前調用的操作方法(參考前面的IOC一篇里面配置)。
JSR-250 為初始化之后/銷(xiāo)毀之前方法的指定定義了兩個(gè)注釋類(lèi),分別是 @PostConstruct 和 @PreDestroy,這兩個(gè)注釋只能應用于方法上。標注了 @PostConstruct 注釋的方法將在類(lèi)實(shí)例化后調用,而標注了 @PreDestroy 的方法將在類(lèi)銷(xiāo)毀之前調用。
public class Boss {
@PostConstruct
public void postConstruct1(){
System.out.println("postConstruct1");
}
@PreDestroy
public void preDestroy1(){
System.out.println("preDestroy1");
}
}
您只需要在方法前標注 @PostConstruct 或 @PreDestroy,這些方法就會(huì )在 Bean 初始化后或銷(xiāo)毀之前被 Spring 容器執行了。
|不管是通過(guò)實(shí)現 InitializingBean/DisposableBean 接口,還是通過(guò) <bean> 元素的 init-method/destroy-method 屬性進(jìn)行配置,都只能為 Bean 指定一個(gè)初始化 / 銷(xiāo)毀的方法。但是使用 @PostConstruct 和 @PreDestroy 注釋卻可以指定多個(gè)初始化 / 銷(xiāo)毀方法,那些被標注 @PostConstruct 或@PreDestroy 注釋的方法都會(huì )在初始化 / 銷(xiāo)毀時(shí)被執行。
通過(guò)以下的測試代碼,您將可以看到 Bean 的初始化 / 銷(xiāo)毀方法是如何被執行的:
public class AnnoIoCTest {
public static void main(String[] args) {
String[] locations = {"beans.xml"};
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext(locations);
Boss boss = (Boss) ctx.getBean("boss");
System.out.println(boss);
ctx.destroy();// 關(guān)閉 Spring 容器,以觸發(fā) Bean 銷(xiāo)毀方法的執行
}
}
這時(shí),將看到標注了 @PostConstruct 的 postConstruct1() 方法將在 Spring 容器啟動(dòng)時(shí),創(chuàng )建 Boss Bean 的時(shí)候被觸發(fā)執行,而標注了 @PreDestroy 注釋的 preDestroy1() 方法將在 Spring 容器關(guān)閉前銷(xiāo)毀 Boss Bean 的時(shí)候被觸發(fā)執行。
<context:annotation-config/>
Spring 2.1 添加了一個(gè)新的 context 的 Schema 命名空間,該命名空間對注釋驅動(dòng)、屬性文件引入、加載期織入等功能提供了便捷的配置。我們知道注釋本身是不會(huì )做任何事情的,它僅提供元數據信息。要使元數據信息真正起作用,必須讓負責處理這些元數據的處理器工作起來(lái)。
而我們前面所介紹的 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor 就是處理這些注釋元數據的處理器。但是直接在 Spring 配置文件中定義這些 Bean 顯得比較笨拙。Spring 為我們提供了一種方便的注冊這些 BeanPostProcessor 的方式,這就是 <context:annotation-config/>,
<context:annotationconfig/> 將隱式地向 Spring 容器注冊
AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 以及equiredAnnotationBeanPostProcessor 這 4 個(gè) BeanPostProcessor。
在配置文件中使用 context 命名空間之前,必須在 <beans> 元素中聲明 context 命名空間。
@Component
@Component
public class Car {
}
僅僅需要@Component注解,就可以定義一個(gè)bean,也可以在里面是用Autowired去注入成員變量;
@Component 有一個(gè)可選的入參,用于指定 Bean 的名稱(chēng),@Component("boss")在 Boss 中,我們就將 Bean 名稱(chēng)定義為“boss”。一般情況下,Bean 都是 singleton 的,需要注入 Bean 的地方僅需要通過(guò) byType 策略就可以自動(dòng)注入了,所以大可不必指定 Bean 的名稱(chēng)。
在使用 @Component 注釋后,Spring 容器必須啟用類(lèi)掃描機制以啟用注釋驅動(dòng) Bean 定義和注釋驅動(dòng) Bean 自動(dòng)注入的策略。Spring 2.5 對 context 命名空間進(jìn)行了擴展,提供了這一功能,請看下面的配置:
<context:component-scan base-package="com.baobaotao"/>
這里,所有通過(guò) <bean> 元素定義 Bean 的配置內容已經(jīng)被移除,僅需要添加一行 <context:component-scan/> 配置就解決所有問(wèn)題了——Spring XML 配置文件得到了極致的簡(jiǎn)化(當然配置元數據還是需要的,只不過(guò)以注釋形式存在罷了)。<context:component-scan/> 的 base-package 屬性指定了需要掃描的類(lèi)包,類(lèi)包及其遞歸子包中所有的類(lèi)都會(huì )被處理。
<context:component-scan/> 還允許定義過(guò)濾器將基包下的某些類(lèi)納入或排除。Spring 支持以下 4 種類(lèi)型的過(guò)濾方式,通過(guò)下表說(shuō)明:
過(guò)濾器類(lèi)型
說(shuō)明
注釋
假如 com.baobaotao.SomeAnnotation 是一個(gè)注釋類(lèi),我們可以將使用該注釋的類(lèi)過(guò)濾出來(lái)。
類(lèi)名指定
通過(guò)全限定類(lèi)名進(jìn)行過(guò)濾,如您可以指定將 com.baobaotao.Boss 納入掃描,而將 com.baobaotao.Car 排除在外。
正則表達式
通過(guò)正則表達式定義過(guò)濾的類(lèi),如下所示: com\.baobaotao\.Default.*
AspectJ 表達式
通過(guò) AspectJ 表達式定義過(guò)濾的類(lèi),如下所示: com. baobaotao..*Service+
下面是一個(gè)簡(jiǎn)單的例子:
<context:component-scan base-package="com.baobaotao">
<context:include-filter type="regex"
expression="com\.baobaotao\.service\..*"/>
<context:exclude-filter type="aspectj"
expression="com.baobaotao.util..*"/>
</context:component-scan>
值得注意的是 <context:component-scan/> 配置項不但啟用了對類(lèi)包進(jìn)行掃描以實(shí)施注釋驅動(dòng) Bean 定義的功能,同時(shí)還啟用了注釋驅動(dòng)自動(dòng)注入的功能(即還隱式地在內部注冊了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此當使用 <context:component-scan/> 后,就可以將 <context:annotation-config/> 移除了。
默認情況下通過(guò) @Component 定義的 Bean 都是 singleton 的,如果需要使用其它作用范圍的 Bean,可以通過(guò) @Scope 注釋來(lái)達到目標,如以下代碼所示:
@Scope("prototype")
@Component("boss")
public class Boss {
}
這樣,當從 Spring 容器中獲取 boss Bean 時(shí),每次返回的都是新的實(shí)例了。
@Repository、@Service 和 @Controlle
Spring 2.5 中除了提供 @Component 注釋外,還定義了幾個(gè)擁有特殊語(yǔ)義的注釋?zhuān)鼈兎謩e是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,這 3 個(gè)注釋和 @Component 是等效的,但是從注釋類(lèi)的命名上,很容易看出這 3 個(gè)注釋分別和持久層、業(yè)務(wù)層和控制層(Web 層)相對應。雖然目前這 3 個(gè)注釋和 @Component 相比沒(méi)有什么新意,但 Spring 將在以后的版本中為它們添加特殊的功能。所以,如果 Web 應用程序采用了經(jīng)典的三層分層結構的話(huà),最好在持久層、業(yè)務(wù)層和控制層分別采用 @Repository、@Service 和 @Controller 對分層中的類(lèi)進(jìn)行注釋?zhuān)?@Component 對那些比較中立的類(lèi)進(jìn)行注釋。
\
注解的優(yōu)點(diǎn):
1.大部分的注入都是不變的,這樣不管是對于你本身的應用,還是對于別人的第三方應用來(lái)說(shuō),都不用引入一個(gè)復雜的XML配置文件
缺點(diǎn):
1.有些注入關(guān)系可能不是固定的,而是動(dòng)態(tài)的,這時(shí)候注解就無(wú)能為力了
2.其他包中的類(lèi)必須用xml了
3.注釋配置往往是類(lèi)級別的,而 XML 配置則可以表現得更加靈活。比如相比于 @Transaction 事務(wù)注釋?zhuān)褂?aop/tx 命名空間的事務(wù)配置更加靈活和簡(jiǎn)單。
Spring 會(huì )在具體實(shí)施 Bean 創(chuàng )建和 Bean 注入之前將這兩種配置方式的元信息融合在一起。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
使用 Spring 2.5 注釋驅動(dòng)的 IoC 功能
Spring JSR-250注解
彈簧-@Configurable不適用于在@PostConstruct方法中初始化的對象
Spring容器中的Bean幾種初始化方法和銷(xiāo)毀方法的先后順序
Spring Annotation 筆記——IOC篇
spring2中基于注釋的配置方式淺析
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久