Spring AOP如何使用AspectJ注解进行开发呢?
下文讲述Spring AspentJ中采用注解的方式定义切面、切入点和增强处理的示例
在 XML 文件中添加以下内容启用 @AspectJ
// 要求:方法必须是private,返回值类型为void,名称自定义,没有参数
前置通知
后置通知
返回值为:java265
前置通知
后置通知
返回值为:88
前置通知
抛出异常
后置通知
这里的异常为:java.lang.IllegalArgumentException
Annotation注解
注解名称 | 备注 |
@Aspect | 用于定义一个切面 |
@Pointcut | 用于定义一个切入点 |
@Before | 用于定义前置通知,相当于 BeforeAdvice |
@AfterReturning | 用于定义后置通知,相当于 AfterReturningAdvice |
@Around | 用于定义环绕通知,相当于MethodInterceptor |
@AfterThrowing | 用于定义抛出通知,相当于ThrowAdvice |
@After | 用于定义最终final通知,不管是否异常,该通知都会执行 |
@DeclareParents | 用于定义引介通知,相当于IntroductionInterceptor |
启用 @AspectJ 注解有以下两种方法
方式一、使用@Configuration和@EnableAspectJAutoProxy注解@Configuration @EnableAspectJAutoProxy public class Appconfig { }方式二、基于XML配置
在 XML 文件中添加以下内容启用 @AspectJ
<aop:aspectj-autoproxy >
定义切面@Aspect
AspectJ 类和其它普通的 Bean 一样,可以有方法和字段,不同的是 AspectJ 类需要使用 @Aspect 注解,如下:package com.java265; import org.aspectj.lang.annotation.Aspect; @Aspect public class AspectModule { } 其效果类似于xml配置 <bean id = "myAspect" class = "net.biancheng.AspectModule"> ... </bean>
定义切入点@Pointcut
@Pointcut 注解用来定义一个切入点,如// 要求:方法必须是private,返回值类型为void,名称自定义,没有参数
@Pointcut("execution(*com.java265..*.*(..))") private void myPointCut() { } 类似于以下xml配置 <aop:pointcut expression="execution(*com.java265..*.*(..))" id="myPointCut"/ >
定义通知advice
@AspectJ 支持 5 种类型的 advice,以下为使用 @Before 的示例。 @Before("myPointCut()") public void beforeAdvice(){ ... }例
- 创建 SpringDemo 项目
- 在 src 目录下创建 com.java265 包
- 导入 Spring 相关 JAR 包及 Aspectjrt.jar、Aspectjweaver.jar、Aspectj.jar
- 在 com.java265 包下创建 Logging、Man、Beans.xml 和 MainApp
- 运行 SpringDemo 项目
package com.java265; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @Aspect public class Logging { /** * 定义切入点 */ @Pointcut("execution(* com.java265.*.*(..))") private void selectAll() { } /** * 前置通知 */ @Before("selectAll()") public void beforeAdvice() { System.out.println("前置通知"); } /** * 后置通知 */ @After("selectAll()") public void afterAdvice() { System.out.println("后置通知"); } /** * 返回后通知 */ @AfterReturning(pointcut = "selectAll()", returning = "retVal") public void afterReturningAdvice(Object retVal) { System.out.println("返回值为:" + retVal.toString()); } /** * 抛出异常通知 */ @AfterThrowing(pointcut = "selectAll()", throwing = "ex") public void afterThrowingAdvice(IllegalArgumentException ex) { System.out.println("这里的异常为:" + ex.toString()); } }Man 类
package com.java265; public class Man { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void throwException() { System.out.println("抛出异常"); throw new IllegalArgumentException(); } }Beans.xml
<?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-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy /> <bean id="man" class="com.java265.Man"> <property name="name" value="java265" /> <property name="age" value="88" /> </bean> <bean id="logging" class="com.java265.Logging" /> </beans>MainApp 类
package com.java265; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); Man man = (Man) context.getBean("man"); man.getName(); man.getAge(); man.throwException(); } }运行结果---
前置通知
后置通知
返回值为:java265
前置通知
后置通知
返回值为:88
前置通知
抛出异常
后置通知
这里的异常为:java.lang.IllegalArgumentException
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。