正在播放的课程列表
SomeStrategyInterface
- 战略模式的界面
FooStrategy
- SomeStrategyInterface
的实施
BarStrategy
- SomeStrategyInterface
的实施
BazStrategy
- SomeStrategyInterface
的实施
StrategyProvider
- 工厂类提供SomeStrategyInterface
的具体实施
MessageDispatcher
- 在消息类型上向工作线程分派消息的类
ABTask
- 一种处理特定消息类型并需要StrategyProvider
流程是
MessageDispatcher
- > new ABTask()
- > StrategyProvider.get()
public class ABTask implements Runnable{
public ABTask(StrategyProvider provider){
this.provider = provider
}
public void run(){
//need to use StrategyProvider here
}
}
public class MessageDispatcher{
private final StrategyProvider provider;
public void handleMsg(){
//I don't want to pass provider from here
new ABTask(provider)
}
}
现在要访问StrategyProvider
我必须将其实例从MessageDispatcher
传递到ABTask
,因为我正在使用Spring Dependency Injection
。虽然通过这样做,我正在向MessageDispatcher
课程添加噪音。所以我想知道有没有办法静态访问这个提供程序,或者甚至将提供程序方法暴露为静态,以便我可以使用ABTask
中的它,如下所示:
public void run(){
StrategyProvider.get(args)
}
请不要建议更改MessageDispatcher类。欢迎其他想法。
答案 0 :(得分:0)
假设StrategyProvider
作为Spring托管bean,方法应该可以正常工作
@Component
public class StrategyFactory {
private static StrategyProvider strategyProvider;
@Autowired
private StrategyProvider provider;
@PostConstruct
public void init() {
StrategyFactory.strategyProvider = provider;
}
public static StrategyProvider getStrategyProvider() {
return strategyProvider;
}
}
在另一个bean中通过自动装配获取StrategyProvider
的实例并将其提供给某个静态方法。这种静态方法可以在ABTask
中使用,如下所示
public void run() {
StrategyFactory.getStrategyProvider().get(args)
}
但是请注意,如果在Spring完成应用程序上下文初始化之前调用静态方法StrategyFactory.getStrategyProvider()
,将会遇到令人讨厌的NullPointerException
。