Spring配置切面

配置文件

  • applicationContext.xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 配置切面所需要的目标类型 -->
<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属性配置要执行切面的方法的表达式

切面实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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开头的方法

测试代码

  • 要执行切面的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}
}
  • 测试执行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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();
    }
    }
zhangxingrui wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!