Spring配置切面

来源:互联网 发布:风暴英雄数据查询 编辑:程序博客网 时间:2024/05/21 10:30

  • 配置文件
  • 切面实现类
  • 切面表达式详解
  • 测试代码

配置文件

  • applicationContext.xml配置
<!-- 配置切面所需要的目标类型 -->    <bean id="userDao" class="dao.impl.UserDaoImpl"/>    <!-- 配置切面所需要的bean类 -->    <bean id="comboAspect" class="aop.aspect.ComboAspect"/>    <!-- 配置切面 -->    <aop:config>        <aop:pointcut id="pointCut" expression="execution(* modUser(..))" />        <aop:aspect id="comboAdvice" ref="comboAspect">            <aop:around pointcut-ref="pointCut" method="aroundIntercept"/>            <aop:after-returning  pointcut-ref="pointCut" method="afterIntercept" returning="result"/>            <aop:before pointcut-ref="pointCut" method="beforeIntercept"/>        </aop:aspect>    </aop:config>
  • <aop:pointcut/>配置切入点
  • <aop:aspect/>配置切面实现类
  • expression属性配置要执行切面的方法的表达式

切面实现类

package aop.aspect;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;/** * @author zhangxingrui 定义切面类(切面类中可以定义很多增强方法) *  */public class ComboAspect {    // 前置增强,第一个参数必须是连接点类型    public void beforeIntercept(JoinPoint jp) {         System.out.println("=========前置增强----beforeIntercept===========");        Object[] params = jp.getArgs();// 获取调用的目标方法的参数(参数数组)        String methodName = jp.getSignature().getName();// 方法的签名(方法名、参数列表、返回类型)        Object target = jp.getTarget();// 返回调用的目标对象        Object target02 = jp.getThis();// 返回调用的目标对象        System.out.println("目标对象target:" + target);        System.out.println("目标对象this:" + target02);        System.out.println("目标方法methodName:" + methodName);        System.out.println("方法参数params:" + params);    }    // 环绕增强    public Object aroundIntercept(ProceedingJoinPoint pjp) throws Throwable {        System.out.println("=========环绕增强----aroundInterceptBefore===========");        Object[] params = pjp.getArgs();        String methodName = pjp.getSignature().getName();        Object target = pjp.getTarget();        Object target02 = pjp.getThis();        System.out.println("目标对象target:" + target);        System.out.println("目标对象this:" + target02);        System.out.println("目标方法methodName:" + methodName);        System.out.println("方法参数params:" + params);        Object result = pjp.proceed(params); // 调用目标Bean中的方法        System.out.println("=========aroundInterceptAfter===========");        return 2; // 该方法的返回值就是应用层获取到的值    }    // 后置增强,如果是异常增强处理方法则第二个参数可以定义为:Exception exception    public void afterIntercept(JoinPoint jp, Object result) {        System.out.println("=========后置增强----afterIntercept===========");        Object[] params = jp.getArgs();        String methodName = jp.getSignature().getName();        Object target = jp.getTarget();        Object target02 = jp.getThis();        System.out.println("目标对象target:" + target);        System.out.println("目标对象this:" + target02);        System.out.println("目标方法methodName:" + methodName);        System.out.println("方法参数params:" + params);        System.out.println("目标方法返回结果:" + result);    }}

切面表达式详解

  • modUser(..) :表示匹配所有方法名称为modUser的方法
  • mod*(..) :表示匹配所有方法名以mod开头的方法
  • mod*(String,..) :表示匹配所有方法名以mod开头且第一个参数为String类型的方法
  • mod*(String,*) :表示匹配所有方法名以mod开头、有两个参数且第一个参数为String类型的方法
  • com.scxh.dao.impl..mod(..):表示匹配com.scxh.dao.impl包下所有类中以mod开头的方法
  • com.scxh.dao...mod*(..):表示匹配com.scxh.dao包下所有类中以mod开头的方法
  • com.scxh.dao..UserDaoImpl.(..):表示匹配com.scxh.dao包下所有UserDaoImpl类中的所有方法
  • com..dao..UserDaoImpl.mod*(..)):表示匹配com包下二级子包名为dao中的所有UserDaoImpl类中的所有以mod开头的方法

测试代码

  • 要执行切面的方法
package dao.impl;public class UserDaoImpl{    public Integer addUser() {        return 0;    }    public Integer delUser() {        return 1;    }    public Integer modUser() {        System.out.println("==========目标类(DAO实现类)中的方法被调用=========");        return 1;    }    public Object getUser() {        return null;    }}
  • 测试执行
package test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import dao.impl.UserDaoImpl;public class TestAop {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");        UserDaoImpl userDaoImpl = (UserDaoImpl)context.getBean("userDao", UserDaoImpl.class);        userDaoImpl.modUser();    }}
原创粉丝点击