文章目录
一、什么是AOP?
AOP(Aspect Oriented Programming)
,即面向切面编程,是OOP的补充,它也提供了模块化。在面向对象编程中,关键的单元是对象,AOP的关键单元是切面,或者说关注点(可以简单地理解为你程序中的独立模块)。一些切面可能有集中的代码,但是有些可能被分散或者混杂在一起,例如日志或者事务。这些分散的切面被称为横切关注点。一个横切关注点是一个可以影响到整个应用的关注点,而且应该被尽量地集中到代码的一个地方,例如事务管理、权限、日志、安全等。
AOP让你可以使用简单可插拔的配置,在实际逻辑执行之前、之后或周围动态添加横切关注点。这让代码在当下和将来都变得易于维护。如果你是使用XML来使用切面的话,要添加或删除关注点,你不用重新编译完整的源代码,而仅仅需要修改配置文件就可以了。
二、AOP底层原理
1. AOP底层使用动态代理
有两种情况动态代理
第一种:有接口情况,使用JDK动态代理
第二种:没有接口情况,使用CGLIB动态代理
2. JDK动态代理(工厂模式的内容)
需求:需要对一个实现了Human接口的Superman类进行功能的增强。
interface Human{
String belief();
void eat(String food);
}
//被代理类
class Superman implements Human{
@Override
public String belief() {
return "I BELIEVE I CAN FLY";
}
@Override
public void eat(String food) {
System.out.println("I like eating "+food);
}
}
要想实现动态代理,需要解决以下问题:
- 如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象?
- 当通过代理类的对象调用方法时,如何动态的去调用被代理类中的同名方法?
//代理工厂
class ProxyFactory{
public static Object getProxyInstance(Object obj){
//obj:被代理的类对象,类型为Object方便扩展
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法前增强"+method.getName()+"...."+ Arrays.toString(args));
Object res = method.invoke(obj,args);
System.out.println