Spring配置切面

配置文件

  • 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();
    }
}

猜你喜欢

转载自blog.csdn.net/fututadeyoushang/article/details/78122549
今日推荐