一.什么是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 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 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中使用的是jdk动态代理(被代理类实现了接口)+cglib技术实现(未实现接口)。