AOP面向切面结构设计
通过预编译的方式和运行时动态代理,实现程序功能。OOP的延续和升级。
AOP可以将各个业务逻辑进行分离,降低业务逻辑耦合,实现可重用。
面向切面的思想是把需要抽取的相同业务功能,做成一个切面,场景的callback就是基于这种思想。
AOP的本质是在纵向的业务流程中,把相同业务的子流程,抽取成横向的面。
动态代理切面需求
数据库在增删改的过程,做数据备份,通过动态代理,进行数据保存。
public interface DBOperation {
void insert();
void delete();
void update();
// 数据备份
void save();
}
正常按照OOP思想,在每次调用 delete、insert 、update之前都调用 一次save, 会造成冗余,并且可能会忘记执行save
把共同的业务save抽取出来,形成切面,通过运行时动态代理的方式,在方法执行前,执行save
预编译的方式实现面向切面编程, 集中式登录架构设计
全局业务抽取到切面完成
AspectJ:面向切面编程的框架,扩展了java语音,定义了实现AOP的语法。
普通编译 通过 javac java->class
AspectJ可以替代 javac 的工作,在预编译期, 生成 class时, 植入新的代码。
Aspect 切面,是指切入点和通知的集合
PointCut:切入点
通过使用特定表达式过滤出来的想要切入Advice的点。从哪里切
Advice:通知 Before After Around..
向切入点注入代码的实现方式
Joint Point:链接点
所有的目标方法都是链接点
AspectJ的一些坑:
as3.0.1 + gradle4.4-all ndk r17
as3.2.1 + gradle4.6-all ok
as6.4.0 + gradle 5.1.1-all 有过时的api警告
代码
配置AspectJ环境 gradle4.4-all
登录界面 以及需要登录之后才能操作的界面,如果没有登录,通过切面跳转到登录界面。
如果按照OOP的思想,每个行为开始和结束时,都执行相同的 统计代码,会造成大量的冗余代码。
通过注解的方式
自定义注解,通过注解定义切入点
切面类:
执行代码
登录检查
自动以注解
引入注解
定义切面类:
运行结果: