Spring AOP围绕Abstract的Abstract方法调用一些方法class
Spring AOP invoking some methods around Abstract method of Abstract class
我有一个摘要class喜欢
public abstract class EventHandler<T> {
public <T> void preProcess(Message<T> message) {
// do some pre-processing with the Message
}
protected abstract void handleEvent(Message<T> message) throws Exception;
public <T> void postProcess(Message<T> message) {
// do some post-processing with the Message
}
}
有具体的 class 是从这个 Class 延伸出来的。
当在具体 class.
上调用 handleEvent 方法时,我希望能够使用 @Around 方面调用抽象 class 中的 preProcess() 和 postProcess() 方法
我正在尝试定义如下方面
@Aspect
@Configuration
public class SomeAspect {
@Around(value = "execution(* com.handler.EventHandler+.handleEvent(..)))")
public void around(ProceedingJoinPoint proceedingJoinPoint) {
1. invoke preProcess
2. invoke the join point
3. invoke postProcess
}
}
我如何实现我正在寻找的东西?
更新
@Aspect
@Component
public class SomeAspect {
private Logger logger = LoggerFactory.getLogger(TenantAspect.class);
@Around(value = "execution(* com.handler.EventHandler+.handleEvent(..))) && within(com.handler..*) && this(eventHandler) && args(message))")
public void around(ProceedingJoinPoint proceedingJoinPoint, EventHandler<Object> eventHandler, Message<Object> message) {
}
}
尝试了以上方法,编译器给出了事件处理程序和消息的未绑定切入点参数
以下看点也可以做到这一点。
说明
execution(* com.handler.EventHandler+.handleEvent(..))
- 执行名为 handleEvent
的方法,该方法属于 EventHandler
的子类型
within(com.handler..*)
- 在给定包
中建议类的范围界定器
this(eventHandler)
- 执行方法的对象。 target()
也可以用
args(message)
- 运行时传递的参数
备注
一个方面最好用 @Component
注释并且 @Configuration
用于配置。
within
添加以缩小范围advice.Please根据需要修改
@Aspect
@Component
public class EventHandlerAspect {
@Around(value = "execution(* com.handler.EventHandler+.handleEvent(..)) "
+ "&& within(com.handler..*) "
+ "&& this(eventHandler) "
+ "&& args(message))")
public Object around(ProceedingJoinPoint proceedingJoinPoint,
EventHandler<Object> eventHandler,
Message<Object> message) throws Throwable {
Object obj = null;
// 1. invoke preProcess
eventHandler.preProcess(message);
try {
// 2. invoke the join point
obj = proceedingJoinPoint.proceed();
} finally {
// 3. invoke postProcess
eventHandler.postProcess(message);
}
return obj;
}
}
希望这对您有所帮助。
可以直接从proceedingJoinPoint获取目标对象,如下:
((TestClass<Integer>) proceedingJoinPoint.getTarget()).preProcess(message);
//or
((TestClass<Object>) proceedingJoinPoint.getTarget()).preProcess(message);
您需要知道泛型的实例化类型并具有相同类型的匹配消息对象。
如果消息在截获的函数调用的参数中,您可以按如下方式获取它们:
Object[] methodArguments = proceedingJoinPoint.getArgs();
Message<Integer> message = (Message<Integer>) methodArguments[0];
如果消息是第一个参数,它将在 methodArguments[0]
我有一个摘要class喜欢
public abstract class EventHandler<T> {
public <T> void preProcess(Message<T> message) {
// do some pre-processing with the Message
}
protected abstract void handleEvent(Message<T> message) throws Exception;
public <T> void postProcess(Message<T> message) {
// do some post-processing with the Message
}
}
有具体的 class 是从这个 Class 延伸出来的。 当在具体 class.
上调用 handleEvent 方法时,我希望能够使用 @Around 方面调用抽象 class 中的 preProcess() 和 postProcess() 方法我正在尝试定义如下方面
@Aspect
@Configuration
public class SomeAspect {
@Around(value = "execution(* com.handler.EventHandler+.handleEvent(..)))")
public void around(ProceedingJoinPoint proceedingJoinPoint) {
1. invoke preProcess
2. invoke the join point
3. invoke postProcess
}
}
我如何实现我正在寻找的东西?
更新
@Aspect
@Component
public class SomeAspect {
private Logger logger = LoggerFactory.getLogger(TenantAspect.class);
@Around(value = "execution(* com.handler.EventHandler+.handleEvent(..))) && within(com.handler..*) && this(eventHandler) && args(message))")
public void around(ProceedingJoinPoint proceedingJoinPoint, EventHandler<Object> eventHandler, Message<Object> message) {
}
}
尝试了以上方法,编译器给出了事件处理程序和消息的未绑定切入点参数
以下看点也可以做到这一点。
说明
execution(* com.handler.EventHandler+.handleEvent(..))
- 执行名为 handleEvent
的方法,该方法属于 EventHandler
within(com.handler..*)
- 在给定包
this(eventHandler)
- 执行方法的对象。 target()
也可以用
args(message)
- 运行时传递的参数
备注
一个方面最好用 @Component
注释并且 @Configuration
用于配置。
within
添加以缩小范围advice.Please根据需要修改
@Aspect
@Component
public class EventHandlerAspect {
@Around(value = "execution(* com.handler.EventHandler+.handleEvent(..)) "
+ "&& within(com.handler..*) "
+ "&& this(eventHandler) "
+ "&& args(message))")
public Object around(ProceedingJoinPoint proceedingJoinPoint,
EventHandler<Object> eventHandler,
Message<Object> message) throws Throwable {
Object obj = null;
// 1. invoke preProcess
eventHandler.preProcess(message);
try {
// 2. invoke the join point
obj = proceedingJoinPoint.proceed();
} finally {
// 3. invoke postProcess
eventHandler.postProcess(message);
}
return obj;
}
}
希望这对您有所帮助。
可以直接从proceedingJoinPoint获取目标对象,如下:
((TestClass<Integer>) proceedingJoinPoint.getTarget()).preProcess(message);
//or
((TestClass<Object>) proceedingJoinPoint.getTarget()).preProcess(message);
您需要知道泛型的实例化类型并具有相同类型的匹配消息对象。
如果消息在截获的函数调用的参数中,您可以按如下方式获取它们:
Object[] methodArguments = proceedingJoinPoint.getArgs();
Message<Integer> message = (Message<Integer>) methodArguments[0];
如果消息是第一个参数,它将在 methodArguments[0]