基于SpringAOP的代理设计模式编程式实现
代理目标及其实现类
package com.aop.example;
/***
* TODO TCF 被代理的接口,基于jdk动态代理
* @author 71485
*
*/
public interface HelloAop {
//TODO TCF 被代理的目标方法
public void show(String name);
}
package com.aop.example;
/**
* TODO TCF HelloAop接口实现类
* @author 71485
*
*/
public class HelloAopImpl implements HelloAop{
@Override
public void show(String name)
{
System.out.println("======Hello,"+name+"======");
}
}
1.静态代理
package com.aop.example.statics;
import org.apache.log4j.Logger;
import com.aop.example.HelloAop;
/***
* TODO TCF 静态代理类
* @author 71485
*
*/
public class HelloAopProxy implements HelloAop{
private Logger logger=Logger.getLogger(HelloAopProxy.class);
//TODO TCF 构造注入的目标代理对象
private HelloAop helloAop;
public HelloAopProxy(HelloAop helloAop)
{
this.helloAop=helloAop;
}
//TODO TCF 前置增强
public void before()
{
logger.debug("前置增强功能.....");
}
//TODO TCF 后置增强
public void afterReturning()
{
logger.debug("后置增强功能.....");
}
//TODO TCF 汉堡=上中下
public void show(String name)
{
before();
helloAop.show(name);
afterReturning();
}
}
2.JDK动态代理
package com.aop.example.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.aop.example.HelloAop;
/***
* TODO TCF 代理目标为接口的JDK动态代理DEMO
* aop:aspectj-autoproxy proxy-target-class="false"
* @author 71485
*
*/
public class JDKDynamicProxy implements InvocationHandler{
//TODO TCF 被代理的目标对象
private HelloAop helloAop;
public JDKDynamicProxy(HelloAop helloAop)
{
this.helloAop=helloAop;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
//TODO TCF 动态代理,前置增强处理
before();
//TODO TCF 代理方法执行
//TODO TCF 代理的目标实例,方法执行参数
Object result=method.invoke(helloAop, args);
//TODO TCF 动态代理,后置增强
after();
return result;
}
public void before()
{
System.out.println("JDK前置增强.....");
}
public void after()
{
System.out.println("JDK后置增强.....");
}
//TODO TCF 构建代理类实例并返回
public HelloAop getProxy()
{
//TODO TCF jdk动态代理
//TODO TCF 创建代理实例,传入类加载器、代理目标类的接口、当前实现InvocationHandle接口的动态代理类实例
return (HelloAop)Proxy.newProxyInstance(
this.helloAop.getClass().getClassLoader(),
this.helloAop.getClass().getInterfaces(),
this);
}
}
3.CGLIB动态代理
package com.aop.example.dynamic;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import com.aop.example.HelloAopImpl;
/**
* TODO TCF 代理任意目标类的CGLIB动态代理DEMO
* aop:aspectj-autoproxy proxy-target-class="true"
* @author 71485
*
*/
public class CGLibDynamicProxy implements MethodInterceptor{
//TODO TCF 代理的目标实例
private HelloAopImpl helloAopImpl;
//TODO TCF 创建代理实例并返回
public Object getInstance(HelloAopImpl helloAopImpl)
{
this.helloAopImpl=helloAopImpl;
Enhancer enhancer=new Enhancer();
//TODO TCF 设置代理的目标
enhancer.setSuperclass(HelloAopImpl.class);
//TODO TCF 设置回调
enhancer.setCallback(this);
//TODO TCF 创建并返回代理类实例
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable
{
before();
Object result=methodProxy.invokeSuper(obj,arg);
after();
return result;
}
//TODO TCF 前置增强
public void before()
{
System.out.println("CGLIB动态代理——前置增强......");
}
//TODO TCF 后置增强
public void after()
{
System.out.println("CGLIB动态代理——后置增强......");
}
}
4.封装通用的JDK动态代理类
package com.aop.example.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/***
* TODO TCF 基于单例模式封装通用的JDK动态代理类
* @author 71485
*
*/
public class JDKDynamicProxyRebuild implements InvocationHandler{
//TODO TCF 目标代理实例
private Object target;
//TODO TCF 构造注入目标代理实例
public JDKDynamicProxyRebuild(Object target)
{
this.target=target;
}
//TODO TCF 创建代理类实例
//TODO TCF 代理目标入参,返回对应类型的动态代理类实例
@SuppressWarnings("unchecked")
public <T> T getProxy(Class<T> obj)
{
return (T)Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
//TODO TCF 代理织入和执行
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
before();
Object result=method.invoke(target, args);
after();
return result;
}
//TODO TCF 前置增强
public void before()
{
System.out.println("JDK动态代理封装——前置增强......");
}
//TODO TCF 后置增强
public void after()
{
System.out.println("JDK动态代理封装——后置增强......");
}
}
5.封装通用的CGLIB动态代理类
package com.aop.example.dynamic;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
/**
* TODO TCF 基于CGLIB动态代理封装的通用动态代理类
* @author 71485
*
*/
public class CGLibDynamicProxyRebuild implements MethodInterceptor{
//TODO TCF 代理类实例
private static CGLibDynamicProxyRebuild dynamicProxy=new CGLibDynamicProxyRebuild();
//TODO TCF 私有构造,外界无法创建动态代理类实例
private CGLibDynamicProxyRebuild()
{
}
//TODO TCF 单例模式,饿汉模式:类加载速度慢,获取对象速度快,线程安全,不能延迟加载
public static CGLibDynamicProxyRebuild getInstance()
{
return dynamicProxy;
}
//TODO TCF 创建动态代理类实例
@SuppressWarnings("unchecked")
public <T> T getProxy(Class<T> cls)
{
return (T)Enhancer.create(cls,this);
}
//TODO 代理织入和执行
@Override
public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable
{
before();
Object result=methodProxy.invokeSuper(target,args);
after();
return result;
}
//TODO TCF 前置增强
public void before()
{
System.out.println("CGLIB动态代理封装——前置增强......");
}
//TODO TCF 后置增强
public void after()
{
System.out.println("CGLIB动态代理封装——后置增强......");
}
}
6.测试类测试结果
package com.aop.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.aop.example.HelloAop;
import com.aop.example.HelloAopImpl;
import com.aop.example.dynamic.CGLibDynamicProxy;
import com.aop.example.dynamic.CGLibDynamicProxyRebuild;
import com.aop.example.dynamic.JDKDynamicProxy;
import com.aop.example.dynamic.JDKDynamicProxyRebuild;
import com.aop.example.statics.HelloAopProxy;
public class Test {
@SuppressWarnings(value = "unchecked")
public static void main(String[] args)
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext-mybatis.xml");
//TODO TCF JDK Dynamic Proxy
HelloAop helloAop=new HelloAopImpl();
JDKDynamicProxy proxy=new JDKDynamicProxy(helloAop);
proxy.getProxy().show("zhangsan");
//TODO TCF CGLIB Dynamic Proxy
HelloAopImpl helloAopImpl=new HelloAopImpl();
CGLibDynamicProxy proxy2=new CGLibDynamicProxy();
Object cglibProxy=proxy2.getInstance(helloAopImpl);
HelloAopImpl realProxy=(HelloAopImpl)cglibProxy;
realProxy.show("lisi");
//TODO TCF JDK Dynamic Proxy Rebuild
HelloAop helloAop2=new HelloAopImpl();
JDKDynamicProxyRebuild rebuild=new JDKDynamicProxyRebuild(helloAop2);
HelloAop proxy3=rebuild.getProxy(HelloAop.class);
proxy3.show("wangwu");
//TODO TCF CGLIB Dynamic Proxy Rebuild
CGLibDynamicProxyRebuild rebuild2=CGLibDynamicProxyRebuild.getInstance();
HelloAopImpl helloAopImpl2=rebuild2.getProxy(HelloAopImpl.class);
helloAopImpl2.show("zhaoliu");
}
}