AOP是什么?
aop是spring中的一个核心的模块,是一种思想: 把某一个或一些方法抽象出一个切点,然后,统一的给这个切点增强,也就是这个切点上的所有方法都会被增强。
- 怎样表示一个切面?
e x e c u t i o n ( ∗ c o m . p a c a g e N a m e . m e t h o d N a m e ( ∗ ) ) execution(* com.pacageName.methodName( *)) execution(∗com.pacageName.methodName(∗)) 类似这种表达式可以表示多个方法为切面。- 怎样表示增强与切点之间的关系?有哪几种增强?
我们可以在方法被调用之前增强,也可以在之后,或者前后都增强等等。有一个概念叫切面,被增强后的切点就叫切面。- spring容器中共有五种通知类型
- 前置通知 @Before 在方法执行前执行
- 后置通知 @After 在方法执行后执行
- 返回通知 @AfterReturning在方法执行前执行,无论是否出现异常
- 异常通知 @AfterThrowing在方法执行前执行,出现异常则不执行
- 环绕通知 @Around可以单独完成以上四个通知
为什么要用AOP来实现?
- 如果有好多个接口都鉴权,那这几个接口里面都要加上鉴权的逻辑。代码比较冗余,而且如果这个鉴权的逻辑要修改的话,所有用到的地方都要同步修改,非常麻烦,不好维护。
- 使用切面来把这些接口增强以后,我只需要在用到的地方加上一个注解,功能就实现了,修改起来也方便。
怎样实现?
- 添加依赖
<!-- 添加AOP依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface AdminPermission {
// 可以添加更多的元信息,如描述等信息
}
- 添加开启aop注解配置,创建切面
@EnableAspectJAutoProxy
// 在启动类上或者配置类上加就行
@Aspect
@Component
public class AdminPermissionAspect {
@Around("@annotation(AdminPermission)")// AdminPermission改成注解的类路径
public Object checkAdminPermission(ProceedingJoinPoint joinPoint) throws Throwable {
// 在这里实现检查当前用户是否为管理员的功能
if (isCurrentUserAdmin()) {
return joinPoint.proceed();
} else {
throw new AccessDeniedException("当前用户不是管理员,无法访问该方法");
}
}
private boolean isCurrentUserAdmin() {
// 实现获取当前用户信息的逻辑,判断是否为管理员
}
}
- 使用
@AdminPermission
public void manageUsers() {
// 管理员特有逻辑
}