zoukankan      html  css  js  c++  java
  • Spring经典---AOP

      1.代理工厂Bean  

      前置增强  实现MethodBeforeAdvice  在方法执行之前执行    

      后置增强     实现AfterReturingAdvice  在方法执行之后执行

      环绕增强     实现MethodInterceptor   在方法前后都执行增强

      异常增强     实现ThrowsAdvice        接口中没有方法,但是得实现afterThrows

         public void afterThrows( [Method method,] [Object args,] [Object target,] Throwable throwable );

     <!--1.目标对象-->
      <bean id="service" class="cn.happy.day11aop01.SomeServiceImpl"></bean>
      <!--2.增强-->
      <bean id="beforeAdvice" class="cn.happy.day11aop01.MyBeforeAdvice"></bean>
      <!--3.代理工厂bean实现代理对象的生成-->
      <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
         <!--target:目标对象是谁-->
           <property name="target" ref="service"></property>
           <property name="interceptorNames" value="beforeAdvice" ></property>
      </bean>
    </beans>

    环绕增强:

    public interface SomeBefore {
        public void sayhi();
    }
    public class SomeBeforeImpl implements SomeBefore {
        public void sayhi() {
            System.out.println("我是李白");
        }
    }
    public class BeforeTest implements MethodInterceptor {
        public Object invoke(MethodInvocation methodInvocation) throws Throwable {
            System.out.println("我在上");
            methodInvocation.proceed();
            System.out.println("我在下");
            return null;
        }
    }
    <!--目标类型-->
        <bean id="service" class="Inectoper.SomeBeforeImpl"></bean>
    <!--增强通知-->
        <bean id="beforeadvice" class="Inectoper.BeforeTest"></bean>
    <!--代理工厂bean 自己也是bean  中和调度目标类型和增强-->
        <bean id="proxys" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="beforeadvice"></property>
        </bean>
      @Test
        public void Test03(){
            ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext08.xml");
            Inectoper.SomeBefore bean =(Inectoper.SomeBefore) context.getBean("proxys");
            bean.sayhi();
        }

    运行结果:

    advice  通知

    advisor 顾问

    2.顾问(Advisor)

       通知Advice是Spring提供的一种切面(Aspect)。但其功能过于简单,只能

    将切面织入到目标类的所有目标方法中,无法完成将切面织入到指定目标方法中。

    顾问Advisor是Spring提供的另一种切面。其可以完成更为复杂的切面织入功能,能选择性的将增强切面中的部分方法。

    PointcutAdvisor是顾问的一种,可以指定具体的切入点。顾问将通知进行了包装,会根据不同的通知类型,在不同的时间点,

    将切面织入到不同的切入点。

    PointcutAdvisor接口有两个较为常用的实现类:
     *:NameMatchMethodPointcutAdvisor 名称匹配方法切入点顾问
     *: RegexpMethodPointcutAdvisor 正则表达式方法切入点顾问
          <property name="pattern" value=".*do.*"></property>  表示方法全名(包名,接口名,方法名)
        运算符       名称      意义
         .           点号       表示任意单个字符
         +           加号       表示前一个字符出现一次或者多次
         *           星号       表示前一个字符出现0次或者多次
    
      名称匹配方法切入点顾问  NameMatchMethodPointcutAdvisor
       <!-- 03.配置顾问   advisor 包装  advice-->
        <bean id="beforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
          <property name="advice" ref="beforeAdvice"></property>
          <property name="mappedNames" value="do*"></property>
        </bean>
  • 相关阅读:
    移动端line-height问题
    Android8 自定义广播接收不到的问题
    vue 使用font-awesome
    在vue中使用highcharts的仪表图等扩展
    android控件RecyclerView中,如何显示自定义分割线以及最后一项去除分割线
    使用RecyclerView设置自定义分割线
    Android-配置文件中设置“android:clickable="false"无效的原因及解决办法
    HDU 4632 Palindrome subsequence (区间DP)
    HDU 2208 唉,可爱的小朋友(DFS)
    HDU 4618 Palindrome Sub-Array
  • 原文地址:https://www.cnblogs.com/1234AAA/p/8530044.html
Copyright © 2011-2022 走看看