登录每个app都在写,很多人没有将登录写好。
这里不是写一个登录请求的需求,而是有没有登录,没有就跳转到登录界面的需求。
其实这是一个全局业务架构,全局业务抽取到一个切面来完成。
即AOP全局业务的登录架构。
OOP写法:从SharePreference中拿一个isLogined属性,判断它是否为true。
如为true,就跳转到我的优惠券、我的积分、我的专区等等。
如为false,就startActivity(new Intent())跳转到LoginActivity。
真的是这样来写吗?
集中式登录架构设计
方式一:动态代理方式切面
登录业务 是全局的共同业务,可以采用AOP面向切面的思想,把登录业务给切出来。
这里采用动态代理的方式将登录业务切面。还有没有其他方式呢?
方式二:预编译方式
看到纵向的业务,都有登录业务,采用AOP切面的方式,切出一个橫面来处理。
其实看到这样的业务,也让我们联想到用户行为统计,它也是全局业务。如:点击了登录按钮、点击了xx按钮等。
用OOP的方式做用户行为统计,大概就是这样:
void method(){
xxx; // 开始统计
yyy; // 业务逻辑
zzz; // 结束统计
}
但这样做可以吗?明显不可以,每个要求的方法都这样,那不是添乱吗。还是采用AOP方式。
AspectJ是一个面向切面的框架,它扩展了Java语言。
AspectJ定义了AOP语法,它有一个专门的编译器用来生成(遵守java字节编码规范的)class文件。
编译过程:通过javac将java文件转成可执行的class文件,这是个ReBuild过程。
AspectJ可以替代javac的工作(注:不是替代javac将java转成class的功能),即AspectJ有完成编译工作的能力。
有了AspectJ就可以在预编译期(生存class文件)的时候,在class中植入一些新的代码。那么我们就可以做到AOP。
AspectJ:切面(切入点和通知的集合)
- 切入点(PointCut):那些通过使用一些特定的表达式过滤出来的想要切入通知的连接点。
- 通知(Advice):是向切入点中注入的代码的一种实现方法。
- 连接点(Joint Point):所有的目标方法都是连接点。
简单讲:
- 切入点:你需要切面的点在哪里,从哪里切
- 通知:有几种方式
- Before:在切入的方法执行之前来运行我们的代码。
- After:在切入的方法执行之后来运行我们的代码,也就是切面里面要处理的代码。
- Around:在方法执行前后都运行我们的方法。
预编译方式AOP
AspectJ有坑:下面是一些临界版本
AS | gradle | 坑 |
---|---|---|
3.0.1 | 4.4-all | ndk r17 |
3.2.1 | 4.6-all | 无 |
3.4.0 | 5.1.1-all | 过时的API警告(2019年之后方法过时) |
版本界限:AS-3.0.1 + gradle-4.4-all (需配置r17的ndk环境) 或者 AS-3.2.1 + gradle-4.6-all (正常使用无警告)
AS项目中根目录下的build.gradle、gradle-wrapper.properties文件来修改。
代码展示之前期准备
搭建aspectj环境:
引