AOP 即 Aspect-oriented Programming,Aspect 切面,什么是切面,就是一条大路上的收费站,检查站,首先它是一个统一的功能单元,或是收费、或是检查,其次它可以决定对谁收费,对谁收多少费,对谁检查。与之相对的是 OOP 即 Object-oriented Programming,Object 对象,对象就是大路上的一辆辆汽车,每辆汽车都有一套完成的功能系统,有发动机、车架、车轮、方向盘等,每辆车又各自不同,或是小轿、或是SUV、又或是货车等等,AOP 是对 OOP 的补充,是程序结构涉及的一种方式。
getArgs():
方法参数。
getThis()
:返回代理对象。
getTarget()
:返回被代理的对象。
getSignature():
方法描述。
Spring AOP 目前只支持方法级别的 joint point(spring bean 中的方法),如果需要其它粒度,如属性字段,可以使用 AspectJ。
Spring AOP 没有实现完整的 AOP 功能,它的出现旨在整合 AOP 功能和 Spring IoC 容器,用以解决企业实际应用中常见的问题。
Spring AOP 和 AspectJ 并非竞争关系,它们各自都是非常成熟的框架,适用于不同的目的。Spring 可以在基于 Spring 框架的应用架构中无缝整合 Spring AOP、IoC 及 AspectJ,以完整地使用 AOP 功能。
Spring AOP 是基于代理的,默认使用 JDK 动态代理,用以实现接口代理。
非接口代理需要使用 CGLIB。
ApplicationContext:入口。
AspectJAutoProxyBeanDefinitionParser:AspectJ 解析器,自动发现注册 AspectJ 风格的切面。
AnnotationAwareAspectJAutoProxyCreator 会根据定义的切点来自动代理相匹配的 bean。AnnotationAwareAspectJAutoProxyCreator 的层次结构如下:
AnnotationAwareAspectJAutoProxyCreator 实现了 BeanPostProcessor 接口,会在对应 Bean 实例化后应用此 BeanPostProcessor。
AnnotationAwareAspectJAutoProxyCreator 用于处理所有 AspectJ 声明的切面。
基于 AspectJ 的代理工厂。可以用于编程方式创建包含切面的对象代理。
//创建代理工厂
AspectJProxyFactory factory = new AspectJProxyFactory(targetObject);
// 添加 AspectJ aspect,可以多次添加,可以使 class 或者 instance。
factory.addAspect(SecurityManager.class); //.addAspect(usageTracker);
// 获取对象代理
MyInterfaceType proxy = factory.getProxy();