网页设计与网站建设完全学习手册,免费企业电话名录,西安seo代理计费,百度搜索关键词统计前言
AOP编程在Java开发中是一个非常火热的话题#xff0c;最著名的库为AspectJ
Kotlin项目中#xff0c;通过Gradle插件#xff0c;也能够使用该库#xff0c;这是我们下面讲解的重点
由于AspectJ的原理是在预编译阶段#xff0c;通过插件修改代码#xff0c;生成代理…前言
AOP编程在Java开发中是一个非常火热的话题最著名的库为AspectJ
Kotlin项目中通过Gradle插件也能够使用该库这是我们下面讲解的重点
由于AspectJ的原理是在预编译阶段通过插件修改代码生成代理对象
属于编译阶段的功能因为非常依赖编译工具的版本
这里用的版本是Gradle8.7如果不兼容记得调整版本号
Gradle脚本代码用的也是Gradle8.7KotlinScript的语法记得根据版本调整
引入插件依赖
pluginManagement {plugins {id(org.jetbrains.kotlin.jvm) version 1.9.23 apply falseid(io.freefair.aspectj.post-compile-weaving) version 8.7.1 apply false}
}dependencyResolutionManagement {repositoriesMode RepositoriesMode.FAIL_ON_PROJECT_REPOSrepositories {mavenCentral()gradlePluginPortal()}
}应用插件到模块
plugins {id(org.jetbrains.kotlin.jvm)id(io.freefair.aspectj.post-compile-weaving)
}dependencies {api(org.aspectj:aspectjrt:1.9.6)api(org.aspectj:aspectjweaver:1.9.6)
}Kotlin代码
package com.code.kotlinfun main() {Good().doSomething()
}class Good {fun doSomething() {println(doSomething)}
}AOP规则
插件会自动搜索带有Aspect注解的文件
Pointcut通过特征表达式来指定切入点即要拦截哪些方法
Before After指定切入方式即在什么时机切入方法执行前还是方法执行后
其它更详细的注解大家自己根据需要去了解这里主要讲解集成和使用方式
package com.code.kotlinimport org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.After
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.aspectj.lang.annotation.PointcutAspect
class AspectRule {Pointcut(execution(* com.code.kotlin.Good.doSomething(..)))fun anyFunction() {}Before(anyFunction())fun beforeFunction(joinPoint: JoinPoint) {println(before function executed: $joinPoint)}After(anyFunction())fun afterFunction(joinPoint: JoinPoint) {println(after function executed: $joinPoint)}
}运行结果
before function executed: execution(void com.code.kotlin.Good.doSomething())
doSomething
after function executed: execution(void com.code.kotlin.Good.doSomething())优势分析
可以看到简单引入和应用插件即可
AOP代码完全独立于原始代码真正做到了代码解耦
非常适合对关键位置代码进行监听和修改的需求
注意事项
由于生成的代码依赖于Gradle插件
所以AOP规则修改后如果代码没生效可以尝试Reload一下Gradle脚本
另外此插件和安卓编译插件在实现方式上容易产生版本冲突
安卓项目需要使用AOP建议使用其它插件这个我们下一章会讲解