SSM基础框架之SpringAOP
Spring AOP背景
-
在开发中,分布于应用中多处的功能被称为横切关注点(cross-cutting concerns).通常这些横切关注点从概念上是与应用的核心业务逻辑相分离的。将这些横切关注点与核心业务逻辑相分离,这就是面向切面编程(AOP)所要解决的问题
-
依赖注入有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦
**
Spring的动态代理
- JDK动态代理 ->通过Proxy类的方法
- Proxy类的静态方法可以创建代理对象
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
三个参数
- ClassLoader loader:类加载器 可以加载代理对象
-Class<?>[] interfaces:目标的字节码对象数组,代理的是接口所以要知道所有的方法
-InvocationHandler h:执行语句,代理的对象核心处理逻辑就在该接口中
案例测试
- TestJdkProxy
public class TestJdkProxy {
public static void main(String[] args) {
//Jdk代理
//ILaoZong
Girl girl = new Girl();
Boy boy = new Boy();
//1 创建一个代理类,创建该类的对象
ClassLoader classLoader = Girl.class.getClassLoader();
Class[] interfaces= new Class[]{IGirl.class};
//处理器
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
boy.huazhuang();
//调 eat()
//method 被增加的方法
Object returnValue = method.invoke(girl,args);
boy.chuanyifu();
return returnValue;
}
};
IGirl Girl = (IGirl) Proxy.newProxyInstance(classLoader,interfaces,handler);
Girl.eat();
}
- Girl
public class Girl implements IGirl {
public void eat(){
System.out.println("吃肯德基");
System.out.println("吃麦当劳");
}
}
- IGirl
public interface IGirl {
void eat();
}
- Boy
public class Boy {
public void huazhuang(){
System.out.println("化妆");
}
public void chuanyifu(){
System.out.println("穿衣服");
}
}
测试最终结果: