Spring中的静态注册表类

时间:2017-03-02 11:52:44

标签: java spring oop

正在播放的课程列表
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类。欢迎其他想法。

1 个答案:

答案 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