1. 程式人生 > >Spring中的aop(1)

Spring中的aop(1)

Spring中的aop

今天介紹一下Spring aop技術,即面向切面的技術,不知道為什麼,聽著就覺得很牛逼。

一、什麼是aop:

二、為什麼學習 AOP

對程式進行增強:不修改原始碼的情況下.

AOP 可以進行許可權校驗,日誌記錄,效能監控,事務控制

三、Spring 的 AOP 的由來:

AOP 最早由 AOP 聯盟的組織提出的,制定了一套規範.Spring 將 AOP 思想引入到框架中,必須遵守 AOP 聯盟規範

四、底層實現

動態代理機制:

Spring 的 AOP 的底層用到兩種代理機制:

  • JDK 的動態代理 :針對實現了介面的類產生代理.
                                                                                                                         具體可見我另一篇部落格:https://blog.csdn.net/lx678111/article/details/82818634
  • Cglib 的動態代理 :針對沒有實現介面的類產生代理. 應用的是底層的位元組碼增強的技術 生成當前類的子類物件

cglib

實現MethodInterceptor介面,

 Enhancer en=new Enhancer();//幫我們生成代理對,cglib核心類
 en.setSuperclass(UserServiceImpl.class);//設定對誰進行代理
 en.setCallback(this);//代理要做什麼

實現intercept(...)方法

methodProxy.invokeSuper(proxyObj, args);//放行

 

總結一點:動態代理即面向介面,cglib即生成當前類的代理子物件

package cn.hncu.proxy;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import cn.hncu.service.UserService;
import cn.hncu.service.UserServiceImpl;

public class UserServiceProxyFactory2 implements MethodInterceptor{
	

	public UserService getUserServiceProxy() {
		 Enhancer en=new Enhancer();//幫我們生成代理物件
		 en.setSuperclass(UserServiceImpl.class);//設定對誰進行代理
		 en.setCallback(this);//代理要做什麼
		 UserService us = (UserService) en.create();
		 return us;
	}

	@Override
	public Object intercept(Object proxyObj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		
		//開啟事務
		System.out.println("開啟事務!");
		//呼叫方法
		Object returnValue =methodProxy.invokeSuper(proxyObj, args);
		
		//在方法之後提交事務
		System.out.println("提交事務!");
		
		return returnValue;
	}

}

五、Spring中的aop原理

 

六、Spting aop專業術語

joinpoint連線點:目標物件中,所有可以增強的方法

pointcut切入點:目標物件,以及增強的方法

advice通知/增強: 增強的程式碼

target目標物件:被代理的物件

weaving織入:將通知應用到切入點的過程

proxy代理:將通知織入到目標物件之後,形成代理物件

 

AOP中的一個重要等式:

  •  切面(aspeect)=切點+通知  
  •  advisor=cutpoint+advice
  •  切面: 定義的一個攔截事件(動作)
  •  切點: 要攔截哪些(個)類的哪些(個)方法
  •  通知: 定義在方法的前面、後面、環繞、出異常 還是 正常返回的時候攔