Java 如何在运行时更改@autowiredbean实现?

Java 如何在运行时更改@autowiredbean实现?,java,spring,spring-mvc,applicationcontext,Java,Spring,Spring Mvc,Applicationcontext,我正在开发一个springmvc3.2应用程序,它作为EAR部署在多个web应用程序(war)中,这些应用程序重用许多公共数据访问和服务bean,但最终可以为一个或多个服务提供自定义实现 基本上,每个web应用程序都是通用解决方案的变体,在某些服务中具有不同的UI体验和不同的业务规则。这些服务被实现为不同的无状态和有状态bean,它们之间有依赖关系 应用程序具有应用程序上下文的父子结构,因此每个web应用程序都有自己的上下文。大致设想如下: -dao |-services |

我正在开发一个springmvc3.2应用程序,它作为EAR部署在多个web应用程序(war)中,这些应用程序重用许多公共数据访问和服务bean,但最终可以为一个或多个服务提供自定义实现

基本上,每个web应用程序都是通用解决方案的变体,在某些服务中具有不同的UI体验和不同的业务规则。这些服务被实现为不同的无状态和有状态bean,它们之间有依赖关系

应用程序具有应用程序上下文的父子结构,因此每个web应用程序都有自己的上下文。大致设想如下:

-dao
  |-services
        |-one-app-context
               |-one-servlet-context
        |  
        |-two-app-context
               |-two-servlet-context
为了构建此功能,我遵循了中给出的说明:

我正在使用基于XML配置+注释的bean扫描,以及默认的共享单例bean范围实例化。有一个全局属性文件,每个web应用程序都有自己的属性文件,其中包含全局属性的新属性或变体,例如不同的值或字符串。此外,对服务的所有依赖关系都是通过接口实现的

我的问题是,我不得不为每个服务初始化一个具体的实现,以满足启动共享上下文时的自动连接要求——但对于给定的web应用程序,我希望使用不同的实现或具有不同设置的新实例

编辑

@Prasad给了我一个很好的实际回答-但是我应该添加这样一种情况,即两个控制器使用相同的有状态服务实现,但它们使用不同的设置/值进行初始化-只有每个web层包知道。 我希望看到一个解决方案(如果可能的话),我使用注释/扫描,而不需要进行实例化杂技来获得正确的布线配置文件

最终,依赖关系看起来会像这样:

one-web-controller -> serviceA-impl-1
                   -> serviceB-impl -> serviceD-impl (with one.properties)
                   -> serviceC-impl
                   -> serviceE-impl (with one.properties)

two-web-controller -> serviceA-impl-2
                   -> serviceB-impl -> serviceD-impl (with two.properties)
                   -> serviceE-impl (with two.properties)
记住KISS,我如何才能有效地设置SpringMVC,使每个web应用程序都可以选择自定义服务实例或实现(或插件,无论您喜欢什么),同时最大限度地提高重用性


感谢您的帮助。

假设您是以父上下文层次结构形式实现服务层(检查我给出的实现父上下文、根上下文和子上下文),可以使用限定符注入服务实现

例如,您有一个接口:

    public interface ServiceA {
        public void yourMethod();
    }
及其实现类为:

    @Component(value="serviceAImpl1")
    public class ServiceAImpl1 implements ServiceA {

    }

    @Component(value="serviceAImpl2")
    public class ServiceAImpl2 implements ServiceA{

    }
在web app 1中,如果您想访问ServiceAImpl1,可以通过以下方式获取:

    @Component
    public class WebApp1Class {
      @Autowire
      @Qualifier("serviceAImpl1")
      ServiceA serviceA;
      ...
    }
    @Component
    public class WebApp2Class {
      @Autowire
      @Qualifier("serviceAImpl2")
      ServiceA serviceA;
      ...
    }
在web app 2中,如果您想访问ServiceAImpl2,可以通过以下方式获取:

    @Component
    public class WebApp1Class {
      @Autowire
      @Qualifier("serviceAImpl1")
      ServiceA serviceA;
      ...
    }
    @Component
    public class WebApp2Class {
      @Autowire
      @Qualifier("serviceAImpl2")
      ServiceA serviceA;
      ...
    }

这解决了自定义实现的问题-但我编辑了我的问题,以显示一种情况,例如ServiceAImpl1依赖于具有某些设置的有状态ServiceBImpl1,serviceAImpl2也依赖于相同的ServiceBImpl1,但设置不同。