spring动态代理
接下来我们来体会下动态代理带给我们的便利
package aop006; public interface Girl { public void KFC(String datetime); public void meet(String datetime); }
package aop006; /* * */ public class Girl1 implements Girl{ public void KFC(String datetime){ System.out.println("[核心业务逻辑]我是第一个女孩"); System.out.println("[核心业务逻辑]"+datetime+"吃肯德基"); } public void meet(String datetime){ System.out.println("[核心业务逻辑]我是第一个女孩"); System.out.println("[核心业务逻辑]"+datetime+"约会"); } }
package aop006; /* * */ public class Girl2 implements Girl { public void KFC(String datetime){ System.out.println("[核心业务逻辑]我是第二个女孩"); System.out.println("[核心业务逻辑]"+datetime+"吃肯德基"); } public void meet(String datetime){ System.out.println("[核心业务逻辑]我是第二个女孩"); System.out.println("[核心业务逻辑]"+datetime+"约会"); } }
package aop006; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class GirlHandler implements InvocationHandler { /* * 返回的是原来目标方法所返回的内容 */ private Object target; public GirlHandler(Object target){ this.target=target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //前置任务 before(); //具体业务逻辑代码 Object returnValue=method.invoke(target, args); //后置任务 after(); return returnValue; } public void before(){ //前置任务 System.out.println("【代理前置】洗澡"); System.out.println("【代理前置】化妆"); System.out.println("【代理前置】穿衣服"); System.out.println("*****************"); } public void after(){ //后置任务 System.out.println("*****************"); System.out.println("【代理后置】卸妆"); System.out.println("【代理后置】洗澡"); System.out.println("【代理后置】睡觉"); } }
从这个代理类我们可以发现如果我们要改非业务代码时只需要改一次。
package aop006; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /* * 增加一个代理类,类似与明星的经纪人 * 把核心的业务逻辑的代码 和 非核心的 分离 * 把非核心的代码交给经纪人(proxy)去管理, * 注意:经纪人和要明星,必须实现同一个接口 */ public class Test { public static void main(String[] args) { //1.创建目标实现类的实例 Girl g1 = new Girl1(); Girl g2 = new Girl2(); //2.创建一个动态的代理类 InvocationHandler handler1=new GirlHandler(g1); InvocationHandler handler2=new GirlHandler(g2); //创建一个动态代理 Girl girlProxy1=(Girl)Proxy.newProxyInstance(g1.getClass().getClassLoader(), g1.getClass().getInterfaces(),handler1); girlProxy1.KFC("周六"); girlProxy1.meet("周六"); Girl girlProxy2=(Girl)Proxy.newProxyInstance(g1.getClass().getClassLoader(), g2.getClass().getInterfaces(),handler2); girlProxy2.KFC("周日"); girlProxy2.meet("周日"); /*g1.KFC("周六"); g1.meet("周日"); g2.KFC("周六"); g2.meet("周日");*/ } }
运行结果如下:
截图没截完我相信聪明的你一定知道没截完的是如何的。
接下来会介绍使用配置文件实现动态代理。