标签:AOP
什么是AOP?就是代理机制:
joinpoit:连接点,指的是那些方法【可以】被拦截
pointcut:切入点,对哪些joinpoint进行拦截
advice:通知,指的是 【要 】增强的代码,(方法级别的增强)
introduction:引介,指的是一种特殊方式的advice(类级别的增强,在原有类上添加一个属性或者方法)
以下是底层实现demo演示
接口类:
package cn.spring3.demo1;
/**
* @author NOP
* DAO接口
*/
public interface UserDao {
public void add();
public void update();
}
实现类:
package cn.spring3.demo1;
public class UserDaoImpl implements UserDao {
public void add() {
// TODO Auto-generated method stub
System.out.println("添加用户");
}
public void update() {
// TODO Auto-generated method stub
System.out.println("修改用户");
}
}
传统方式调用:
package cn.spring3.demo1;
import org.junit.Test;
public class SpringTest1 {
@Test
public void demo1() {
UserDao userDao = new UserDaoImpl();
userDao.add();
userDao.update();
}
}
如果增强add方法,怎么做呢?
方法一:
package cn.spring3.demo1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author NOP JDK动态类里的机制
* 直接实现Handler,所以JDKProxy自身就是Handler
*/
public class JDKProxy implements InvocationHandler {
private UserDao userDao;
public JDKProxy(UserDao userDao) {
super();
this.userDao = userDao;
}
public UserDao createProxy() {
/**
* invocationHandler两种方式,一种匿名内部类的方式见JDKProxy1.java
*/
UserDao proxy = (UserDao) Proxy.newProxyInstance(userDao.getClass()
.getClassLoader(), userDao.getClass().getInterfaces(), this);
return proxy;
}
//调用目标对象的任何一个方法都相当于调用invoke();
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
if("add".equals(method.getName())){
System.out.println("===日志记录===");
Object result = method.invoke(userDao, args);
return result;
}
return method.invoke(userDao, args);
}
}
方法二:
package cn.spring3.demo1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author NOP JDK动态类里的机制
*/
public class JDKProxy1 {
private UserDao userDao;
public JDKProxy1(UserDao userDao) {
super();
this.userDao = userDao;
}
public UserDao createProxy() {
/**
* invocationHandler两种方式
*/
UserDao proxy = (UserDao) Proxy.newProxyInstance(userDao.getClass()
.getClassLoader(), userDao.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// TODO Auto-generated method stub
if (method.getName().equals("add")) {
System.out.println("===匿名内部类方式记录logs日志====");
Object result = method.invoke(userDao, args);
return result;
}
return method.invoke(userDao, args);
}
});
return proxy;
}
}
编写测试类
对应JDKProxy.java
@Test
public void demo2() {
//被代理对象
UserDao userDao = new UserDaoImpl();
//创建代理对象的时候传入被代理对象
UserDao proxy = new JDKProxy(userDao).createProxy();
proxy.add();
proxy.update();
}
测试结果:
===日志记录===
添加用户
修改用户
对应JDKProxy1.java
@Test
public void demo3() {
UserDao userDao = new UserDaoImpl();
UserDao proxy = new JDKProxy1(userDao).createProxy();
proxy.add();
proxy.update();
}
测试结果:
===匿名内部类方式记录logs日志====
添加用户
修改用户
标签:AOP
原文地址:http://blog.51cto.com/4534309/2112067