将不同的建议应用于不同的范围
Apply different Advices to different Scopes
我正在尝试对不同的 类(范围)应用不同的建议。我是这样配置的:
new AgentBuilder.Default()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.type((name(equals(com.toto.titi.Class1)) or name(equals(com.toto.titi.Class2))))
.transform(new AgentBuilder.Transformer.ForAdvice()
.advice(ElementMatchers
.isAnnotatedWith(named(annotationClassName))
.or(name(equals(com.toto.titi.Class1))))
, com.tata.Advice1))
.transform(new AgentBuilder.Transformer.ForAdvice()
.advice(ElementMatchers
.isAnnotatedWith(named(annotationClassName))
.or(name(equals(com.toto.titi.Class2))))
, com.tata.Advice2));
我遇到的问题是两个建议(com.tata.Advice1 和 com.tata.Advice2)都应用于所有 类(com.toto.titi。 Class1 和 com.toto.titi.Class2)。而我想做的是仅将 com.tata.Advice1 应用于 com.toto.titi.Class1 并将 com.tata.Advice2 应用于 com.toto.titi.Class2.
我错过了什么?我该怎么做?
您可以将任意数量的匹配器与它们的每个转换链接在一起。如果您申请:
agentBuilder
.type(matcher1).transform(transformer1)
.type(matcher2).transform(transformer2)
这将只对与 1 匹配的类型应用第一个建议,反之亦然。在您的示例中,您应用:
agentBuilder
.type(matcher1.or(matcher2)).transform(transformer1).transform(transformer2)
如果任一匹配器适用,您将同时应用两个转换器。您需要将匹配器模式从第二个概念更改为第一个。
我正在尝试对不同的 类(范围)应用不同的建议。我是这样配置的:
new AgentBuilder.Default()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.type((name(equals(com.toto.titi.Class1)) or name(equals(com.toto.titi.Class2))))
.transform(new AgentBuilder.Transformer.ForAdvice()
.advice(ElementMatchers
.isAnnotatedWith(named(annotationClassName))
.or(name(equals(com.toto.titi.Class1))))
, com.tata.Advice1))
.transform(new AgentBuilder.Transformer.ForAdvice()
.advice(ElementMatchers
.isAnnotatedWith(named(annotationClassName))
.or(name(equals(com.toto.titi.Class2))))
, com.tata.Advice2));
我遇到的问题是两个建议(com.tata.Advice1 和 com.tata.Advice2)都应用于所有 类(com.toto.titi。 Class1 和 com.toto.titi.Class2)。而我想做的是仅将 com.tata.Advice1 应用于 com.toto.titi.Class1 并将 com.tata.Advice2 应用于 com.toto.titi.Class2.
我错过了什么?我该怎么做?
您可以将任意数量的匹配器与它们的每个转换链接在一起。如果您申请:
agentBuilder
.type(matcher1).transform(transformer1)
.type(matcher2).transform(transformer2)
这将只对与 1 匹配的类型应用第一个建议,反之亦然。在您的示例中,您应用:
agentBuilder
.type(matcher1.or(matcher2)).transform(transformer1).transform(transformer2)
如果任一匹配器适用,您将同时应用两个转换器。您需要将匹配器模式从第二个概念更改为第一个。