SpringAOP 切面

切面 = 增强 + 切点(连接点为目标类的特定方法)
切面 = 增强(连接点为目标类的所有方法)
增强包含连接点的方位和织入代码,切点包含执行点信息(哪些类的哪些方法)

切点
org.springframework.aop.Pointcut接口描述切点
Pointcut由ClassFilter和MethodMatcher构成
ClassFilter
定位到特定类上
matches(Class clazz)用来判别被检测的类是否匹配过滤条件
MethodMatcher
定位到特定方法上
matches(Method m,Class targetClass)静态方法匹配器,匹配方法签名,仅一次
matches(Method m,Class targetClass,Object[] args)动态方法匹配器,在运行期检查方法入参的值,每次调用都匹配
isRuntime()返回false表示静态方法匹配器,返回true表示动态方法匹配器

切点类型
静态方法切点
抽象基类org.springframework.aop.support.StaticMethodMatcherPointcut默认匹配所有类
子类NameMatchMethodPointcut字符串匹配
子类AbstractRegexpMethodPointcut正则匹配
动态方法切点
抽象基类org.springframework.aop.support.DynamicMethodMatcherPointcut默认匹配所有类,已过时,可用DefaultPointCutAdvice和DynamicMethodMatcherPointcut替代。
注解切点
org.springframework.aop.support.annotation.AnnotationMatchingPointcut支持在Bean中直接通过JDK5.0注解标签定义的切点
表达式切点
org.springframework.aop.support.ExpressionPointcut支持AspectJ切点表达式
流程切点
org.springframework.aop.support.ControlFlowPointcut根据程序执行的堆栈信息查看目标方法是否由某一个方法直接或间接发起调用,以此判断是否为匹配的连接点。
复合切点
org.springframework.aop.support.ComposablePointcut可创建多个切点

切面类型
Advice
一般切面,仅包含Advice,连接点是目标类的所有方法。
PointcutAdvice
切点切面,包含Advice和Pointcut,连接点是目标类的特定方法。
IntroductionAdvice
引介切面,包含IntroductionInterceptor和Pointcut,类级别。

静态普通方法名匹配切面
定义切点
public class GreetingAdvisor extends StaticMethodMatcherPointcut{
    public boolean matches(Method method, Class clazz){//切点方法
        return "greetTo".equals(method.getName());
    }
    public ClassFilter getClassFilter(){//切点类
        return new ClassFilter(){
            public boolean matcher(Class clazz){
                return Waiter.class.isAssignableFrom(clazz);
            }
        }
    }
}
定义增强
public class GreetingBeforeAdvice implements MethodBeforeAdvice{
    public void before(Method method, Object[] args, Object obj) throws Throwable{
        //...
    }
}
配置切面
<!-- 目标类 -->
<bean id="waiterTarget" class="com.smart.advisor.Waiter" />
<bean id="sellerTarget" class="com.smart.advisor.Seller" />
<!-- 前置增强 -->
<bean id="beforeAdvice" class="com.smart.advisor.GreetingBeforeAdvice" />
<!-- 切面,advice-增强,classFilter-类匹配过滤器,order-切面织入时的顺序 -->
<bean id="greetingAdvisor" class="com.smart.advisor.GreetingAdvisor"
    p:advice-ref="beforeAdvice"/>
<!-- 父bean,定义公共配置信息 -->
<bean id="parent" abstract="true"
    class="org.springframework.ProxyFactoryBean"
    p:interceptorNames="greetingAdvisor"
    p:proxyTargetClass="true"/>
<!-- 代理bean -->
<bean id="waiter" parent="parent" p:tartget-ref="waiterTarget"/>
<bean id="seller" parent="parent" p:tartget-ref="sellerTarget"/>

静态正则表达式方法匹配切面
<!-- 匹配目标类方法的全限定名 -->
<bean id="regexpAdvisor"
    class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
    p:advice-ref="beforeAdvice">
    <property name="patterns">
        <list><value>.*greet.*</value></list>
    </property>
</bean>
<bean id="parent" class="org.springframework.ProxyFactoryBean"
    p:interceptorNames="greetingAdvisor"
    p:target-ref="waiterTarget"
    p:proxyTargetClass="true"/>

猜你喜欢

转载自csolar.iteye.com/blog/2153790