【问题标题】:Can I change the implementation class injected by spring in runtime?可以在运行时更改spring注入的实现类吗?
【发布时间】:2013-08-20 23:36:00
【问题描述】:

我有一个由 spring 在 applicationContext.xml 上注入的类,我需要在不更改 applicationContext.xml 的情况下更改该实现。

我听说过 AOP “IntroductionInterceptor”,但没有找到很多有用的结果。

谁能帮帮我?

PS。对不起我的英语不好,希望给予理解。

【问题讨论】:

  • 更改该实现是什么意思?您必须提供更具体的示例。
  • 您可以随时或多次更改实现。
  • 当 Spring 实例化时,我需要拦截并尝试更改为接口的另一个实现。前任。 Impl1 和 Impl2 实现 IInterface。 xml 存档注入 Impl1 但我需要注入 Impl2 并且无法编辑 xml 存档。
  • 为什么不能编辑xml?
  • 因为我无法访问 Web 应用程序,只能访问我正在开发的 JAR 库。有权访问 Web 应用程序的人应该只更新 pom。

标签: java spring aop interceptor


【解决方案1】:

一种解决方法是应用service locator pattern。 不是直接注入 bean,而是注入一个可以返回不同实现的 ServiceLocator。

//ServiceLocator bean
public Class ServiceLocator {

    @Resource(name="service1")
    private Service service1;

    @Resource(name="service1")
    private Service Service2;

    public Service getService(String service) {
       return ... //service
    }
}

【讨论】:

  • 就像我对 fonZ 说的,我无法编辑 Web 应用程序,然后应用程序应该继续使用 Spring 注入。当 Spring 注入并更改它时,我需要拦截。像听众一样的东西。
【解决方案2】:

您可以通过多种方式做到这一点,这里有几种:

  1. 编写一个 xml 文件,通过添加相同的 bean id 和您要使用的实现类来覆盖配置,将这个新的 xml 导入到您现有的应用程序上下文中。

  2. 通过代码,你可以根据需要在调用代码之前设置一个新的实现。

可能还有更多,但大多数我们在项目数量中使用了“1”。

如果您有多个具有相同 id 的 bean,spring 将获取最新的一个,例如

<beans>
   <import resource="a.xml"/>
   <import resource="b.xml"/>
</beans>

现在如果a.xmlb.xml 都定义了具有相同Id 的bean,spring 将使用b.xml 中定义的bean。

干杯!!

【讨论】:

  • 如果我写了一个新的 xml 文件,我怎么能确定我的新 bean 会被实例化而不是旧 bean?我没有提到,但我无法访问 web 应用程序,只有一个 jar 库。我认为在我的情况下,这应该以编程方式完成,在 Sprring 实例化时进行拦截,就像监听器一样。谢谢!
  • @Andy - 如果您定义多个具有相同 id 的 bean,spring 将拾取最后一个,正如我提到的,当我们有一个通用框架和自定义项目构建在其之上时,我们已经多次使用这种方法它。但是,如果可以解决您的目的,您可以使用 AOP 并编写拦截器。
  • @Andy - 刚刚编辑了我的答案以解释具有相同 ID 的豆类的春季行为。
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多