• Spring中的Advisor,Advice,Pointcut


    一、Spring中的Advisor,Advice,Point概述

    1、Advisor:充当Advice和Pointcut的适配器,类似使用Aspect的@Aspect注解的类(前一章节所述)。一般有advice和pointcut属性。

    祖先接口为org.springframework.aop.Advisor,应用中可直接使用org.springframework.aop.support.DefaultPointcutAdvisor

    2、Advice:用于定义拦截行为,祖先接口为org.aopalliance.aop.Advice,该接口只是标识接口,应用中可直接实现BeforeAdvice ,ThrowsAdvice,MethodInterceptor ,AfterReturningAdvice ,IntroductionInterceptor 等子接口

    3、Pointcut:用于定义拦截目标集合,祖先接口为org.springframework.aop.Pointcut

    二、Spring中的Advisor,Advice,Point的应用

    1、编写Advisor实现类

    在此可直接使用org.springframework.aop.support.DefaultPointcutAdvisor

    2、编写Advice实现类

    public class PlayAdvice implements MethodBeforeAdvice{
     public void before(Method method, Object[] args, Object target)
       throws Throwable {
      System.out.println("my before advice");
     // method.invoke(target, args); 如果再调用这句,则目标方法会执行多一次
     }
    }

    3、编写Pointcut实现类
    public class PlayPointcut implements Pointcut {
     public ClassFilter getClassFilter() {
      return new PlayClassFilter();
     }
     public MethodMatcher getMethodMatcher() {
      return new PlayMethodMatcher();
     }
    }
    //PlayClassFilter的定义

    class PlayClassFilter implements ClassFilter {
     public boolean matches(Class clazz) {
      if(clazz.getSimpleName().equals("Play"))
       return true;
      return false;
     }
    }

    //PlayMethodMatcher的定义

    class PlayMethodMatcher implements MethodMatcher {
     public boolean isRuntime() {
      return true;
     }
     public boolean matches(Method method, Class c) {
      if(c.getSimpleName().equals("Play")&&method.getName().contains("Service"))
       return true;
      return false;
     }
     public boolean matches(Method method, Class c, Object[] args) {
      if(c.getSimpleName().equals("Play")&&method.getName().contains("Service"))
       return true;
      return false;
     }
    }

    4、编写目标类


    public class Play {

      public void playService(String what){
      System.out.println("play "+what);
     }
    }

    5、在配置文件中配置


    <bean id="adviceBean" class="com.hss.sp.aop.PlayAdvice"/>
    <bean id="pointcutBean" class="com.hss.sp.aop.PlayPointcut"/>
    <bean id="playService" class="com.hss.sp.service.Play"/>
    <bean
       class="org.springframework.aop.support.DefaultPointcutAdvisor">
       <property name="advice" ref="adviceBean"></property>
       <property name="pointcut" ref="pointcutBean"></property>
    </bean>

    6、测试,结果

     BeanFactory bf=new ClassPathXmlApplicationContext("applicationContext.xml");
      Play play=(Play)bf.getBean("playService");
      play.playService("pingpong");

    输出:

    my before advice
    play pingpong

    转自----http://blog.sina.com.cn/s/blog_5198c7370100hw1p.html

  • 相关阅读:
    Educational Codeforces Round 80 (Rated for Div. 2)
    2020 CCPC Wannafly Winter Camp
    Codeforces Round #613 (Div. 2)
    Codeforces Round #612 (Div. 2)
    Hello 2020
    Good Bye 2019
    Codeforces Round #590 (Div. 3)
    依赖注入
    Spring 拦截器
    rsync服务端一键安装rsync脚本(非源码)
  • 原文地址:https://www.cnblogs.com/auto714/p/3007411.html
Copyright © 2020-2023  润新知