原理
cglib
JDK Proxy实现。
Spring-AOP 简介
@see: https://www.baeldung.com/spring-aop
AspectJ 简介
@see: https://www.baeldung.com/aspectj
maven 依赖
implementation 'org.springframework:spring-aop:5.2.0.RELEASE' // <----- 似乎只支持XML
// AOP
// https://mvnrepository.com/artifact/org.aspectj/aspectjrt
implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.6'
// https://mvnrepository.com/artifact/org.aspectj/aspectjweaver
implementation group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.6'
测试
package aop
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.ApplicationContext
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.EnableAspectJAutoProxy
import org.springframework.stereotype.Component
import org.springframework.test.context.junit.jupiter.SpringExtension
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig
var isHandle = false
interface Foo {
fun bar(): String = "Foo#bar()"
}
@Component
class MyFoo : Foo {
override fun bar(): String {
println("calling")
return super.bar()
}
}
@Component
@Aspect
@EnableAspectJAutoProxy
class MyAspect {
@Before("execution(String bar())")
fun handle() {
println("handle called")
isHandle = true
}
}
@ComponentScan
class HeadfirstAOPJavaConfig
@ExtendWith(SpringExtension::class)
@SpringJUnitConfig(HeadfirstAOPJavaConfig::class)
class HeadfirstAOP {
@Autowired lateinit var ctx: ApplicationContext
@Autowired lateinit var foo: Foo
@Test fun `handle() should be call`() {
assertFalse(isHandle)
val str = foo.bar()
assertTrue(isHandle)
println("str=$str")
}
}