抽象对象:声明了真实对象和代理对象的公共接口;
真实对象:代理对象所代表的真实对象,也是最终被引用的对象;
代理对象:包含真实对象从而操作真实主题对象,相当于访问者与真实对象直接的中介。
主要分为三部分:目标接口和目标类、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
*/Spring AOP事务管理:Spring通过TransactionInterceptor拦截器对@Transactional注解进行拦截,然后生成Proxy代理类,并在代理中添加事务增强(事务开启、事务提交以及事务回滚)。