Java动态代理模拟spring的AOP
2015-06-08 16:36
661 查看
spring中的AOP是通过Java的动态代理实现的,有关动态代理的详细解释参见:
1.建立实体对象
2.建立接口
3.实现接口
4.创建拦截器(这个类就相当于aop中的切面类)
5.通过代理对象实现目标方法
6.程序输出
http://dyygusi.iteye.com/blog/1994843
现在就使用Java的动态代理模拟AOP(使用JDK的动态代理)1.建立实体对象
public class User { Integer id; String name; String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } //setter/getter }
2.建立接口
public interface UserDao { public void addUser(User user); }
3.实现接口
public class UserDaoImpl implements UserDao{ @Override public void addUser(User user){ System.out.println("保存User到数据库中"); throw new RuntimeException(); } }
4.创建拦截器(这个类就相当于aop中的切面类)
public class MyInterceptor implements InvocationHandler { private Object target; public MyInterceptor() { } public MyInterceptor(Object target) { this.target = target; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } public void before() { System.out.println("这是一个前置通知"); } public void afterReturning() { System.out.println("这是一个后置通知"); } public void afterThrowing() { System.out.println("这是一个异常通知"); } public void after() { System.out.println("这是一个最终通知"); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnValue = null; try { before(); returnValue = method.invoke(target, args); afterReturning(); } catch (Exception e) { afterThrowing(); } finally { after(); } return returnValue; } }
5.通过代理对象实现目标方法
@Test public void testAOP() { UserDao userDao = new UserDao(); MyInterceptor interceptor = new MyInterceptor(); interceptor.setTarget(userDao); //通过代理的静态方法创建一个代理对象 //这个代理创建的时候,接收了接口类型和拦截器的处理类,在代理的背后,他会调运拦截器的invoke这个方法。 //因为传递的有接口类型,所以可以强制类型转换到我们指定的接口类型 UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(this.getClass().getClassLoader(), userDao.getClass().getInterfaces(), interceptor); //然后在代理对象处理的时候,就会将我的逻辑织如到被代理的对象上 userDaoProxy.addUser(new User(1, "a", "b")); }
6.程序输出
这是一个前置通知 保存User到数据库中 这是一个异常通知 这是一个最终通知
相关文章推荐
- Java解析XML文件的两种方式详解
- spring中aop的简单使用(Annotation方式)
- Java中的代理的使用
- Java中class是如何加载到JVM中的(Class.forName("name")和ClassLoader.loadClass("name")的区别)
- Java获取package下所有的class对象(普通文件包和Jar文件包)
- Java中交换两个数的各种方法
- Java开发前奏
- Java中的日期处理工具DateTime
- struts2 简介
- WAS7.0安装补丁升级程序无法替换文件 java/docs/autorun.inf解决办法
- WAS7.0安装补丁升级程序无法替换文件 java/docs/autorun.inf解决办法
- 【Java教程】 正确使用 Volatile 变量-潭州JAVA
- Struts2动态方法调用的方式...
- java抽象类和接口的区别
- java日期加减
- java源码分析之LinkedList
- Java中getResourceAsStream用法分析
- java代码打包成jar以及转换为exe
- java中对字符串的操作
- java 字节流与字符流的区别