Spring详解之AOP代理(四)

AOP是面向对象编程,纵向重复,横向抽取

Spring详解之AOP代理(四)

什么是代理?

生活中的例子比如说:

找明星拍戏,上综艺,唱歌。。。直接找明星,说明明星知名度不是很大。如果明星的名气够大,那就不能直接访问,必须通过明星的经纪人,然后由经纪人访问明星。经纪人就是明星的代理。

放在程序中,有一个目标对象,有一个代理对象。你想访问目标对象,必须通过代理对象,由代理对象决定访问目标对象。Java提供了一个类proxy能够实现代理

Spring AOP利用了代理技术,主要用于service层的事务管理

Spring详解之AOP代理(四)

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();
}