AOP實現時的 service.ProductService
service.AuthService.checkAcess() 被移到了security.SecurityAspect了
非AOP實現時的 service.ProductService
// AOP 實現
定義 annotation標註(@interface AdminOnly)
定義 aspect剖面 (class SecurityAspect)
在剖面裡建立 pointcut切入點 (@Pointcut(指定器))
@Pointcut("@annotation(AdminOnly)")
public void adminOnly(){} // 切入函數
在剖面裡建立 advice(@Before("切入函數名"))
@Before("adminOnly")
public void check(){} // advice函數
// test product service
@Test(expected = Exception.class) // 拋出異常則通過測試
匿名刪除測試(){
security.CurrentUserHolder.set("匿名")
service.ProductService.delete() // 將會拋出異常
}
@Test // 不拋出異常則通過測試
管理員刪除測試() {
security.CurrentUserHolder.set("管理員")
service.ProductService.delete() // 不會拋出異常
}
service.AuthService
check() { // throws RuntimeException
securtiy.CurrentUserHolder.get()
}
security.CurrentUserHolder
static get()/set()
domain.Product
定义切面拦截器
工程中使用AOP,需要再pom.xml中引入依赖包
AOP 案例实战 之
使用注解的方式进行 AOP 切面编程,对代码业务进行增强:
第二步: 创建一个自定义注解
AdminOnly类
AOP 案例实战 之
使用注解的方式进行 AOP 切面编程,对代码业务进行增强:
第一步:
创建 SecurityAspect 切面类,该类 创建一个 切点@Pointcut 注解的方法adminOnly,当要对一个业务进行增强时,对该业务添加@Pointcut(“自定义注解”)的自定义注解便可;
同时创建一个 被@Before 前置通知注解的方法 check(),该方法会在被添加了切点的业务执行实例化前先执行, 也就是 可用的业务的前置校验,当该前置通知的方法校验失败,则不执行业务代码
第五步: 传统的方法:
在ProductService中添加 "checkAccess",
第四步: 创建 AuthService 类,声明一个 "checkAccess" 方法,作为切面函数在指定切点上对业务进行权限控制所用
第二步: 创建 ProductService 业务类,该类用于案例中具体进行权限管理的 所在。
如截图中的 "checkAccess" 般,切面以该方式被调用来验证当前方法是否已经登录或获得权限执行下一步的操作
第一步: 创建 Product ,该类作为案例的模型
AOP 案例实战之
案例背景说明:
新增切面、注解
切面中设置监控的目标,比如一个注解
在需要监控的地方设置这个注解
案例背景:产品的添加和删除操作只有管理员才能进行
普通实现 VS AOP实现
springboot
把原有的代码分离出来变成无侵入的 ,避免出现复杂的业务逻辑
单元测试 annotation写法
普通方法实现:
硬编码,对代码的侵入性比较大
@Pointcut("@annotation(AdminOnly)") //切点为标注有 AdminOnly注解的方法
public void adminOnly(){}
@Before("adminOnly()") // 表示在该方法之前执行check()
public void check(){}
AOP注解注解实现:
@Aspect:切面 = 切点+通知(手动添加的代码,一般是方法); @Point:切点,横切关注点;
@Before(前置通知):添加的内容在切点之前执行;
@After(后置通知): 添加的内容在切点之后执行
还有环绕通知,异常通知,返回通知
------------------------------------
@Autowired:自动装配,与Spring注入相关,可按类型、名装配; Spring注解@Component、@Controller、@Service、@Repository;
传统方式的缺点:这种方式属于硬编码,对引入者代码是有侵入的。如果对删除或增加产品还有其它关联操作,添加代码时会增加代码复杂度。而AOP会将校验分离出来变成无侵入
service里使用
侵入性更少
声明AdminOnly注解
AOP方式
Pointcut:切入位置,增加AdminOnly注解,表示对有AdminOnly注解进行操作
Before:在AdminOnly之前进行的操作
传统方式的缺点:这种方式属于硬编码,对引入者代码是有侵入的。如果对删除或增加产品还有其它关联操作,添加代码时会增加代码复杂度。而AOP会将校验分离出来变成无侵入
传统方式,在操作前调用校验方法