AOP(Aspect Oriented Programming):面向切面編程
核心思想:動態(tài)的添加和刪除切面上的邏輯而不影響原來的執(zhí)行代碼
AOP相關(guān)概念:
1、連接點(Joinpoint)
連接點是指在程序執(zhí)行過程中某個特定的點岛都,比如某方法調(diào)用的時候或者處理異常的時候剂买;
2玫荣、切點(Pointcut)
AOP通過切點定位特定連接點老玛。連接點和切點不是一一對應的關(guān)系蜕青,一個切點可以匹配多個連接點翠桦。
3横蜒、通知(Advice)
通知是織入到目標類連接點上的一段程序代碼,有以下分類:
·前置通知(Before):在目標方法或者說連接點被調(diào)用前執(zhí)行的通知销凑;
·后置通知(After):指在某個連接點完成后執(zhí)行的通知丛晌;
·返回通知(After-returning):指在某個連接點成功執(zhí)行之后執(zhí)行的通知;
·異常通知(After-throwing):指在方法拋出異常后執(zhí)行的通知斗幼;
·環(huán)繞通知(Around):指包圍一個連接點通知澎蛛,在被通知的方法調(diào)用之前和之后執(zhí)行自定義的方法。
4蜕窿、目標對象(Target Object)
增強邏輯的織入目標類谋逻。
5、引介(Introduction):
引介是一種特殊的增強桐经,它為類添加一些屬性和方法毁兆。這樣,即使一個業(yè)務類原本沒有實現(xiàn)某個接口阴挣,通過AOP的引介功能荧恍,我們可以動態(tài)的為該事務添加接口的實現(xiàn)邏輯,讓業(yè)務類成為這個接口的實現(xiàn)類屯吊。
6送巡、織入(Wearving)
織入是將增強添加對目標類具體連接點上的過程,AOP象一臺織布機盒卸,將目標類增強或引介AOP這臺織布機天衣無縫的編織在一起骗爆。
7、切面(Aspect)
切面由切點和通知組成蔽介,它既包括了橫切邏輯的定義摘投,也包括了連接點的定義,SpringAOP就是負責實施切面的框架虹蓄,它將切面所定義的橫切邏輯織入到切面所指定的鏈接點中犀呼。
第一個實例:
定義Target
//定義一個Target 接口
public interface ProxyService {
/**
* 測試方法
*/
void testProxy();
}
//提供實現(xiàn)類
public class ProxyServiceImpl implements ProxyService {
@Override
public void testProxy() {
System.out.println("我是ProxyService中的測試方法......");
}
}
aop配置類:
@Aspect
public class AopAdviceConfig {
@Before("execution(* study.chenji.spring.aop..*.*(..))")
public void beforeAdvice(JoinPoint joinPoint) {
System.out.println(joinPoint.getThis());
System.out.println("我是前置通知....");
}
@After("execution(* study.chenji.spring.aop..*.*(..))")
public void afterAdvice(JoinPoint joinPoint) {
System.out.println(joinPoint.getThis());
System.out.println("我是后置通知....");
}
}
測試:
public class TestAop {
public static void main(String[] args) {
//手工創(chuàng)建一個實例(Target)
ProxyService aspectJService = new ProxyServiceImpl();
//使用AspectJ語法 自動創(chuàng)建代理對象
AspectJProxyFactory aspectJProxyFactory = new AspectJProxyFactory(aspectJService);
//添加切面和通知類
aspectJProxyFactory.addAspect(AopAdviceConfig.class);
//創(chuàng)建代理對象
ProxyService proxyService = aspectJProxyFactory.getProxy();
//進行方法調(diào)用
proxyService.testProxy();
}
}
測試結(jié)果:
aop.ProxyServiceImpl@50ad3bc1
我是前置通知....
我是ProxyService中的測試方法......
aop.ProxyServiceImpl@50ad3bc1
我是后置通知....
?從上面的輸出結(jié)果來看,我們的AOP攔截功能是生效了薇组。但是對于這樣的操作是不是很奇怪外臂?上面的AspectJProxyFactory這個類又是什么鬼?怎么只調(diào)用了一下addAspect方法律胀,然后調(diào)用getProxy方法生成代理對象宋光,這樣就能進行AOP攔截了貌矿?
后面的篇章我們持續(xù)的去理解它。罪佳。逛漫。。