一、Spring AOP概述
Spring AOP是一个基于Spring框架的面向切面编程的实现,通过在不改变原有业务逻辑的情况下,对主要逻辑进行增强,实现更灵活,更可维护的代码。
二、实现步骤
1. 添加依赖
在pom.xml文件中添加spring-aop和aspectjweaver的依赖。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>
</dependencies>
-
编写切面类
切面类是一个Java类,用于增强主业务逻辑。其中主要包含下面三个部分: -
切点:用于描述需要增强的方法
- 通知:用于描述切面逻辑,常用的有before,after和around
- 切面:将切点和通知绑定起来
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(* com.example.*.*(..))")
public void pointcut() {}
@Before("pointcut()")
public void before(JoinPoint joinPoint) {
System.out.println("before");
}
@After("pointcut()")
public void after(JoinPoint joinPoint) {
System.out.println("after");
}
}
- 切点使用@Pointcut注解定义,它描述了需要增强的方法,上面的代码描述了com.example包下的所有方法。
- 通知使用@Before注解定义,在方法执行之前执行。
- 通知使用@After注解定义,在方法执行之后执行。
-
切面需要使用@Aspect注解声明,并且也需要是一个Spring组件。
-
配置Spring AOP
在Spring的配置文件中配置切面类。
<aop:aspectj-autoproxy />
<bean id="myAspect" class="com.example.MyAspect" />
- 测试Spring AOP效果
创建一个测试类,测试Spring AOP是否生效。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class MyTest {
@Autowired
private MyService myService;
@Test
public void test() {
myService.doSomething();
}
}
@Service
public class MyService {
public void doSomething() {
System.out.println("doSomething");
}
}
上面的代码输出:
before
doSomething
after
- AOP示例一:业务方法执行时间记录
在切面中使用System.currentTimeMillis()记录方法执行时间。
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(* com.example.*.*(..))")
public void pointcut() {}
@Around("pointcut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = proceedingJoinPoint.proceed();
long endTime = System.currentTimeMillis();
System.out.println(proceedingJoinPoint.getSignature().getName() + " cost " + (endTime-startTime) + "ms");
return result;
}
}
测试代码输出:
doSomething cost 10ms
- AOP示例二:处理异常
在切面中使用try-catch语句处理业务方法抛出的异常。
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(* com.example.*.*(..))")
public void pointcut() {}
@Around("pointcut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object result = null;
try {
result = proceedingJoinPoint.proceed();
} catch (RuntimeException e) {
System.out.println(e.getMessage());
}
return result;
}
}
测试代码可以抛出异常:
@Service
public class MyService {
public void doSomething() {
throw new RuntimeException("error");
}
}
测试代码输出:
error
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring AOP面向切面编程实现及配置详解 - Python技术站