如何解决通过将策略传递给 Aspect 来创建动态建议
我试图根据它提供建议的类/方法使我的建议更加动态。寻找类似这个伪代码的东西:
class Activity
private TheAdviceStrategyInterface activityAdviceStrategy = new ActivityAdviceStrategy();
@Entity(adviceStrategy = activityAdviceStrategy)
public void doSomething(ActivityInput ai) { ... }
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Entity {
public TheAdviceStrategyInterface adviceStrategy();
}
@Aspect
public class TheAdvice {
@Around("@annotation(entity)")
public Object doStuff (ProceedingJoinPoint pjp,Entity entity) {
...
TheAdviceStrategyInterface theStrat = entity.adviceStrategy();
....
}
}
当然我们不能有对象或接口作为注解参数。
关于我如何实现这一点的任何“建议”?我基本上想要一个 Aspect 注释来处理非常相似的情况,略有不同,具体取决于哪个类使用该注释。
解决方法
当然我们不能有对象或接口作为注解 参数。关于如何实现这一点的任何“建议”?
1- 在 Entity
接口中创建一个 String 参数来表示可能的策略:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Entity {
public String adviceStrategy();
}
2- 创建一个实现 factory pattern 的类,例如:
public class TheAdviceStrategyFactory {
//use getShape method to get object of type shape
public TheAdviceStrategyInterface getStrategy(String strategy){
if(strategy == null){
return null;
}
if(strategy.equalsIgnoreCase("Strategy1")){
return new TheAdviceStrategy1();
} else if(strategy.equalsIgnoreCase("Strategy2")){
return new TheAdviceStrategy2();
return null;
}
}
使用类 TheAdviceStrategy1
和 TheAdviceStrategy2
实现接口 TheAdviceStrategyInterface
。
在建议中充分利用两者:
@Aspect
public class TheAdvice {
@Around("@annotation(entity)")
public Object doStuff (ProceedingJoinPoint pjp,Entity entity) {
...
TheAdviceStrategyFactory factory = new TheAdviceStrategyFactory();
TheAdviceStrategyInterface theStrat = factory.getStrategy(entity.adviceStrategy());
....
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。