Aspectj 框架使用 Annotation 配置 AOP

1、导入 AOP 库,里面包含 aspectj 的库。

2、配置文件中需要配置 aspectj 的支持(红色标注处)

1
2
3
4
5
6
7
8
9
10
11
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<span style="color:#ff0000;">&lt;aop:aspectj-autoproxy />;</span>
<bean id="aspectBean" class="com.jayxhj.ch08.pojos.AspectBean" />
<bean id="userService" class="com.jayxhj.ch08.bean.UserServicesImpl" />
</beans>

3、在 AspectBean 中配置切入点

1
2
3
4
5
6
7
8
9
10
packagecom.jayxhj.ch08.pojos;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect // 必须放在类的前面

public class AspectBean {

1、导入 AOP 库,里面包含 aspectj 的库。

2、配置文件中需要配置 aspectj 的支持(红色标注处)

<?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

xsi:schemaLocation=http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.5.xsd>

<aop:aspectj-autoproxy />

<bean id=“aspectBean” class=“com.jayxhj.ch08.pojos.AspectBean” />

<bean id=“userService” class=“com.jayxhj.ch08.bean.UserServicesImpl” />

</beans>



3、在 AspectBean 中配置切入点

1
2
3
4
5
6
7
8
9
10
packagecom.jayxhj.ch08.pojos;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;



@Aspect // 必须放在类的前面

publicclass AspectBean {

@Pointcut(“execution( com...Service.(..))”) // 切入点表达式

private void all() {

};
// 签名

// 声明签名和切入点表达式

@Before(“all()”)

public void checkAuth() {

}

@After(“all()”)

public void release() {

}

@AfterReturning(returning=”result”,pointcut=”execution(
com...Service.(..))”)

public void log(Object result) {

}



@AfterThrowing(pointcut=”execution(
com...Service.(..))”,throwing=”ex”)

public void processException(Throwable ex) {

}

@Around(“all()”)

public void proceedInTrans(ProceedingJoinPoint joinpoint) throws Throwable {

}

}
注意事项:使用 aspectj 配置增强时 AfterReturning 和 AfterThrowing 的参数需匹配。

基于 Annotation 配置 AOP 的两种方式:

  1. 在每个方法前单独配置;(五种增强都能使用)
  2. 将切入点表达式抽离出来,在需要调用时调用;(AfterReturning 和 AfterThrowing 的参数需匹配,不能使用)