我试图在abstract class
内的一个protected
方法被调用后执行一些代码。它看起来像这样。
abstract class SomeAbstractClass : ServiceOne, ServiceTwo {
protected fun doSomething(p1: String, p2: Int): SomeEntity {
// some business logic
return SomeEntity()
}
}
我想创建像下面一样的annotation class
,并用它注释方法(上面),我希望它在类方法返回值后执行。我尝试了这个和许多其他的变化,但没有一个对我有效。
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class EntityCreated {
@Aspect
@Component
class EntityAspect {
@AfterReturning("@annotation(EntityCreated)")
fun afterSuccessfulCreate(jp: JoinPoint) {
// Created, execute something here
}
}
}
虽然JDK代理在代理接口时禁止使用受保护的方法,但Spring用于扩展类的CGLIB代理可以拦截受保护的方法。但是为了代理Kotlin类,你必须打开它,所以它不是最终的,可以被代理。
请注意,如果你在Java中重写了一个受保护的方法,这个被重写的方法将不会"继承"。父方法的注释。这是Java的限制,与AOP无关。如果注释带有@Inherited
元注释,则注释继承仅从父类到子类有效。有一种在原生AspectJ中使用称为ITD(类型间定义)的技术的高级形式来模拟注释继承的方法,但在简单的Spring AOP中没有。
你的问题的确切答案取决于你的确切用例,你的样本代码太零碎了,不能回答更多的细节。