1 AOP概念
spring
AOP(Aspect Oriented Programming) 面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善。AOP技术利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,即切面。所谓"切面"可减小系统的重复代码,下降模块之间的耦合度 ,并有利于将来的可操做性和可维护性。横切关注点常常发生在核心关注点的多处,且各处基本类似,好比权限认证、日志、事物。编程
2 代理设计模式设计模式
要想明白aop实现原理,必定要掌握代理模式,其中代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。下面是代理模式的简单类图与调用过程。bash
3 代理实现技术
app
// 1.首先实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法
public class DaoInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
return method.invoke(object, args);
}
}
//2.而后在须要使用Dao的时候,经过JDK动态代理获取Dao的代理对象
System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); //开启debug模式,保存动态生成的代理类字节码文件
Dao dao = new DaoImpl();
Dao proxyDao = (Dao) Proxy.newProxyInstance(
getClass().getClassLoader(),// 1. 类加载器
new Class[]{Dao.class}, // 2. 代理须要实现的接口,能够有多个
new DaoInvocationHandler(dao));// 3. 方法调用的实际处理者
复制代码
// 1. 首先实现一个MethodInterceptor,方法调用会被转发到该类的intercept()方法。
class DaoMethodInterceptor implements MethodInterceptor{
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy).{
return proxy.invokeSuper(obj, args);
}
}
// 2. 而后在须要使用HelloConcrete的时候,经过CGLIB动态代理获取代理对象。
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "./$DaoProxy.class");
Enhancer enhancer = new Enhancer(); //1.新建代理加强对象
enhancer.setSuperclass(DaoImpl.class); //2.设置被代理类
enhancer.setCallback(new DaoMethodInterceptor()); //3.插入方法拦截对象
Dao dao = (DaoImpl)enhancer.create(); //4.获取被代理对象
复制代码
经过查看生成的代理类的字节码文件能够看到,cglib生成了三个类,有兴趣的能够自行了解一下cglib的机制。生成的代理类是经过继承被代理类实现的,因此须要指定父类。在初始化的时候也同样会加载被代理类的方法生成Method对象,因此外部调用代理类定义方法时,会先去执行拦截方法而后才是真正的被代理类的方法。框架
4.总结
ide
本篇介绍了AOP的概念,代理的设计模式与实现技术,使用了jdk proxy与cglib的接口用来作些简单的代理实现并分析了原理,格物而致知,积小步而致千里。函数
下一期咱们将模拟spring-aop的实现,手撸个小型的aop框架出来。敬请期待!性能