通过配置织入@Aspect切面
虽然可以通过编程的方式织入切面,但是一般情况下,我们还是使用spring的配置自动完成创建代理织入切面的工作。通过aop命名空间的<aop:aspectj-autoproxy />声明自动为spring容器中那些配置@Aspect切面的bean创建代理,织入切面。当然,spring在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作,但具体实现的细节已经被<aop:aspectj-autoproxy />隐藏起来了。
<aop:aspectj-autoproxy />有一个proxy-target-class属性,默认为false,表示使用jdk动态代理织入切面,当配为<aop:aspectj-autoproxy poxy-target-class="true"/>时,表示使用cglib动态代理技术织入切面。不过即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用cglib动态代理。
@Aspect语法基础
@Aspect使用jdk5.0注解和正规则的AspectJ 5的切面表达式语言描述切面,由于spring只支持方法的连接点,所以spring仅支持部分aspectJ的切面语言。
切点表达式函数
AspectJ 5的切点表达式由关键字和操作参数组成。如execution(*greeTo(..))的切点表达式,"execute"为关键字,而"*greeTo(..)"为操作参数。在这里execution代表目标类执行某一方法,而"*greeTo(..)"是描述目标方法的匹配模式串,两者联合起来所表示的切点匹配目标类greeTo(..)方法的连接点。为了描述方便,我们将execution()称作函数,而将匹配串"*greeTo(..)"称作函数的入参。
Spring支持9个@Aspect切点表达式函数,它们用不同的方式描述目标类的连接点,根据描述对象的不同,可以将它们大致分为4种类型:
1.方法切点函数:通过描述目标类方法信息定义连接点;
2.方法入参切点函数:通过描述目标类方法入参的信息定义连接点;
3.目标类切点函数:通过描述目标类类型信息定义连接点;
4.代理类切点函数:通过描述目标类的代理类的信息定义连接点;