一.什麼是AOP
面向切面編程,簡單描述就是在一個方法前後增加任何想做的事情,比如添加日誌信息,統一異常處理,統一請求信息打印,統一分頁處理等等;
二.靜態代理
寫個簡單的代理模式,更有助於理解
用戶添加功能,impl實現類
package com.huajie.aop.day1.service.imp;
import com.huajie.aop.day1.service.UserService;
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("添加數據");
}
}
接口
package com.huajie.aop.day1.service;
public interface UserService {
void add();
}
正常情況,new UserServiceImpl 對象 調用add方法
代理模式會寫一個接口的代理類,在 用戶 add方法前後 可以加上自己的代碼處理
package com.huajie.aop.day1.aspect;
import com.huajie.aop.day1.service.UserService;
public class UserServiceProxy {
private UserService userService;
public UserServiceProxy(UserService userService) {
this.userService = userService;
}
public void add(){
System.out.println("事物開啓");
userService.add();
System.out.println("事物結束");
}
}
測試類如下
package com.huajie.aop.day1.aspect;
import com.huajie.aop.day1.service.UserService;
import com.huajie.aop.day1.service.imp.UserServiceImpl;
/**
* @author Administrator
* 靜態代理測試
*/
public class test001 {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserServiceProxy userServiceProxy = new UserServiceProxy(userService);
userServiceProxy.add();
}
}
測試效果
三,java動態代理
java中動態代理是通過反射技術,類實現InvocationHandler接口 來實現動態代理的
關鍵實現代碼如下
獲取代理對象
public static <T> T getObjectProxy(T objSrevice) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
InvocationHandlerImpl2 invocationHandlerImpl = new InvocationHandlerImpl2(objSrevice);
ClassLoader loader = objSrevice.getClass().getClassLoader();
Class<?>[] interfaces = objSrevice.getClass().getInterfaces();
T newProxyInstance = (T) Proxy.newProxyInstance(loader, interfaces, invocationHandlerImpl);
return newProxyInstance;
}
反射執行類的方法,並在方法執行的前後 添加自己的代碼程序
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object reuslt = null;
System.out.println("----動態代理之前------");
reuslt = method.invoke(target, args);
System.out.println("----動態代理之後------");
return reuslt;
}
完成代碼如下
package com.huajie.aop.day1.aspect;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.huajie.aop.day1.service.UserService;
import com.huajie.aop.day1.service.imp.UserServiceImpl;
public class InvocationHandlerImpl2 implements InvocationHandler {
private Object target;
public InvocationHandlerImpl2(Object target) {
this.target = target;
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
UserService userSrevice1 = new UserServiceImpl();
UserService userProxy = getObjectProxy(userSrevice1);
userProxy.add();
}
public static <T> T getObjectProxy(T objSrevice) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
InvocationHandlerImpl2 invocationHandlerImpl = new InvocationHandlerImpl2(objSrevice);
ClassLoader loader = objSrevice.getClass().getClassLoader();
Class<?>[] interfaces = objSrevice.getClass().getInterfaces();
T newProxyInstance = (T) Proxy.newProxyInstance(loader, interfaces, invocationHandlerImpl);
return newProxyInstance;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object reuslt = null;
System.out.println("----動態代理之前------");
reuslt = method.invoke(target, args);
System.out.println("----動態代理之後------");
return reuslt;
}
}
測試效果:
java動態代理有助於理解springAOP,spring中使用的是cglib技術實現,效率更快,但思想上相同。