zoukankan      html  css  js  c++  java
  • Spring aop 小例子demo

     

    由于最近的服务项目提供接口有一个需求,所有操作都必须检查操作的服务可用,所以感觉Aop特别适合实施。完成学习的小例子。

    关于spring-Aop原理:http://m.oschina.net/blog/174838这篇文章写的非常好。

    个人觉着可能上线的时候配置文件更方便一下。所以样例主要是配置文件方式

    Demo文件下载地址:

    http://download.csdn.net/detail/ruishenh/7261121

    Spring配置文件

    /idle-service-impl/src/main/resources/spring/app-config.xml

    <?xml version="1.0"encoding="UTF-8"?>
    <beansxmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"
             xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"
             xmlns:util="http://www.springframework.org/schema/util"
             xsi:schemaLocation="
             http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd
             http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd
             http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd
             http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd
             http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-3.2.xsd">
     
             <context:component-scanbase-package="com.ruishenh.business.impl" />
             <aop:aspectj-autoproxyexpose-proxy="true" proxy-target-class="true"/>
             <context:annotation-config/>
             <!--  -->
             <beanid="springFactoryUtil"class="com.ruishenh.utils.SpringFactoryUtil" />   
             <!--  -->
             <importresource="aop-advisor.xml" />
    </beans>
     

    导入的aop-advisor.xml文件

    /idle-service-impl/src/main/resources/spring/aop-advisor.xml

    <?xml version="1.0"encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsd
       http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd
       http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd
       http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-3.1.xsd">
     
       <bean id="genericAdvisor" class="com.ruishenh.aop.aspect.advisor.GenericAdvisor"/>
       <aop:config>
          <!-- 定义切面 -->
          <aop:aspect ref="genericAdvisor" order="0">
             <!-- 定义连接点 -->
             <aop:pointcut id="businessService" expression="execution(*com.ruishenh.business.impl..*.*(..))" />
             <!-- 定义前置 -->
             <aop:before method="before" pointcut-ref="businessService"/>
             <!-- 定义围绕 -->
             <aop:around method="heartbeat" pointcut-ref="businessService"/>
             <!-- 定义后置 -->
             <aop:after method="after" pointcut-ref="businessService"/>
             <!-- 定义Target处理后普通结果增强 -->
             <aop:after-returning method="afterReturning" pointcut-ref="businessService" returning="obj"/>
             <!-- 定义Target处理后异常增强 -->
             <aop:after-throwing method="handlerException" pointcut-ref="businessService" throwing="e"/>
            
          </aop:aspect>
       </aop:config>
    </beans>

     

     

    关于这个类

    com.ruishenh.aop.aspect.advisor.GenericAdvisor中方法有

     

    1.  before  相应Target运行之前

    2.  heartbeat这个是围绕的一个方法

    3.  after  相应target运行之后

    4.  afterReturning 相应在target处理后结果返回增强处理

    5.        handlerException 相应在target运行异常时增强处理

    /idle-service-impl/src/main/java/com/ruishenh/aop/aspect/advisor/GenericAdvisor.java源代码

    package com.ruishenh.aop.aspect.advisor;
     
    import org.aspectj.lang.JoinPoint;
    importorg.aspectj.lang.ProceedingJoinPoint;
     
    import com.ruishenh.domain.account.AccountBank;
     
    public class GenericAdvisor {
     
             /**
              * 对于要增强的方法。运行围绕处理检查心跳是否正常
              * @param joinPoint
              * @return
              * @throws Throwable
              */
             Objectheartbeat(ProceedingJoinPoint joinPoint) throws Throwable{
                      
    //               if(checkHeartbeat()) {
    //                        
    //               }
                       System.out.println("2joinPoint.Signature.name:"+joinPoint.getSignature().getName());
                       //记得在调用运行方法的时候异常不要try-catch,要thrwos出去,不然可能事务层没法起效,或者增强异常处理也无法起效
                       Objectobj=joinPoint.proceed();
                       //下边的參入參数能够改动。可是类型和方法的个数要和原来一致,不然原方法无法运行
    //               Objectobj=joinPoint.proceed(joinPoint.getArgs());
                      
                       //对于返回后对象,有可能要做处理,对返回參数的某一些值处理,
                       //能够通过org.springframework.beans.BeanUtils.copyProperties把一些值赋值
                       if(obj==null) {
                                returnnew AccountBank();
                       }
                       returnobj;
             }
             /**
              * 对于要增强的方法,在方法之前运行
              * @param joinPoint 连接点信息
              */
             voidbefore(JoinPoint joinPoint){
                       Object[] objs=joinPoint.getArgs();
                       System.out.println("1objs:"+objs[0]);
                       System.out.println("1joinPoint:"+joinPoint);
             };
            
             /**
              * 对于要增强的方法,在方法之后运行
              * @param joinPoint  连接点信息
              */
             voidafter(JoinPoint joinPoint){
                       Object[] objs=joinPoint.getArgs();
                       System.out.println("4objs:"+objs[0]);
                       System.out.println("4joinPoint:"+joinPoint);
             };
             /**
              * 对于要添加的方法,方法返回结果后。对结果进行记录或者分析
              * 方法
              * @param obj target运行后返回的结果
              */
             voidafterReturning(Object obj){
                       System.out.println("3obj:"+obj);
             };
             /**
              * 对于要增强的方法,方法抛出异常后。对异常的增强处理,比方记录异常。或者依据异常分析数据什么的
              * @param e target运行后抛出的异常
              */
             voidhandlerException(Throwable e){
                       System.out.println("handingException......");
                       e.printStackTrace();
             }
            
             booleancheckHeartbeat(){
                       returntrue;
             }
    }


    Junit測试

    /idle-service-impl/src/test/java/com/ruishenh/business/impl/account/AccountServiceImplTest.java

    package com.ruishenh.business.impl.account;
     
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    importorg.springframework.test.context.ContextConfiguration;
    importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;
     
    importcom.ruishenh.domain.account.AccountBank;
    importcom.ruishenh.domain.account.AccountBankParam;
    import com.ruishenh.utils.SpringFactoryUtil;
     
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={"classpath:/spring/app-config.xml"})
    public class AccountServiceImplTest {
     
             @Before
             publicvoid setUp() throws Exception {
             }
     
             @Test
             publicvoid testStoreIn() throws Exception {
                       AccountServiceImplimpl= SpringFactoryUtil.getBean(AccountServiceImpl.class);
                       AccountBankParamparam=   new AccountBankParam();
                       param.setId(100);
                       AccountBankab=impl.storeIn(param);
                       System.out.println(ab.toString());
             }
     
    }
     

    运行后输出结果:

    1objs:com.ruishenh.domain.account.AccountBankParam@d522de2[id=100,name=<null>,account=<null>]

    1joinPoint:execution(AccountBankcom.ruishenh.business.impl.account.AccountServiceImpl.storeIn(AccountBankParam))

    2joinPoint.Signature.name:storeIn

    ==============todo=====================

    4objs:com.ruishenh.domain.account.AccountBankParam@d522de2[id=100,name=<null>,account=<null>]

    4joinPoint:execution(AccountBankcom.ruishenh.business.impl.account.AccountServiceImpl.storeIn(AccountBankParam))

    3obj:com.ruishenh.domain.account.AccountBank@2d397e5c[id=0,name=<null>,account=<null>]

    com.ruishenh.domain.account.AccountBank@2d397e5c[id=0,name=<null>,account=<null>]

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Memcached: 目录
    Memcached: temple
    Redis: Redis支持五种数据类型
    互联网市场
    java实现猜生日
    java实现汉诺塔计数
    java实现汉诺塔计数
    java实现汉诺塔计数
    java实现汉诺塔计数
    java实现汉诺塔计数
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4891082.html
Copyright © 2011-2022 走看看