Spring AOP
概念
- (1)AOP(Aspect Oriented Programming)是面向切面编程]。
就是通过预编译方式和运行期动态代理实现程序功能的统一维护的
一种技术。
简单说就是在不改变方法原代码的基础上,对方法进行功能增强
本质上是生成了一个新的类,叫做代理类 - (2)AOP对程序的扩展方式采用动态代理的方式.(JDK动态代理
和Cglib动态代理两种方式)
Spring动态代理
- 》Proxy类的方法
Proxy类的静态方法可以创建代理对象
static Object newProxyInstance(ClassLoader loader, Class<?>interfaces,
lnvocationHandler h)l - 》三个参数
参数1:ClassLoader loader类加载器﹐用来加载代理对象
参数2:Class<?>interfaces目标类的字节码对象数组.因为代理
的是接口,需要知道接口中所有的方法
参数3:InvocationHandler h执行句柄,代理对象处理的核心逻辑就
在该接口中
案例(日志跟踪)
代理类AddLog
/**
* 添加方法
*/
public void add(){
System.out.println("add User");
}
/**
* 更新方法
*/
public void update(){
System.out.println("update User");
}
/**
* 删除方法
*/
public void delete(){
System.out.println("delete User");
}
代理类接口IAddLog
void add();
void update();
void delete();
动态代理
@Test
public void function(){
//生成代理类,创建该类对象
AddLog addLog = new AddLog();
Logger logger = LoggerFactory.getLogger(AddLog.class);
//创建一个代理类,创建该类的对象
ClassLoader classLoader = AddLog.class.getClassLoader();
Class<?>[] interfaces = AddLog.class.getInterfaces();
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//调用IAddLog类的方法
//调用Logger类的debug
Object invoke = method.invoke(addLog, args);
logger.debug("fangfaming:"+method.getName());
return invoke;
}
};
IAddLog iAddLog = (IAddLog) Proxy.newProxyInstance(classLoader,interfaces,handler);
iAddLog.add();
iAddLog.delete();
iAddLog.update();
}