zoukankan      html  css  js  c++  java
  • spring aop配置及用例说明(4)

    欢迎交流转载:http://www.cnblogs.com/shizhongtao/p/3476161.html                       

    这里简单对xml的配置方式做一下描述.代码还是上一篇(http://www.cnblogs.com/shizhongtao/p/3473362.html)的代码,只是配置方式改为xml的配置方式.测试用例类包括NotVeryUsefulAspect和Maneger两个。代码我还是贴一下。

     1 package com.bing.test;
     2 
     3 public class Manager {
     4     private String myName;
     5     private String description;
     6 
     7     public void sayHello() {
     8         System.out.println("Hello " + myName);
     9     }
    10 
    11     public void getDes() {
    12         System.out.println(description);
    13 
    14     }
    15 
    16     public String getName() {
    17         System.out.println("执行getName");
    18         return myName;
    19     }
    20 
    21     public String throwTest() throws Exception {
    22         if (true) {
    23 
    24             throw new Exception("new throwing test!");
    25         }
    26         return "fail";
    27     }
    28 }
    View Code
     1 package com.bing.test;
     2 
     3 
     4 public class NotVeryUsefulAspect {
     5     //配置切入点集合,这样在下面可以直接引入
     6     /* @Pointcut("execution(public * com.bing.test..*.sayHello(..))")
     7       public void inManager() {}
     8      @Pointcut("within(com.bing.test..*)")
     9      public void excutionManager() {}*/
    10     // 表示在方法前面执行
    11     public void before() {
    12 
    13         System.out.println("before Method");
    14     }
    15     public void afterReturning(Object retVal) {
    16         if(retVal!=null)
    17         System.out.println("参数是:"+retVal);
    18         System.out.println("afterReturning Method");
    19     }
    20     //@After("execution(public * com.bing.test..*.*(..))")
    21     public void after() {
    22         
    23         System.out.println("after Method");
    24     }
    25     public void afterThrow(Exception ex){
    26         
    27         System.out.println(ex.getMessage());
    28         
    29         System.out.println("AfterThrowing Method!");
    30     }
    31 }
    View Code

    下面我就对xml文件做一下说明。在第一篇中有一个简单的xml配置,如下

    <bean id="myInterceptor" class="com.bing.test.NotVeryUsefulAspect"></bean>
     <aop:config>
         <aop:aspect id="myAspect" ref="myInterceptor">
               <aop:before method="before"
                    pointcut="execution(public * com.bing..*.sayHello(..))" />
                <!-- 第一个*表示任何返回类型,“..”表示这个包下的所有子包,第二个*代表所有类,第二个“..”匹配了一个接受任意数量参数 -->
                <!-- 当然sayHello方法你也可以用*代替,这样就表示所有方法。 -->
          </aop:aspect>
      </aop:config>

      上面的配置很清晰,不过也有点不够灵活。加入做大量配置的话,可能会写一些重复的xml代码。另外一种配置方式是:我们用 <aop:config>元素来申明一个切入点。如果你想对    所有service层来声明,你可以这样写:

    1 <aop:config>
    2 
    3   <aop:pointcut id="businessService"
    4         expression="execution(* com.xyz.myapp.service.*.*(..))"/>
    5 
    6 </aop:config>

     这个expression用的表达式和,前几篇介绍的表达式一样,这时候如果你想用定义的切面类,可以这样配置: 

     1 <aop:config>
     2 
     3   <aop:aspect id="myAspect" ref="aBean">
     4 
     5     <aop:pointcut id="businessService"
     6           expression="execution(* com.xyz.myapp.service.*.*(..)) &amp;&amp; this(service)"/>
     7     <aop:before pointcut-ref="businessService" method="monitor"/>
     8     ...
     9 
    10   </aop:aspect>
    11 
    12 </aop:config>

    上面的配置说明在ref="aBean"所指向的类中有着么一个方法:

    public void monitor(Object service) {
        ...
    }

    综上,我对上一篇进行xml方式进行配置如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
     4     xmlns:context="http://www.springframework.org/schema/context"
     5     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans
     7            http://www.springframework.org/schema/beans/spring-beans.xsd
     8             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
     9               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
    10               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
    11 
    12     <context:annotation-config />
    13     <aop:aspectj-autoproxy />
    14 
    15     <context:component-scan base-package="com.bing">
    16         <context:exclude-filter type="annotation"
    17             expression="org.springframework.stereotype.Controller" />
    18         <context:exclude-filter type="regex"
    19             expression="com.bing.vo.*" />
    20         <context:exclude-filter type="regex"
    21             expression="com.bing.util.*" />
    22     </context:component-scan>
    23     <!-- 自定义的配置文件 -->
    24     <bean
    25         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    26         <property name="locations">
    27             <list>
    28                 <value>classpath:/user.properties</value>
    29             </list>
    30         </property>
    31         <property name="fileEncoding" value="utf-8" />
    32     </bean>
    33     <bean id="manager" class="com.bing.test.Manager">
    34         <property name="myName" value="${user.name}"></property>
    35         <property name="description" value="${user.description}"></property>
    36     </bean>
    37     
    38     <bean id="myInterceptor" class="com.bing.test.NotVeryUsefulAspect"></bean>
    39     
    40     <aop:config>
    41         <!-- 匹配com.bing包以及子包下所有类以say开头的方法 -->
    42         <aop:pointcut expression="execution(public * com.bing..*.say*(..))"
    43             id="someMethod" />
    44         <!-- 匹配com.bing.test下的Manager类 -->
    45         <aop:pointcut  expression="execution(public * com.bing..*.get*(..))"
    46             id="returnMethod" />
    47         <!-- 匹配com.bing.test下所有类 -->
    48         <aop:pointcut expression="within(com.bing.test.*)" id="allMethod" />
    49         <!-- 配置切入点和建议 -->
    50         <aop:aspect id="myAspect" ref="myInterceptor">
    51             <aop:before method="before"
    52                 pointcut-ref="someMethod" />
    53             <aop:after method="after"
    54                 pointcut-ref="someMethod" />
    55         </aop:aspect>
    56         <!-- 带返回值的切入点配置 -->
    57         <aop:aspect id="myAspect2" ref="myInterceptor">
    58             <aop:after-returning method="afterReturning" returning="retVal"
    59                 pointcut-ref="returnMethod" />
    60         </aop:aspect>
    61     </aop:config>
    62 
    63 </beans>

     补充:xml方法配置Around参数得到方法的参数。例如对于某一个有两个参数的方法,我配置如下切入点

     1  public Object profile(ProceedingJoinPoint call, String name, int age) throws Throwable {
     2       StopWatch clock = new StopWatch(
     3             "Profiling for '" + name + "' and '" + age + "'");
     4       try {
     5          clock.start(call.toShortString());
     6          return call.proceed();
     7       } finally {
     8          clock.stop();
     9          System.out.println(clock.prettyPrint());
    10       }
    11    }

    对应上面java代码的xml配置文件如下:

     1    <aop:config>
     2       <aop:aspect ref="profiler">
     3 
     4          <aop:pointcut id="theExecutionOfSomeFooServiceMethod"
     5                     expression="execution(* x.y.service.FooService.getFoo(String,int))
     6                     and args(name, age)"/>
     7 
     8          <aop:around pointcut-ref="theExecutionOfSomeFooServiceMethod"
     9                   method="profile"/>
    10 
    11       </aop:aspect>
    12    </aop:config>
  • 相关阅读:
    OPC UA认识汇总
    linux内核铁三角-进程(任务)调度
    nginx配置文件
    git和coding的使用
    php处理mysql的结果集
    php中self和$this还有parent的区别
    Mysql练习题
    SEO优化
    css3 旋转 八仙桌
    laravel笔记
  • 原文地址:https://www.cnblogs.com/shizhongtao/p/3476161.html
Copyright © 2011-2022 走看看