AOP
AOP的官方解释指出AOP可以对业务逻辑的各个方面进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
软件开发追求的是高内聚、低耦合。Spring框架就是为了尽可能的降低程序的耦合度。IOC是降低了类的创建,及类之间引用的耦合度。
当某个类的功能需要增强时,使用原始方法需要修改源代码,AOP则可以在不修改源代码的条件下完成功能增强,从而降低耦合度。
AOP底层原理
AOP底层使用动态代理(两种)
1、当类有接口,实现接口实现类的代理对象(JDK动态代理)
2、当类无接口,创建子类的代理对象(CGLIB动态代理)
JDK动态代理实现
创建一个接口及其实现类
public interface UserDao {
public int add();
public void out() ;
}
public class UserDaoimpl implements UserDao{
int a=10;
@Override
public int add() {
return 0;
}
@Override
public void out() {
System.out.println(a);
}
}
AOP增强代码
public class Aop {
public static void main(String[] args) {
Class[] interfaces = {UserDao.class};
UserDao userDao = new UserDaoimpl();
UserDao userDao1 = (UserDao) Proxy.newProxyInstance(Aop.class.getClassLoader(), userDao.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.println("invoke before");
Object obj = method.invoke(userDao,args);
System.out.println("invoke after");
return obj;
}
});
userDao1.out();
}
}
增强的具体过程:
调用Proxy类的newProxyInstance方法,该方法需要三个参数,第一个类加载器,第二个是要增强的接口数组,第三个是一个增强处理器。
需要增强的接口必须包含在第二个参数中。该方法会返回一个代理对象,每次当代理对象调用方法时,都会调用InvocationHandler的Invoke方法,下面见结果。
可见完成了增强。这是Spring的AOP的底层实现,这部分增强代码在使用中是封装好的。了解即可。