-
基于泛型的自動裝配(Spring4新增的內(nèi)容,和SPI使用方式相似,只不過Spring提供了更簡便的使用方式。API:應(yīng)用編程接口。SPI:針對服務(wù)框架開發(fā)或者一些工具的基礎(chǔ)使用的特殊類型接口。)
基于依賴對象泛型的自動裝配案例
步驟1:
public class IntegerStore {
}
public class StringStore{
@Autowired
private IntegerStore s2;
public void print(){
System.out.println("s2: ?"+s2);
}
}
步驟2:
@Configuration
public class StoreConfig {
@Bean
public StringStore stringStore(){
return new StringStore();
}
@Bean
public IntegerStore integerStore(){
return new IntegerStore();
}
}
步驟4:測試
@Test
public void testStore(){
ApplicationContext ac=new AnnotationConfigApplicationContext(StoreConfig.class);
StringStore ss=ac.getBean("stringStore",StringStore.class);
ss.print();
}
結(jié)果:(如果不加@Autowired注解,s2:為空)
s2: ?IntegerStore@3323f4c5
基于集合泛型的自動裝配(注意:不能使用@Autowired注解,要使用@Resource注解,并且使用@Resource(name="名字1"),去匹配@Bean(name="名字1")。
步驟1:
public class IntegerStore {
}
public class StringStore {
public StringStore() {
System.out.println("無參構(gòu)造方法執(zhí)行了");
}
private List<IntegerStore> list;
@Resource(name = "ll")
public void setList(List<IntegerStore> list) {
this.list = list;
}
public void print() {
for (IntegerStore store : list) {
System.out.println(store);
}
}
}
步驟2:
@Configuration
public class StoreConfig {
@Bean(name = "ll")
public List<IntegerStore> ll() {
List<IntegerStore> lis = new ArrayList<IntegerStore>();
lis.add(new IntegerStore());
lis.add(new IntegerStore());
lis.add(new IntegerStore());
return lis;
}
@Bean(name = "stringStore")
public StringStore stringStore() {
return new StringStore();
}
}
測試:
@Test
public void testStore() {
ApplicationContext ac = new AnnotationConfigApplicationContext(StoreConfig.class);
StringStore ss = ac.getBean("stringStore", StringStore.class);
ss.print();
}
}
結(jié)果:
無參構(gòu)造方法執(zhí)行了
IntegerStore@2b2c8b14
IntegerStore@795ee430
IntegerStore@44d74990
Autowired擴(kuò)展——自定義qualifier注解(自定義自動化注入配置)
查看全部 -
Advisors
1、advisor就像一個小的自包含的方面,只有一個advice。
2、切面自身通過一個bean表示,并且必須實(shí)現(xiàn)某個advice接口,同時,advisor也可以很好的利用AspectJ的切入點(diǎn)表達(dá)式(后面介紹AspectJ實(shí)現(xiàn)AOP時會介紹到AspectJ的切入點(diǎn)表達(dá)式)。
3、Spring通過配置文件中<aop:advisor>元素支持advisor,實(shí)際使用中,大多數(shù)情況下它會和transactional advice(事物相關(guān)的advice)配合使用(也可以有其他使用方式,根據(jù)項(xiàng)目或者工程的實(shí)際情況來決定)。
4、為了定義一個advisor的優(yōu)先級以便讓advice可以有序,可以使用order屬性來定義advisor的順序。
advisor的配置(<tx:advice>是對于事物的相關(guān)聲明,通過這種方式使用advisor,這種方式是在使用Spring事物的控制時,經(jīng)常使用的方式)
案例:(沒有講解advisor的案例,講解了環(huán)繞通知的一個案例,適用場景:統(tǒng)計(jì)邏輯功能方法的調(diào)用次數(shù),例如統(tǒng)計(jì)某方法調(diào)用3次,就不讓調(diào)用了)
步驟1:
public class ServiceFunction {
public void print1(){
System.out.println("邏輯功能方法1執(zhí)行了");
}
public void print2(){
System.out.println("邏輯功能方法2執(zhí)行了");
throw new RuntimeException();
}
}
步驟2:
public class AspectFunction {
private int max_times;
public int getMax_times() {
return max_times;
}
public void setMax_times(int max_times) {
this.max_times = max_times;
}
public Object aspectFunction(ProceedingJoinPoint pjp) throws Throwable{
int num_times=0;
do{
num_times++;
try{
System.out.println(num_times+"次");
return pjp.proceed();
}catch(RuntimeException e){
}
}while(num_times<=max_times);
System.out.println("方法總共執(zhí)行了"+num_times+"次");
return null;
}
}
步驟3:
查看全部 -
什么是spring
查看全部 -
Introductions應(yīng)用(簡介的advice,作用:在不改變對象和類的代碼的前提下,為對象和類添加新的方法。)
Introduction定義:簡介允許一個切面聲明一個實(shí)現(xiàn)指定接口的通知對象,并且提供一個接口實(shí)現(xiàn)類(接口的實(shí)現(xiàn)類,來代表實(shí)例化好的Bean)來代表這些對象。
Introductions的實(shí)現(xiàn):由<aop:aspect>中的<aop:declare-parents>元素聲明,該元素用于聲明所有匹配的類型,擁有一個新的parent(接口聲明的對象可以指向getBean獲得的對象)。
<aop:declare-parents>屬性
type-matching="expression表達(dá)式(表示匹配什么樣的類型)。
implement-interface="接口的路徑"(切面類的接口)。
default-impl=“切面類的路徑”。
案例:
步驟1:編寫邏輯功能接口(限制邏輯功能),并提供它的實(shí)現(xiàn)類。
public interface ServiceInterfaceFunction {
public void print();
}
public class ServiceFunction implements ServiceInterfaceFunction {
@Override
public void print() {
System.out.println("邏輯功能接口實(shí)現(xiàn)類的方法執(zhí)行了");
}
}
public class ServiceGongNeng {
}
步驟2:配置<aspect:config>(有接口的SpringAOP實(shí)現(xiàn),使用JavaSE動態(tài)代理,也就是JDK代理,JDK動態(tài)代理只能對實(shí)現(xiàn)了接口的類生成代理,而不能針對類,所以要配置<aop:declare-parents>)。
步驟3:測試
@Test
public void testaop(){
ApplicationContext ac=new ClassPathXmlApplicationContext("spring-aop-schema-advice.xml");
ServiceInterfaceFunction sif=(ServiceInterfaceFunction)ac.getBean("serviceGongNeng",ServiceGongNeng.class);
sif.print();
}
結(jié)果:正??梢詧?zhí)行接口實(shí)現(xiàn)類里的方法。(注意:types-matching="springAOP.ServiceGongNeng"沒有execution)
重點(diǎn)擴(kuò)展:所有基于配置文件的aspects,只支持單例模式(Single Model)。
查看全部 -
Advice應(yīng)用下
Around advice(環(huán)繞通知):切面方法的第一個參數(shù)必須是ProceedingJoinPoint類型。(并且在這個切面方法里,有一個proceed()方法:當(dāng)前業(yè)務(wù)方法的返回值,無論是void類型還是其他類型返回值,都使用Object retVal=pjp.proceed()這種方式,業(yè)務(wù)方法執(zhí)行前(這行代碼前)業(yè)務(wù)方法執(zhí)行后(這行代碼后),都可以做我們的切面功能,最后返回retVal對象。)
Around advice案例(配置了環(huán)繞通知,拋出異常通知就無效了,因?yàn)榄h(huán)繞通知的方法始終有返回值,pjp.proceed()表示邏輯方法的執(zhí)行,如果邏輯方法拋出異常,根據(jù)是否要進(jìn)行處理在環(huán)繞通知的方法里進(jìn)行捕獲或者往外拋出)
步驟1:spring配置
步驟2:切面的環(huán)繞通知方法。
public Object aroundAspect(ProceedingJoinPoint pjp){
Object obj=null;
try {
System.out.println("切面的前環(huán)繞通知功能實(shí)現(xiàn)了");
obj = pjp.proceed();
System.out.println("切面的后環(huán)繞通知功能實(shí)現(xiàn)了");
} catch (Throwable e) {
e.printStackTrace();
}
return obj;
}
Advice parameters(通知方法里的參數(shù)):邏輯功能方法的參數(shù),通過配置,可以傳入到切面的通知方法里。
案例(環(huán)繞通知參數(shù))
步驟1:編寫邏輯功能的方法,并有兩個參數(shù)。
步驟2:編寫配置文件,切面、環(huán)繞通知等(注意:配置方法里的參數(shù)名要和邏輯方法參數(shù)名相同,并且環(huán)繞通知方法名和參數(shù)名相同)。
測試:
@Test
public void test(){
ApplicationContext ac=new ClassPathXmlApplicationContext("spring-aop-schema-advice.xml");
ServiceFunction sf=ac.getBean("serviceFunction",ServiceFunction.class);
sf.serviceFunction("小明",5);
}
結(jié)果:
切面前置通知功能實(shí)現(xiàn)了
名字為小明
5次
切面的前環(huán)繞通知功能實(shí)現(xiàn)了
邏輯功能實(shí)現(xiàn)了
切面的后環(huán)繞通知功能實(shí)現(xiàn)了
切面后置通知功能實(shí)現(xiàn)了
切面返回后通知功能實(shí)現(xiàn)了
查看全部 -
Advice應(yīng)用(advice的配置)
Before advice的兩種配置方式
<aop:before ?pointcut-ref="切入點(diǎn)的Id" ?method="切面的方法"/>。直接設(shè)置切入點(diǎn)(就不用單獨(dú)設(shè)置<aop:point-cut/>標(biāo)簽了)
<aop:before ?pointcut="execution(* ?com.xyz.myapp.dao..(..))" ?method="doAccessCheck"/>
案例:(前置)
步驟1:編寫邏輯功能類、切面功能類、并編寫各自的方法。
代碼:
步驟2:編寫XML配置,實(shí)例化邏輯功能類的Bean和切面功能類的Bean,配置切面、切入點(diǎn)、通知。
案例:(After return advice返回后通知)
<aop:after-returning>returning屬性,限制方法的返回值,例如retVal。(arg-names為參數(shù)名稱,它是嚴(yán)格匹配的。)
步驟1:編寫邏輯功能類、切面功能類、并編寫各自的方法(和以上相似,只不過切面類多了一個方法)。
步驟2:編寫XML配置,實(shí)例化邏輯功能類的Bean和切面功能類的Bean,配置切面、切入點(diǎn)、通知。
案例:(拋出異常后通知After throwing advice,<aop:after-throwing>標(biāo)簽多了一個throwing屬性,它是限制可被傳遞的異常參數(shù)名稱)
步驟1:編寫邏輯功能類、切面功能類、并編寫各自的方法(編寫發(fā)生異常后切面要執(zhí)行的方法)
步驟2:編寫XML配置,實(shí)例化邏輯功能類的Bean和切面功能類的Bean,配置切面、切入點(diǎn)、拋出異常通知。
案例:(后置通知After (finally) advice)
步驟1:編寫邏輯功能類、切面功能類、并編寫各自的方法(編寫邏輯方法執(zhí)行后要執(zhí)行的切面方法)
步驟2:編寫XML配置,實(shí)例化邏輯功能類的Bean和切面功能類的Bean,配置切面、切入點(diǎn)、拋出異常通知。
案例:(環(huán)繞通知After (finally) advice)
步驟1:編寫邏輯功能類、切面功能類、并編寫各自的方法(編寫邏輯方法執(zhí)行后要執(zhí)行的切面方法)
步驟2:編寫XML配置,實(shí)例化邏輯功能類的Bean和切面功能類的Bean,配置切面、切入點(diǎn)、拋出異常通知。
查看全部 -
spring是一個輕量級的 控制反轉(zhuǎn)(Ioc)和面向切面(AOP)的容器框架
IOC:????輕量級的控制反轉(zhuǎn),達(dá)到松耦合的目的
? ? ? ? ? ?將控制權(quán)交出去,使用時得到對象
AOP:面向切面,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級服務(wù)進(jìn)行內(nèi)聚性的開發(fā)----例如倉庫管理的業(yè)務(wù)邏輯和日志記錄的系統(tǒng)服務(wù)
? ? ? ? ? 事務(wù)管理,日志等
查看全部 -
spring 資源
查看全部 -
配置切入點(diǎn)Pointcut(找到某個功能模塊的具體方法)
execution用于匹配某個功能模塊的具體方法。
以下SpringAOP和Spring支持的AspectJ都支持。
圖一的1:執(zhí)行所有的public方法時,進(jìn)行切入(執(zhí)行相應(yīng)切面的相應(yīng)功能)。
圖一的2:執(zhí)行所有的set方法時,進(jìn)行切入。
圖一的3:執(zhí)行com.xy.service.AccountService類下的所有方法時,進(jìn)行切入。
圖一的4:執(zhí)行com.xyz.service包下的所有方法時,進(jìn)行切入。
圖一的5:執(zhí)行com.xyz.service包下以及子包下的所有方法時,進(jìn)行切入。
以下為SpringAOP自己支持的。
SpringAOP其他的匹配。
圖一的1:匹配目標(biāo)對象。
圖一的2:匹配參數(shù)的。
圖一的3:按注解匹配的。
圖一的4:按注解匹配的。
圖一的5:按注解匹配的。
圖二的1:參數(shù)里采用了何種注解。
圖二的2:采用了何種bean。
圖二的3:bean是以何種形式進(jìn)行結(jié)尾的。(這些可以去Spring官方文檔和搜索引擎搜索,會有很全面的解釋,這些切入點(diǎn)會有很多類型,在具體使用時,可以查找相應(yīng)文檔)
完整的AOP配置(根據(jù)不同業(yè)務(wù)需求,查找相關(guān)文檔,進(jìn)行不同的expression表達(dá)式配置)
案例1:表示執(zhí)行service包下的所有類的任何類型的方法時,進(jìn)行切入。
案例2:表示執(zhí)行SystemArchitecture的businessService()方法時,才進(jìn)行切入。
案例3:執(zhí)行AspectBiz中的所有方法,都會進(jìn)行切入。
配置以某個單詞結(jié)尾的類:例如上面Aspect編寫成*。
查看全部 -
基于Schema-based配置的AOP實(shí)現(xiàn)
Spring所有的切面和通知器都必須放在<aop:config>內(nèi)(可以配置多個<aop:config>元素),每一個<aop:config>可以包含aspect,pointcout和advisor元素(它們必須按照這個順序進(jìn)行聲明)。
<aop:config>的配置大量使用了Spring的自動代理機(jī)制。
該配置的含義:一個類作為切面來聲明,切面Id是myAspect,也就是說程序執(zhí)行某個功能模塊時,通過pointcut和Joinpoint執(zhí)行該切面的功能。
案例:兩個類,一個類作為切面類,另一個作為業(yè)務(wù)類。(注意:<beans>中添加約束,xmlns:aop="http://www.springframework.org/schema/aop
)
代碼:
<?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"
? ? ? ? xmlns:aop="http://www.springframework.org/schema/aop"
? ? xsi:schemaLocation="http://www.springframework.org/schema/beans
? ? ? ? http://www.springframework.org/schema/beans/spring-beans.xsd
? ? ? ? http://www.springframework.org/schema/context
? ? ? ? http://www.springframework.org/schema/context/spring-context.xsd ?
? ? ? ? http://www.springframework.org/schema/aop
? ? ? ? http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
? ? ? ? <bean id="aspectImooc" class="aspect.AspectImooc"></bean>
? ? ? ? <bean id="ServiceImooc" class="aspect.ServiceImooc"></bean>
? ? ? ? <aop:config>
? ? ? ? <aop:aspect id="aspectImoocAop" ref="aspectImooc"></aop:aspect>
? ? ? ? </aop:config>
查看全部 -
AOP基本概念及特點(diǎn)
一、什么是AOP及實(shí)現(xiàn)方式
AOP:Aspect ?Oriented ?Programming,面向切面編程,通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
主要功能:日志記錄,性能統(tǒng)計(jì),安全控制,事物處理,異常處理等等。(事務(wù)處理:任何操作數(shù)據(jù)庫的方法,尤其是增刪改,需要事物的處理,使用AOP時,執(zhí)行到某種類型的方法,或者某一層的類,自動開啟事物和獲取連接、提交事物、關(guān)閉事物的步驟,簡化了操作)
AOP實(shí)現(xiàn)方式:1——預(yù)編譯方式。(AspectJ)
? ? ? ? ? ? ? ? ? ? ? ? ?2——運(yùn)行期動態(tài)代理。(JDK動態(tài)代理、CGLib動態(tài)代理)
? ? ? ? ? ? ? ? ? ? ? ?(SpringAOP、JbossAOP)
切面的理解:例如系統(tǒng)中有產(chǎn)品管理、訂單管理、服務(wù)管理等等模塊(子功能),任一模塊(子功能),都需要記錄它的日志,控制它的事物,以及做一些安全驗(yàn)證的功能。但是如果在每一個模塊(子功能)中去設(shè)計(jì)日志、事物、安全驗(yàn)證,會帶來大量工作量,尤其當(dāng)項(xiàng)目達(dá)到一定規(guī)模時,比如修改日志記錄的方式,那么則需要修改每一個模塊的日志功能,通過切面方式對開發(fā)人員是不可見的,當(dāng)執(zhí)行任一模塊時,通過預(yù)編譯或者運(yùn)行期動態(tài)代理方式,都會去記錄它的日志,實(shí)現(xiàn)了一處寫功能,處處可實(shí)現(xiàn)的方式,對于開發(fā)人員允許不知道有這樣功能的存在,這樣就簡化了操作(修改日志、編寫事物等),業(yè)務(wù)功能橫向走,切面垂直業(yè)務(wù)功能。
二、AOP基本概念(切面—>織入—>目標(biāo)對象—>切入點(diǎn)—>連接點(diǎn)—>通知—>引入—>AOP代理:“切面”要執(zhí)行的動作,通過“織入”與所有功能模塊進(jìn)行聯(lián)系,又通過“目標(biāo)對象”找到具體功能模塊,通過“切入點(diǎn)”將要查找某個功能的某個方法,通過“連接點(diǎn)”找到該功能的特定方法的開始,通過“通知”將要執(zhí)行何種切面的動作,通過“引入”引入該動作用到的對象和方法,通過“AOP代理”實(shí)現(xiàn)該方法。)
AOP相關(guān)概念:
1、切面(Aspect):一個關(guān)注點(diǎn)(事物),這個關(guān)注點(diǎn)可能會橫切多個對象(產(chǎn)品管理、訂單管理)。
2、連接點(diǎn)(Joinpoint):程序執(zhí)行過程中的某個特定的點(diǎn)。(一個類中執(zhí)行的某個方法的開始)。
3、通知(Advice):在切面的某個特定的連接點(diǎn)上執(zhí)行的動作(方法執(zhí)行的時候,切面額外執(zhí)行的動作,比如說方法執(zhí)行時,開啟事物提交功能)。
4、切入點(diǎn)(Pointcut):匹配連接點(diǎn)的斷言,在AOP中通知和一個切入點(diǎn)表達(dá)式關(guān)聯(lián)(在切面中匹配一個具體的連接點(diǎn)(某個功能的方法的開始))。
5、引入(Introduction):在不修改類代碼的前提下,修改的是字節(jié)碼文件,為類添加新的方法和屬性。(類似于編譯期動態(tài)的修改class文件去增加新的屬性和方法,源代碼中并沒有這樣的屬性和方法),取決于使用AspectJ和SpringAOP的實(shí)現(xiàn)方式,使用方式不同,為類添加屬性和方法的方式是有區(qū)別的。
6、目標(biāo)對象(Target Object):被一個或者多個切面所通知的對象。(例如存在一個訂單的service(對象)和一個商品的service(對象),執(zhí)行該模塊的功能時,切面會通知相對應(yīng)的service,在執(zhí)行數(shù)據(jù)庫操作時,去加上事物的控制,這兩個service就是目標(biāo)對象)。
7、AOP代理(AOP ?Proxy):AOP框架創(chuàng)建的對象,用來實(shí)現(xiàn)切面契約(aspect contract),包括通知方法執(zhí)行等功能(這里執(zhí)行的方法指的是切面里的執(zhí)行相應(yīng)操作所用到的方法)開發(fā)時不知道這個對象存在的,也不清楚會創(chuàng)建成什么樣子。
8、織入(Weaving):把切面連接到其他的應(yīng)用程序類型或者對象上,并創(chuàng)建一個被通知的對象,分為:編譯時織入、類加載時織入、執(zhí)行時織入。(使切面和對象(模塊功能)牽連起來)
Spring官方文檔給出的解釋:
Advice(通知)的類型(在切面某個特定連接點(diǎn)執(zhí)行的動作)
前置通知(Before advice):在某連接點(diǎn)(join point)(某個功能方法開始執(zhí)行前)之前執(zhí)行的通知,但不能阻止連接點(diǎn)前的執(zhí)行(除該方法外的其他方法的執(zhí)行)(除非它拋出一個異常)。
返回后通知(After returning advice):在某連接點(diǎn)(方法)正常完成后執(zhí)行的通知(將要執(zhí)行的切面功能)。
拋出異常后通知(After throwing advice):在方法拋出異常退出時執(zhí)行的通知(將要執(zhí)行切面的功能)。
后通知(After(finally)advice):當(dāng)某連接點(diǎn)(方法)退出的時候執(zhí)行的通知(切面將要執(zhí)行的功能)(不論是正常返回還是異常退出都會執(zhí)行的通知)。
環(huán)繞通知(Around Advice):包圍一個連接點(diǎn)(join point)的通知(在整個方法的內(nèi)部都有切面要執(zhí)行的功能存在,不分前后)。
Spring框架中AOP的用途:
用途1:提供了聲明式的企業(yè)服務(wù)(也可以是其他服務(wù),例如互聯(lián)網(wǎng)服務(wù)),特別是EJB(重量級框架)的替代服務(wù)的聲明。
用途2:允許用戶定制自己的方面(切面),以完成OOP(面向?qū)ο缶幊?,模擬世界中行為和方式,可以理解為實(shí)現(xiàn)一個功能的順序)與AOP(橫切的方式,可以理解為各個功能之間橫切的一種功能)的互補(bǔ)使用,可以實(shí)現(xiàn)自己橫切的功能。
三、Spring中的AOP(Spring中AOP的實(shí)現(xiàn)方式以及特點(diǎn))
特點(diǎn)1:純java實(shí)現(xiàn),無需特殊的編譯過程(普通代碼需要加載才能執(zhí)行),不需要控制類加載器層次??梢愿玫倪M(jìn)行控制(使用類加載器應(yīng)當(dāng)謹(jǐn)慎,容易方法生ClassNotFound異常這種情況)。
特點(diǎn)2:目前只支持方法執(zhí)行連接點(diǎn)(通知Spring Bean的方法執(zhí)行),(在執(zhí)行某方法時,才去執(zhí)行切面的功能)。
特點(diǎn)3:SpringAOP不是為了提供最完整的AOP實(shí)現(xiàn)(盡管它非常強(qiáng)大);而是側(cè)重于提供一種AOP實(shí)現(xiàn)和Spring IoC容器之間的整合,用于幫助解決企業(yè)應(yīng)用中的常見問題。
特點(diǎn)4:SpringAOP不會與AspectJ(完整的、全面的AOP解決方案)競爭,也不會提供綜合全面的AOP解決方案。
有接口和無接口的SpringAOP實(shí)現(xiàn)區(qū)別:(一個類是否實(shí)現(xiàn)了某個接口,例如一個ProductService接口,一個ProductServiceImpl實(shí)現(xiàn)了該接口,在這類上切入的切面就是有接口的AOP)
SpringAOP對于有接口的使用標(biāo)準(zhǔn)的JavaSE動態(tài)代理作為AOP代理,這使得任何接口(或者接口集)都可以被代理。
SpringAOP對于沒有接口的實(shí)現(xiàn)類中使用CGLIB代理(如果一個業(yè)務(wù)對象并沒有實(shí)現(xiàn)一個接口)
四、Schema-based 實(shí)現(xiàn)AOP(基于配置文件實(shí)現(xiàn)AOP)
五、API實(shí)現(xiàn)AOP(基于API實(shí)現(xiàn)AOP)
六、AspectJ實(shí)現(xiàn)AOP
查看全部 -
bean容器初始化
查看全部 -
<aop:declare-parents?types-matching?=?"com.imooc.aop.shema.advice.biz.*(+)" ?????????????????????implement-interface?=?"com.imooc.aop.shema.advice.Fit" ?????????????????????default-impl?=?"com.imooc.aop.shema.advice.FitImpl"/> 對所有匹配到的類都增加一個方法實(shí)現(xiàn),F(xiàn)itImpl,這里是所有匹配到的biz類都可以轉(zhuǎn)為Fit類????????????????? >
查看全部 -
Bean管理的注解實(shí)現(xiàn)及例子
1、Classpath掃描與組件管理
定義:從Spring3.0開始,Spring JavaConfig項(xiàng)目提供很多特性,包括通過注解定義Bean,而不是使用XML。
@Component:通用型注解,可用于任何Bean。
@Repository:通常用于注解DAO類,即持久類。
@Service:通常用于注解Service類,即服務(wù)層。
@Controller:通常用于注解Controller,即控制層。
2、類的自動檢測與注冊Bean
定義:Spring可以檢測到類上和屬性上以及方法上的注解,可以通過注解進(jìn)行實(shí)例化或注入。
3、<context:annotation-config/>
定義:基于XML配置,如果使用該標(biāo)簽,則在描述中添加約束。
<context:component-scan>:一般處理類上的注解,它的功能包含<context:annotation-config>的功能,比較常用。
<context:annotation-config>:一般處理實(shí)例化Bean的屬性和方法的注解。
SpringXML配置過濾器作用:掃描特定包下的特定注解。
4、@Component,@Repository,@Service,@Controller
5、@Required
6、@Autowired
7、@Qualifier
8、@Resource
查看全部 -
關(guān)于AOP配置相關(guān)
查看全部
舉報(bào)