2013-08-19 31 views
1

我有一个类在applicationContext.xml中注入了spring,我需要在不更改applicationContext.xml的情况下更改该实现。我可以在运行时更改Spring注入的实现类吗?

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

任何人都可以帮到我吗?

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

+0

你是什么意思改变实现?你将不得不提供一个更具体的例子。 –

+0

您可以随时或多次更改实施。 –

+0

当Spring将实例化时,我需要拦截并尝试更改为另一个接口实现。例如, Impl1和Impl2实现IInterface。 xml压缩文件注入Impl1,但我需要注入Impl2,我无法编辑xml压缩文件。 – andersonbalves

回答

0

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

  1. 编写XML文件,越权配置加入同一个bean ID和你要使用的实现类,导入此新的xml到你现有的应用程序上下文中。

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

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

如果你有多个相同ID的bean,spring将会获取最新的一个,例如,现在,如果这两个a.xmlb.xml具有相同的ID来定义一个bean

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

,春天将使用b.xml定义的豆。

干杯!

+0

如果我编写一个新的xml文件,我怎么能确定我的新bean将被实例化,而不是旧的bean?我没有提到,但我没有访问Web应用程序,只有一个jar库。我认为在我的情况下,这应该以编程方式完成,当Sprring实例化时,像侦听器一样拦截。谢谢! – andersonbalves

+0

@Andy - 如果你定义了多个具有相同ID的bean,Spring会提取最后一个bean,就像我之前提到的那样,当我们有一个通用框架和自定义项目构建它时,我们已经多次使用这种方法。但是,如果解决了你的目的,你可以使用AOP并编写拦截器。 –

+0

@Andy - 刚刚编辑我的答案,解释春季豆相同的IAS的行为。 –

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 
    } 
} 
+0

就像我对fonZ说的那样,我无法编辑web应用程序,然后应用程序应该继续使用Spring注入。 Spring需要插入并修改它时,我需要拦截。像听众一样。 – andersonbalves

相关问题