AOP 術(shù)語(yǔ)
public class user{
public void add(){...}
public void update(){...}
public void delete(){...}
public void findAll(){...}
}
- Join point(連接點(diǎn)):類里面可以被增強(qiáng)的方法穆碎,這些方法稱為連接點(diǎn)
- Point cut(切入點(diǎn)):在類里面可以有很多方法被增強(qiáng)柒室,比如實(shí)際操作中蔼紧,只是增強(qiáng)了類里面的add方法和update方法税朴,實(shí)際增強(qiáng)的方法稱為切入點(diǎn)
- Advice(通知/增強(qiáng)):增強(qiáng)的邏輯,比如擴(kuò)展日志功能轮傍,這個(gè)日志功能稱為增強(qiáng)
Advice類型:
前置通知:方法之前執(zhí)行
后置通知:在方法執(zhí)行之后執(zhí)行
最終通知:在后置之后來執(zhí)行
異常通知:方法出現(xiàn)異常時(shí)執(zhí)行
環(huán)繞通知:方法之前和方法之后執(zhí)行
- Aspect(切面):把增強(qiáng)應(yīng)用到具體的方法上面,這個(gè)過程稱為切面首装,也就是把增強(qiáng)應(yīng)用到切入點(diǎn)的過程
- Introduction(引介):引介是一種特殊的通知创夜,在不修改類代碼的前提下,可以在運(yùn)行期為類動(dòng)態(tài)地添加一些方法或?qū)傩?/li>
- Target(目標(biāo)對(duì)象):代理的目標(biāo)對(duì)象仙逻,也就是要增強(qiáng)的類(增強(qiáng)方法所在的那個(gè)類)
- weaving(織入):把a(bǔ)dvice(通知/增強(qiáng))應(yīng)用到target(目標(biāo)對(duì)象)的過程
- Proxy(代理):一個(gè)類被AOP織入增強(qiáng)后驰吓,就產(chǎn)生一個(gè)結(jié)果代理類
AspectJ
AspectJ簡(jiǎn)介
- AspectJ是一個(gè)面向切面的框架揍魂,它擴(kuò)展了Java語(yǔ)言。AspectJ定義了AOP語(yǔ)法棚瘟,所以它有一個(gè)專門的編譯器用來生成遵守Java字節(jié)編碼規(guī)范的class文件现斋。
- AspectJ是一個(gè)基于Java語(yǔ)言的AOP框架
- Spring2.0以后新增了對(duì)AspectJ切入點(diǎn)表達(dá)式支持
- @AspectJ是AspectJ1.5新增功能,通過JDK5注解技術(shù)偎蘸,允許直接在Bean類中定義切面
- 新版本Spring框架庄蹋,建議使用AspectJ方式開發(fā)AOP
- 使用AspectJ需要導(dǎo)入Spring AOP和AspectJ相關(guān)的jar包
AspectJ不是spring一部分,只是和spring一起使用進(jìn)行aop操作
Spring的AOP操作
使用AspectJ實(shí)現(xiàn)aop的兩種方式
- 基于AspectJ的xml配置
- 基于AspectJ的注解方式
AOP準(zhǔn)備工作
xml方式
- 導(dǎo)入相關(guān)jar包
- spring核心配置文件迷雪,添加aop約束
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframe.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
- 示例代碼
package com.zhangjinbang.aop;
public class Book{
public void add(){
System.out.println("add book");
}
}
package com.zhangjinbang.aop;
public class MyBook{
public void before1{
System.out.println("前置增強(qiáng)...");
}
}
使用表達(dá)式配置切入點(diǎn)
常用的表達(dá)式
execution(<訪問修飾符>?<返回類型><方法名>(<參數(shù)>)<異常>)
"*" 表示的是任意的意思
常用寫法
execution(* com.zhangjinbang.aop.Book.add(..))
execution(* com.zhangjinbang.aop.Book.*(..))
execution(* *.*(..))
匹配所有save開頭的方法 execution(* save*(..))
配置文件 bean.xml
<beans xmls="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframe.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置對(duì)象-->
<bean id="book" class="com.zhangjinbang.aop.Book"></bean>
<bean id="myBook" class="com.zhangjinbang.aop.MyBook"></bean>
<!--配置AOP操作-->
<aop:config>
<!--配置切入點(diǎn)-->
<aop:pointcut expression="execution(* com.zhangjinbang.aop.Book.*(..))" id="pointcut1">
<!--配置切面 把增強(qiáng)用到方法上-->
<aop:aspect ref="myBook">
<!--配置增強(qiáng)類型-->
<aop:before method="before1" pointcut-ref="pointcut1">
</aop:aspect>
</aop:config>
</beans>
測(cè)試
package com.zhangjinbang.aop;
import org.junit.Test;
...
public class BookTest{
@Test
public void testAdd(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
Book book=(Book)context.getBean("book");
book.add();
}
}
控制臺(tái)輸出內(nèi)容
前置增強(qiáng)...
add book