AOP:aspect Object programming(面向切面编程)
连接点:是在程序执行过程中某个特定的点,比如某个方法调用的时候或者处理异常的时候
通知(Advice):在切面某个特定的连接点上执行的动作
切入点:通知一个与切入点表达式关联,并在满足这个切入点的连接点上运行
Aop代理:可以是jdk动态代理或cglib代理
JDK动态代理:在jdk1.3以后在其java.lang.reflect里面提供了一个InvocationHandler 和一个Proxy类, 它是基于接口编程的,必须要有一个接口.编写Handler类,继承InvocationHandler接口代码如下:
public interface IUserDao { public void save(); public void update(); public void delete(); }
public class UserDaoIm{ public void save() { System.out.println("保存用户信息"); } public void update() { System.out.println("更新用户信息"); } public void delete() { System.out.println("删除用户信息"); } }
public class Handler implements InvocationHandler{ private Object target; public Handler(Object target){ this.target=target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开始事务提交了....."); method.invoke(target, args); System.out.println("事务提交成功...."); return target; } }
public class Test8 { public static void main(String[] args) { //目标类 IUserDao userDao=new UserDaoIm(); //处理类 Handler handler=new Handler(userDao); //代理 IUserDao proxy=(IUserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), handler); proxy.save(); } }
cglib代理类:不需要接口
public class UserDaoIm{ public void save() { System.out.println("保存用户信息"); } public void update() { System.out.println("更新用户信息"); } public void delete() { System.out.println("删除用户信息"); } }
public class UserHandler implements MethodInterceptor { private Enhancer enhancer= new Enhancer(); public Object getProxyObject(Class clz){ enhancer.setSuperclass(clz); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("开始提交事务了....."); Object object=proxy.invokeSuper(obj, args); return object; } }
public static void main(String[] args) { UserHandler userHandler=new UserHandler(); UserDaoIm userDaoIm=(UserDaoIm)userHandler.getProxyObject(UserDaoIm.class); userDaoIm.save(); }