面向切面编程 (Aspect Oriented Programming,简称AOP) 是Spring的一个重要特性,其原理是采用动态代理方式实现。
下面通过一个Demo来模拟AOP实现
整个代码目录结构如下:
其中LogInterceptor类完成为所有Service方法添加日志记录的功能。
1、Dao层实现
package com.dao; public class UserDaoImpl implements UserDao { @Override public void save() { System.out.println("excute save;"); } @Override public void delete() { System.out.println("excute delete;"); } }
2、拦截器类实现
package com.handler; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class LogInterceptor implements InvocationHandler{ private Object target; public void setTarget(Object target) { this.target = target; } public void beforMethod(Method method) { System.out.println(method.getName() +" start."); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { beforMethod(method); method.invoke(target, args); return null; } }
3、AOP实际执行时是通过动态代理,对上述拦截器进行包装生成的代理类来完成切面功能的,测试如下:
package com.test; import java.lang.reflect.Proxy; import org.junit.Test; import com.dao.UserDao; import com.dao.UserDaoImpl; import com.handler.LogInterceptor; public class TestAop { @Test public void testAopProxy() { UserDao userDao = new UserDaoImpl(); LogInterceptor logInterceptor = new LogInterceptor(); logInterceptor.setTarget(userDao); UserDao proxyDao = (UserDao) Proxy.newProxyInstance(userDao.getClass() .getClassLoader(), new Class[]{UserDao.class}, logInterceptor); proxyDao.save(); proxyDao.delete(); } }
测试结果如下: