AOP是面向对象编程,纵向重复,横向抽取
什么是代理?
生活中的例子比如说:
找明星拍戏,上综艺,唱歌。。。直接找明星,说明明星知名度不是很大。如果明星的名气够大,那就不能直接访问,必须通过明星的经纪人,然后由经纪人访问明星。经纪人就是明星的代理。
放在程序中,有一个目标对象,有一个代理对象。你想访问目标对象,必须通过代理对象,由代理对象决定访问目标对象。Java提供了一个类proxy能够实现代理
Spring AOP利用了代理技术,主要用于service层的事务管理
Spring实现aop的两种方法
(1)动态代理:被代理对象必须实现接口。如果没有实现接口则不能实现动态管理
手动实现动态代理
准备一个UseService接口 UserServiceImpl实现类
public interface UserService {
void add();
void delete();
void update();
void find();
}
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("添加用户");
}
@Override
public void delete() {
System.out.println("删除用户");
}
@Override
public void update() {
System.out.println("修改用户");
}
@Override
public void find() {
System.out.println("查找用户");
}
}
准备一个获得UserService代理对象的类,获取代理对象,通过调用Proxy的newProxyInstance方法,传递三个参
数,一 本类的加载器 二代理对象的借口(实现类的接口),三 传入this,这样就得到了一个代理对象。实现代理
对象的方法,让这个类InvocationHandler接口。实现它的方法invoke(代理的对象,调用的方法,方法的参数)
被代理的对象方法,还是要被调用,所有调用method.invoke()两个参数,一个是被代理对象,参数 给该类加上一
个属性被代理对象,并且给该类添加构造函数。再调用被代理对象方法的前后,可以加上对应的内容。
public class UserServiceProxyFactory implements InvocationHandler {
private UserService userService;
public UserService getUserServiceProxy(){ UserService userServiceProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), this); return userServiceProxy; }
//构造函数 public UserServiceProxyFactory(UserService userService) { this.userService = userService; }
//invoke代理 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开启事务");
Object invoke = method.invoke(userService, args);
System.out.println("关闭事务");
return invoke;
}
}
|
测试
@Test public void fun(){ UserService us = new UserServiceImpl(); UserServiceProxyFactory uspf = new UserServiceProxyFactory(us); UserService userServiceProxy = uspf.getUserServiceProxy(); userServiceProxy.add(); userServiceProxy.delete(); userServiceProxy.find(); userServiceProxy.update(); }
|
|
(2)cglib代理
public class UserServiceProxyFactory2 implements MethodInterceptor {
public UserService getUserServiceProxy(){ //帮助我们生成代理对象 Enhancer enhancer = new Enhancer(); //设置对谁进行代理 enhancer.setSuperclass(UserServiceImpl.class); //回调方法 enhancer.setCallback(this); //生成代理对象 UserService userServiceProxy = (UserService) enhancer.create(); //返回代理对象 return userServiceProxy; }
@Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("开启事务"); Object o1 = methodProxy.invokeSuper(o, objects); System.out.println("关闭事务"); return o1; } }
|
测试
@Test public void fun1(){ UserServiceProxyFactory2 uspf = new UserServiceProxyFactory2(); UserService userServiceProxy = uspf.getUserServiceProxy(); userServiceProxy.add(); userServiceProxy.update(); userServiceProxy.find(); userServiceProxy.delete(); }
|
|