【发布时间】:2018-10-11 15:29:09
【问题描述】:
我需要一些有关 Spring 的帮助(SpringBoot 1.3.2.RELEASE,Spring 4.3.11.RELEASE)。 用例比较特殊,需要说明。
我有一个 Spring 应用程序管理客户发送的请求。为了处理这些请求,我们需要使用带有@Autowired 注解声明的服务。非常经典。
最近,我们决定处理来自其他国家/地区的新型请求。 关键是面对不同的情况和类型的请求,我们决定实现一个策略模式。 -> 根据请求的类型,我们执行在运行时选择的策略。每个策略都包含在一个具体的类中,所有策略共享同一个接口。
所以,我有:
- 一个主类,其中请求处理已完全完成。为了完成它的工作,这个类过去常常调用一些使用@Autowired 注解声明的服务。
现在我有:
- 仅初始化请求处理的主类。去做 它的作用是,此类将在运行时根据某些标准实例化一个策略。
- 一个 IStrategy(接口)有 2 个方法将被实现 通过我的 2 个具体课程
- 2 个具体的类(以及更多的类)可以完成这项工作。 非常重要的一点是,这些具体的类将在运行时实例化,在 Spring 上下文加载之后。
问题是Spring上下文加载后,就不能再使用@Autowired注解了。 我想在我的具体策略类中使用的所有服务都不能再被@Autowired 调用并保持为空。
我通过将我需要的服务作为参数传递给我的具体策略类找到了一种解决方法,但是我必须作为参数传递的服务数量因一种策略而异。
我认为我应该传递整个 Spring 上下文,但我不知道该怎么做。而且我也不知道如何从上下文中访问所有带注释的服务。
PS:我没有显示代码行,因为我认为实际上没有必要。如果您认为使用代码会更明确,我会发送一些。
提前致谢。
【问题讨论】:
-
您可能想要定义一个自己的注册服务,在该服务中注册新的实现并且可以在运行时查找。您无需直接注入策略,而是注入可用于检索实际策略的注册表服务。注册服务如何维护策略取决于您和实施细节。
-
创建类似
ServiceProvider的东西,其中包含所有可能的服务(地图、列表等)。然后将provider注入到控制器中,调用得到相关服务使用:serviceProvider.getService(requestContext).execute(...); -
也许这个答案对你有帮助stackoverflow.com/a/6596801/7634201
标签: java spring spring-boot