AOP基礎
通過切點(Pointcut)找到目標物件(Target)的連線點(Joinpoint),織入(Weaving)增強(Advice),得到代理類(Proxy)。引介(Introduction)是一種特殊的增強,切面(Aspect)由切點和增強組成。
通過java 動態代理技術或者 GCLib動態代理技術將橫切程式碼動態織入到目標方法的相應位置。
JDK動態代理:
1業務介面及其實現類,業務要求在每個方法執行前後都執行效能監控
class MyFavoritesBrandService implements IMyFavoritesBrandService{
@Override
public List<MyFavoritesBrandModel> queryMyFavoriteBrand(String brandId) throws Exception {
//業務邏輯程式碼;
}
}
2橫切業務類,將橫切業務(前後效能監控程式碼)抽取到該類中:該類可以為任何介面實現織入效能監控的功能
public class PerformanceHandler implements InvocationHandler {
private Object target;
public PerformanceHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*效能監控開始程式碼 */
Object obj=method.invoke(target, args);
/*效能監控結束程式碼*/
return obj;
}
}
3呼叫業務邏輯
@Test
public void Test2() {
IMyFavoritesBrandService target=new MyFavoritesBrandService ();
//target
PerformanceHandler handler=new PerformanceHandler(target);
//weaving
IMyFavoritesBrandService proxy=Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(), //介面
handler); //proxy
proxy.queryMyFavoriteBrand("brandId");
}
侷限是指南給介面建立代理例項
CGLib動態代理
1業務介面及其實現類,業務要求在每個方法執行前後都執行效能監控
class MyFavoritesBrandService implements IMyFavoritesBrandService{
@Override
public List<MyFavoritesBrandModel> queryMyFavoriteBrand(String brandId) throws Exception {
//業務邏輯程式碼;
}
}
2橫切業務類,將橫切業務(前後效能監控程式碼)抽取到該類中:該類可以為任何類實現織入效能監控的功能
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz) {
enhancer .setSuperclass(clazz); // 需要建立子類的類
enhancer .setCallback(this);
return enhancer .create(); // 動態建立子類例項
}
//攔截父類所有的方法:obj是目標類的例項,method是目標類方法的反射物件,args是方法的動態入參,proxy是代理類例項
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
/* 效能監控開始程式碼 */
Object result = proxy.invokeSuper(obj, args); //通過代理類呼叫父類中的方法
/* 效能監控結束程式碼 */
return result;
}
}
3呼叫業務邏輯
@Test
public void Test2() {
CglibProxy proxy =
new CglibProxy ();
MyFavoritesBrandService myFBService=(MyFavoritesBrandService )proxy.getProxy(MyFavoritesBrandService .class);
//動態生成子類的方式建立代理類
myFBService.queryMyFavoriteBrand("brandId");
}
相關文章
- 【AOP】技術基礎
- JavaSpring【五、AOP基礎】JavaSpring
- Spring AOP基礎簡介Spring
- Spring基礎只是—AOP的概念介紹Spring
- JAVA-Spring AOP基礎 - 代理設計模式JavaSpring設計模式
- 聊一聊 AOP :表現形式與基礎概念
- SpringBoot基礎篇AOP之高階使用技能Spring Boot
- Spring核心思想之 AOP:在自定義容器基礎上實現AOP功能Spring
- Spring基礎使用(三)-------XML定義AOP的使用SpringXML
- Util應用框架基礎(三) - 面向切面程式設計(AspectCore AOP)框架程式設計
- SpringCloud基礎篇AOP之攔截優先順序詳解SpringGCCloud
- C#中Attribute的魅力:從基礎到高階AOP實戰C#
- FluentAspects -- 基於 Fluent API 的 AopAPI
- Spring原始碼系列(三)--spring-aop的基礎元件、架構和使用Spring原始碼元件架構
- 【FPGA基礎】Latch基礎FPGA
- Spring基於註解的aop配置Spring
- Java基礎-語法基礎Java
- Pandas 基礎 (2) - Dataframe 基礎
- 前端基礎之jQuery基礎前端jQuery
- [今日白學]元件的基礎的基礎的基礎元件
- Spring Aop基於註解的實現Spring
- Spring中基於XML方式的AOP操作SpringXML
- Spring基於註解的AOP測試Spring
- Spring AOP基於xml的方式實現SpringXML
- 【web前端基礎 | JS基礎】物件Web前端JS物件
- scala基礎語法-----Spark基礎Spark
- Java基礎-物件導向基礎Java物件
- 【基礎篇索引】索引基礎(四)索引
- 【基礎篇索引】索引基礎(三)索引
- 【基礎篇索引】索引基礎(二)索引
- 【基礎篇索引】索引基礎(一)索引
- python基礎中的基礎Python
- 基礎
- JavaScript 基礎卷(一):基礎語法JavaScript
- 前端基礎入門四(JavaScript基礎)前端JavaScript
- 測試基礎(四)Jmeter基礎使用JMeter
- Python基礎:語法基礎(3)Python
- ASM常用基礎管理命令[ASM基礎]ASM