Spring中的AOP面向切面编程结合IOC容器,是编程的灵活性大大提高。结合支持通配符和注解等等一系列方便切入的特性,真香!我这里分享几个需要注意的地方,以及以我的经验总结几条原则。
Spring AOP简介
Spring AOP 基于动态代理,为以下两种:
- 基于接口,使用JDK Dynamic Proxy
- 非接口,使用CGLIB自动生成子类实现代理
AOP作为一种编程模型,还有着很多实现。基本需要结合代码自动生成和动态编译一些手段来使用。在JAVA语言编程中,有很多字节码生成工具除了cglib,还有 Javassist 、ASM 、Byte Buddy等等。参见:关于字节码生成代理的性能比较。
Spring AOP的很多理念使用了AspectJ的,包括切入点表达式、相关注解(比如@Aspect
,@Around
,@Pointcut
)等等。AspectJ提供加载时编织(Load-Time Weaving)和编译时编织(Compile-Time Weaving),功能强大但是需要配置较多,特别是编译织入需使用AspectJ Compiler。所以Spring的AOP选择了更为简单易用的方案。
顺便提一下静态代理,手动编码实现设计模式中的代理模式。很多文章也把AspectJ在编译器生成代理类,称为静态代理。理解就是不在运行时动态生成,一次生成就运行就直接使用了。
通配符的用法
子包路径通配用法示例:
@Aspect
@Component
public DemoAdvice {
// 所有service层方法
@Pointcut("execution(public * cn.x.xx.demo..service..*(..))")
public void servicePoint() {
}
// 所有dao层方法
@Pointcut("execution(public * cn.x.xx.demo..dao..*(..))")
public void daoPoint() {
}
// 所有被注解@LogTime的方法
@Pointcut("@annotation(LogTime)")
public void LogTimePoint() {