标签:modify ota 它的 call author 处理 bit ret 操作
package com.xbmu.a.aop; public interface Subject { String request(); }RealSubject.java
package com.xbmu.a.aop; /** * 真实主题 * @author bitaotao * */ public class RealSubject implements Subject{ @Override public String request() { return "请收取1000元整"; } }ProxySubject.java
package com.xbmu.a.aop; /** * 代理主题 * @author bitaotao * */ public class ProxySubject implements Subject{ private Subject subject; private String str; @Override public String request() { if(subject == null){ subject = new RealSubject(); } str = subject.request(); //添加的业务逻辑 str = str.replaceAll("1000", "2000"); return str; } }App.java
package com.xbmu.a.aop; public class App { public static void main(String[] args) { Subject subject = new RealSubject(); System.out.println("真实主题:"+subject.request()); System.out.println("==================="); Subject proxySubject = new ProxySubject(); System.out.println("代理主题:"+proxySubject.request()); } }
package com.xbmu.b.staticproxy; public interface IUserManager { void addUser(String username,String passwd); void deleteUser(String username,String passwd); void modifyUser(String username,String passwd); String findUser(String username); }UserManagerImpl.java
package com.xbmu.b.staticproxy; public class UserManagerImpl implements IUserManager { @Override public void addUser(String username, String passwd) { System.out.println("这是UserManagerImpl类中的addUser方法"); } @Override public void deleteUser(String username, String passwd) { System.out.println("这是UserManagerImpl类中的deleteUser方法"); } @Override public void modifyUser(String username, String passwd) { System.out.println("这是UserManagerImpl类中的modifyUser方法"); } @Override public String findUser(String username) { System.out.println("这是UserManagerImpl类中的findUser方法"); return "btt"; } }UserManagerProxy.java
package com.xbmu.b.staticproxy; public class UserManagerProxy implements IUserManager { private IUserManager userManager; public UserManagerProxy() { super(); } public UserManagerProxy(IUserManager userManageImpl) { super(); if(userManager == null){ this.userManager = userManageImpl; } } @Override public void addUser(String username, String passwd) { checkSecurity(); userManager.addUser(username, passwd); } @Override public void deleteUser(String username, String passwd) { checkSecurity(); userManager.deleteUser(username, passwd); } @Override public void modifyUser(String username, String passwd) { checkSecurity(); userManager.modifyUser(username, passwd); } @Override public String findUser(String username) { checkSecurity(); userManager.findUser(username); return "bitaotao"; } private void checkSecurity(){ System.out.println("检查用户信息"); } }App.java
package com.xbmu.b.staticproxy; public class App { public static void main(String[] args) { IUserManager userManager = new UserManagerImpl(); userManager.addUser("btt", "123"); System.out.println("=========================="); IUserManager userManagerProxy = new UserManagerProxy(userManager); userManagerProxy.addUser("btt", "123"); } }
package com.xbmu.c.jdkProxy; public interface IUserManager { void saveUser(String username,String password); void updateUser(String username,String password); void deleteUser(String username); String findUser(String username); }UserManagerImpl.java
package com.xbmu.c.jdkProxy; public class UserManagerImpl implements IUserManager{ @Override public void saveUser(String username, String password) { System.out.println("UserManagerImpl---saveUser"); } @Override public void updateUser(String username, String password) { System.out.println("UserManagerImpl---updateUser"); } @Override public void deleteUser(String username) { System.out.println("UserManagerImpl---deleteUser"); } @Override public String findUser(String username) { System.out.println("UserManagerImpl---findUser"); return username; } }JdkProxy.java
package com.xbmu.c.jdkProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /**Aspect(切面): 通知要放置到一个类中,那么该类就是切面,JdkProxy*/ public class JdkProxy implements InvocationHandler { Object userManage = null; /** * 百度解释: * Weaving(织入): * 织入,AOP术语。把切面(aspect)连接到其它的应用程序类型或对象上, * 并创建一个被通知 (advised)的对象,这样的行为叫做织入。 * Weaving(织入): * 是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象。 * 织入相当于将目标对象和代理对象关联起来 * */ public Object createProxyInstance(Object userManage) { //将真实对象传给代理 this.userManage = userManage; /* * 第一个参数设置代码使用的类加载器,一般采用跟目标类相同的类加载器 * 第二个参数设置代理类实现的接口,跟目标类使用相同的接口 * 第三个参数设置回调对象,当代理对象的方法被调用时,会调用该参数指定对象的invoke方法 */ return Proxy.newProxyInstance(this.userManage.getClass().getClassLoader(), this.userManage.getClass().getInterfaces(), this); } /** * @param proxy 目标对象的代理类实例 * @param method 对应于在代理实例上调用接口方法的Method实例 * @param args 传入到代理实例上方法参数值的对象数组 * @return 方法的返回值 没有返回值时是null */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /** * Pointcut(切入点):目标对象中存在多个方法,只需要对目标对象中多个方法的某些方法进行拦截, * 此时该操作,就叫做切入点 * */ if(method.getName().startsWith("save") || method.getName().startsWith("find")){ checkSecurity(); } System.out.println("代理类:"+proxy.getClass()); System.out.println("方法的名称:"+method.getName()); if(args!=null && args.length>0){ for(Object arg:args){ System.out.println("方法的参数:"+arg); } } //调用目标对象的方法 Object returnValue = method.invoke(this.userManage, args); System.out.println("方法的返回值:"+returnValue); return returnValue; } /**Advice(通知):切入点要做的事情,就是通知(一般指的是方法)*/ public void checkSecurity(){ System.out.println("开始进行安全检查..."); } }App.java
package com.xbmu.c.jdkProxy; public class App { public static void main(String[] args) { IUserManager userManager = new UserManagerImpl(); // userManager.saveUser("zhangsan", "123"); JdkProxy jdkProxy = new JdkProxy(); IUserManager userManageProxy = (IUserManager) jdkProxy.createProxyInstance(userManager); userManageProxy.saveUser("lisi", "456"); System.out.println("/***********************************/"); String user = userManageProxy.findUser("wangwu"); System.out.println("查询用户:"+user); System.out.println("/***********************************/"); userManageProxy.updateUser("zhaoliu", "789"); } }
package com.xbmu.d.cglibProxy; import java.lang.reflect.Method; import net.sf.cglib.core.Signature; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; /**切面*/ public class CglibProxy implements MethodInterceptor { private Object userManager = null; /**织入:将相当于将目标对象和代理对象关联起来*/ public Object createProxyInstance(Object userManage) { this.userManager = userManage; Enhancer enhancer = new Enhancer(); //设置目标对象的父类 enhancer.setSuperclass(this.userManager.getClass()); //开始调用回调函数,调用intercept的方法 enhancer.setCallback(this); //创建代理对象 return enhancer.create(); } /** * @param obj 目标对象代理类的实例 * @param method 代理实例上调用父类方法的Method实例 * @param args 传入到代理实例上方法参数值的对象数组 * @param methodProxy 使用它调用父类的方法 * @return * @throws Throwable */ public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodPrxoy) throws Throwable { /** * Pointcut(切入点):目标对象中存在多个方法,只需要对目标对象中多个方法的某些方法进行拦截, * 此时该操作,就叫做切入点 * */ if(method.getName().startsWith("save") || method.getName().startsWith("find")){ checkSecurity(); } System.out.println("代理类:"+proxy.getClass()); System.out.println("方法的名称:"+method.getName()); if(args!=null && args.length>0){ for(Object arg:args){ System.out.println("方法的参数:"+arg); } } //methodPrxoy方法的使用 Signature signature = methodPrxoy.getSignature();//获取签名 System.out.println("methodPrxoy:"+signature.getName() + " " + signature.getReturnType() + " " + signature.getArgumentTypes()); //调用目标对象的方法 Object returnValue = method.invoke(this.userManager, args); System.out.println("方法的返回值:"+returnValue); return returnValue; } /**Advice(通知):切入点要做的事情,就是通知(一般指的是方法)*/ public void checkSecurity(){ System.out.println("开始进行安全检查..."); } }App.java
package com.xbmu.d.cglibProxy; public class App { public static void main(String[] args) { /**目标对象:表示访问的真实对象*/ IUserManager userManager = new UserManagerImpl(); userManager.saveUser("张三", "123"); /****************************************************/ //使用jdk代理对象访问 /** * 代理对象:在访问真实对象的前后可以添加业务逻辑,添加业务逻辑的类,称之为代理对象, * 简而言之,通过代理对象来访问真实对象 */ CglibProxy cglibProxy = new CglibProxy(); IUserManager userManageProxy = (IUserManager) cglibProxy.createProxyInstance(userManager); /**joinpoint(连接点):程序访问目标的方法,就是连接点,saveUser,findUser,updateUser*/ userManageProxy.saveUser("李四", "456"); String user = userManageProxy.findUser("赵六"); System.out.println("查询用户:"+user); System.out.println("/**********************************/"); userManageProxy.updateUser("王五", "789"); System.out.println("/**********************************/"); } }
重温Spring之旅5——AOP代理对象、JDK动态代理、使用cglib生产代理
标签:modify ota 它的 call author 处理 bit ret 操作
原文地址:http://blog.csdn.net/btt2013/article/details/54666568