Skip to content

Latest commit

 

History

History
83 lines (66 loc) · 2.42 KB

File metadata and controls

83 lines (66 loc) · 2.42 KB

Java学习笔记-06 动态代理

1 代理模式

抽象对象:声明了真实对象和代理对象的公共接口
真实对象:代理对象所代表的真实对象,也是最终被引用的对象;
代理对象:包含真实对象从而操作真实主题对象,相当于访问者与真实对象直接的中介。

2 动态代理

主要分为三部分:目标接口和目标类、InvocationHandler代理逻辑实现类以及Proxy代理工具类。下面给出一个简单的实例:

//目标接口和目标类
interface toolFactory {
    void printHelloWorld();
}

public class aFactory implements toolFactory {
    @Override
    public void printHelloWorld() {
        System.out.println("HelloWorld");
    }
}

//InvocationHandler代理逻辑实现类
public class factoryProxy implements InvocationHandler {

    private Object factory;

    public factoryProxy(Object factory) {
        this.factory = factory;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        doSomethingBefore();
        System.out.println("Proxy object : " + proxy.getClass());
        System.out.println("Method : " + method.getName());
        //通过反射来实现接口的方法
        Object ret = method.invoke(factory, args);
        doSomethingAfter();
        return ret;
    }

    //获取动态代理实例
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
    }

    //模拟业务增强
    public void doSomethingBefore() {
        System.out.println("before");
    }

    public void doSomethingAfter() {
        System.out.println("after");
    }
}

//生成实例
public class ProxyTest {
    public static void main(String[] args) {
        toolFactory afactory = new aFactory();
        factoryProxy factoryproxy = new factoryProxy(afactory);
        //生成Proxy代理类
        toolFactory aaFactory1 = (toolFactory) factoryproxy.getProxyInstance();
        aaFactory1.printHelloWorld();
    }
}

/**输出结果:
before
Proxy object : class $Proxy0
Method : printHelloWorld
HelloWorld
after
*/

3 动态代理的应用

Spring AOP事务管理:Spring通过TransactionInterceptor拦截器对@Transactional注解进行拦截,然后生成Proxy代理类,并在代理中添加事务增强(事务开启、事务提交以及事务回滚)。