以下是“聊聊注解@Aspect的AOP实现操作”的完整攻略,包含两个示例说明。
简介
在Java中,AOP(面向切面编程)是一种编程范式,它允许开发人员在不修改源代码的情况下,通过在代码中插入切面来实现横切关注点。在本教程中,我们将介绍如何使用注解@Aspect实现AOP操作,并提供两个示例说明。
示例1:记录方法执行时间
以下是一个记录方法执行时间的示例:
1. 添加依赖
在Maven项目中,添加以下依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.8</version>
</dependency>
2. 创建切面
创建一个切面类,并使用注解@Aspect标记:
@Aspect
@Component
public class TimeAspect {
@Around("execution(* com.example.demo.service.*.*(..))")
public Object logTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
System.out.println(joinPoint.getSignature() + "执行时间:" + (endTime - startTime) + "ms");
return result;
}
}
在这个示例中,我们使用注解@Around定义一个环绕通知,并使用切点表达式execution(* com.example.demo.service.*.*(..))
匹配所有com.example.demo.service
包中的方法。
3. 使用切面
在需要使用切面的类中,使用注解@Autowired注入切面:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private TimeAspect timeAspect;
@Override
public User getUserById(Long id) {
// ...
}
}
在这个示例中,我们使用注解@Autowired注入切面,并在方法中调用切面方法。
4. 运行程序
运行程序,并查看控制台输出。
现在,每次调用com.example.demo.service
包中的方法时,都会记录方法执行时间。
示例2:记录方法调用次数
以下是一个记录方法调用次数的示例:
1. 创建切面
创建一个切面类,并使用注解@Aspect标记:
@Aspect
@Component
public class CountAspect {
private Map<String, Integer> countMap = new HashMap<>();
@AfterReturning("execution(* com.example.demo.service.*.*(..))")
public void count(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
if (countMap.containsKey(methodName)) {
countMap.put(methodName, countMap.get(methodName) + 1);
} else {
countMap.put(methodName, 1);
}
System.out.println(methodName + "调用次数:" + countMap.get(methodName));
}
}
在这个示例中,我们使用注解@AfterReturning定义一个后置通知,并使用切点表达式execution(* com.example.demo.service.*.*(..))
匹配所有com.example.demo.service
包中的方法。我们使用一个Map来记录每个方法的调用次数,并在每次方法调用后输出调用次数。
2. 使用切面
在需要使用切面的类中,使用注解@Autowired注入切面:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private CountAspect countAspect;
@Override
public User getUserById(Long id) {
// ...
}
}
在这个示例中,我们使用注解@Autowired注入切面,并在方法中调用切面方法。
3. 运行程序
运行程序,并查看控制台输出。
现在,每次调用com.example.demo.service
包中的方法时,都会记录方法调用次数。
总结
在Java中,使用注解@Aspect可以实现AOP操作,允许开发人员在不修改源代码的情况下,通过在代码中插入切面来实现横切关注点。在本教程中,我们介绍了如何使用注解@Aspect实现记录方法执行时间和记录方法调用次数的操作,并提供了两个示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:聊聊注解@Aspect的AOP实现操作 - Python技术站