• (转)使用Spring配置文件实现AOP


    http://blog.csdn.net/yerenyuan_pku/article/details/52880558

    使用Spring配置文件实现AOP

    前面我们已经学会了使用Spring的注解方式实现AOP,现在我们就要学习使用Spring配置文件实现AOP。本文是建立在使用Spring的注解方式实现AOP的细节的案例的基础之上的。 
    我们首先将MyInterceptor类的代码修改为:

    /**
     * 切面
     * @author li ayun
     *
     */
    @Aspect
    public class MyInterceptor {
        public void doAccessCheck() {
            System.out.println("前置通知");
        }
    
        public void doAfterReturning() { 
            System.out.println("后置通知");
        }
    
        public void doAfter() {
            System.out.println("最终通知");
        }
    
        public void doAfterThrowing() {
            System.out.println("异常通知");
        }
    
        public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("进入方法");
            Object result = pjp.proceed();
            System.out.println("退出方法");
            return result;
        }
    
    }
    • 1
    • 2

    从上可知MyInterceptor不过就是一个普通的JavaBean。现在若要使用Spring配置文件实现AOP,则须将Spring配置文件的内容修改为:

    <?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:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.2.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
    
        <aop:aspectj-autoproxy />
        <bean id="personService" class="cn.itcast.service.impl.PersonServiceImpl"></bean>
        <bean id="aspetbean" class="cn.itcast.service.MyInterceptor"></bean>
        <aop:config>
            <aop:aspect id="asp" ref="aspetbean">
                <aop:pointcut expression="execution(* cn.itcast.service.impl.PersonServiceImpl.*(..))" id="mycut"/> 
                <aop:before pointcut-ref="mycut" method="doAccessCheck"/>
                <aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/>
                <aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/>
                <aop:after pointcut-ref="mycut" method="doAfter"/>
                <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
            </aop:aspect>
        </aop:config>
    </beans>
    • 1

    如果PersonServiceImpl类的代码为:

    public class PersonServiceImpl implements PersonService {
    
        @Override
        public void save(String name) {
            // throw new RuntimeException("我是异常");
            System.out.println("我是save()方法");
        }
    
        @Override
        public void update(String name, Integer id) {
            System.out.println("我是update()方法");
        }
    
        @Override
        public String getPersonName(Integer id) {
            System.out.println("我是getPersonName()方法");
            return "xxx";
        }
    
    }
    • 1

    那么除了异常通知外,其他通知都将会执行。此时,测试SpringAOPTest类的interceptorTest()方法,会发现Eclipse控制台打印: 
     
    如果PersonServiceImpl类的代码为:

    public class PersonServiceImpl implements PersonService {
    
        @Override
        public void save(String name) {
            throw new RuntimeException("我是异常");
            // System.out.println("我是save()方法");
        }
    
        @Override
        public void update(String name, Integer id) {
            System.out.println("我是update()方法");
        }
    
        @Override
        public String getPersonName(Integer id) {
            System.out.println("我是getPersonName()方法");
            return "xxx";
        }
    
    }
    • 1

    那么,异常通知就会被执行。此时,测试SpringAOPTest类的interceptorTest()方法,会发现Eclipse控制台打印:
    这里写图片描述 
    并且还抛出异常。 
    基于Spring配置文件实现AOP,我们就学习到这里。如要查看源码,可点击使用Spring配置文件实现AOP进行下载。

    aspectj的切入点语法定义细节

    使用Spring的注解方式实现AOP入门一文中,我们就初步了解了一下aspectj的切入点语法。我们可利用方法签名来编写aspectj的切入点表达式。最典型的切入点表达式是根据方法的签名来匹配各种方法:

    • execution (* cn.itcast.service.impl.PersonServiceImpl.*(..)):匹配PersonServiceImpl类中声明的所有方法。第一个*代表任意修饰符及任意返回值类型,第二个*代表任意方法,..匹配任意数量任意类型的参数,若目标类与该切面在同一个包中,可以省略包名。
    • execution public * cn.itcast.service.impl.PersonServiceImpl.*(..):匹配PersonServiceImpl类中的所有公有方法。
    • execution public double cn.itcast.service.impl.PersonServiceImpl.*(..):匹配PersonServiceImpl类中返回值类型为double类型的所有公有方法。
    • execution public double cn.itcast.service.impl.PersonServiceImpl.*(double, ..):匹配PersonServiceImpl类中第一个参数为double类型,后面不管有无参数的所有公有方法,并且该方法的返回值类型为double类型。
    • execution public double cn.itcast.service.impl.PersonServiceImpl.*(double, double):匹配PersonServiceImpl类中参数类型为double,double类型的,并且返回值类型也为double类型的所有公有方法。

    现在若要求只拦截PersonServiceImpl类中返回值类型为String的方法,则aspectj的切入点表达式应该这样写:

    execution(java.lang.String cn.itcast.service.impl.PersonServiceImpl.*(..))
    • 1
    • 1

    若要求拦截PersonServiceImpl类中输入参数中的第一个参数类型为String,后面不管有没有参数的方法,则aspectj的切入点表达式应该这样写:

    execution(* cn.itcast.service.impl.PersonServiceImpl.*(java.lang.String, ..))

    若要求拦截PersonServiceImpl类中返回值类型不是void的所有方法,则aspectj的切入点表达式应该这样写:

    execution(!void cn.itcast.service.impl.PersonServiceImpl.*(..))

    若要求拦截cn.itcast.service包及其子包下的所有类的所有方法,则aspectj的切入点表达式应该这样写:

    execution(* cn.itcast.service..*.*(..))
  • 相关阅读:
    mysql has gone away
    [置顶] 在Visual Studio 2008上调试C语言程序
    滚动加载更多内容
    【jeecg-mybatis版本】 mybatis+spring mvc 完美整合方案 查询,保存,更新,删除自动生成
    Android Developers:按钮
    java 从零开始,学习笔记之基础入门<集合>(十六)
    Ubuntu MYSQL环境搭建
    Android 如何预置APK M
    php基础系列:从用户登录处理程序学习mysql扩展基本操作
    CMUSphinx Learn
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6913424.html
Copyright © 2020-2023  润新知