有没有办法复合拦截器

时间:2016-09-30 07:29:09

标签: java byte-buddy

我是ByteBuddy的新手并且有一个简单的问题。有没有办法如何通过注释将拦截器组合在一起。类似的东西:

@Logging
@Transactional
public void foo() {}

会添加日志记录拦截器并确保它是事务性的吗?

2 个答案:

答案 0 :(得分:0)

当然,如果您使用ByteBuddy实例,则由使用的ElementMatcher决定:

annotatedWith(Logging.class).or(annotatedWith(Transactional.class))

当您使用AgentBuilder时,您将为每种类型定义一个检测,您可以使用

组合不同类型的匹配器
.type(declaresMethod(annotatedWith(Logging.class)))       
   .transform(new LoggingTranformer())
   .asDecorator()
.type(declaresMethod(annotatedWith(Transactional.class)))
   .transform(new TransactionalTranformer())
   .asDecorator()

使用asDecorator()命令,两个变换器被链接。

答案 1 :(得分:0)

感谢Rafael Winterhalter和讨论,我发布了他建议的答案:

  

您需要编写自己的通用调度程序。我建议你创建一些通用调度程序,然后以编程方式委派。   
  例如:   isAnnotatedWith(anyOf(dispatcher.getAnnotationTypes())然后调度程序将路由到相关组件。