java - 在 Spring 中动态更改 Bean 引用

标签 java spring dependency-injection

我正在开发基于 Spring 的 Web 应用程序,并使用 XML 通过 bean 进行初始化。我正在尝试动态更改 bean 的引用。 我有一个门面类(class)

 PortalFacade -> DataBaseService where it interact with DB.

现在我有一种情况,我想在不重新启动应用程序的情况下开始使用 FileBaseService。我正在维护一个具有值(DBSWITCH=ON/OFF)的属性,它是 spring 的 ReloadableResourceBundleMessageSource。

所以现在一旦发现开关处于关闭状态,我就必须将引用更改为

 PortalFacade -> FileBaseService.

因此,从现在开始,任何到达我的门户的新请求都应该由 FileBaseService 提供服务。

我尝试的是跟随一个线程,它将执行此查找并为我分配新的 bean 引用,但未能实现

    SpringObjectFactory fact=BaseSpringObjectFactory.getInstance(); 

//我的客户应用程序中的类是否保存对应用程序上下文的引用。

    aisConfig.isAisEnabled()) // Identifies SWITCH ON & OFF

   while(true)
{
    System.out.println("Thread Running ...................");

    SpringObjectFactory fact=BaseSpringObjectFactory.getInstance();
    if(fact != null && fact.getApplicationContext()!=null)
    {
        AISConfigManager aisConfig = (AISConfigManager) fact.getBean("aisConfig");
        if(aisConfig !=null && aisConfig.isAisEnabled())
        {
            System.out.println("Changing Bean Reference ...............");
            PortalFacade portalFacade = (PortalFacade ) fact.getBean("portalFacade ");
            IBaseService filebaseService = new FileBaseService();

            portalFacade.setBaseService(filebaseService );


        }
        else
        {
            PortalFacade portalFacade = (PortalFacade ) fact.getBean("portalFacade ");
            IBaseService dbService= new DataBaseService();

            portalFacade.setBaseService(dbService);
        }
    }

    System.out.println("Going to sleep...................................");
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

//当我调试时,它会分配新的 bean 引用,但是当我访问 Portal 时,它不会选择新的 bean 引用,而是采用 xml 中指定的 bean 引用。 还有其他方法可以做到这一点吗?

最佳答案

一种解决方案是使用另一层抽象。创建一个

@Service
class DelegatingBaseService implements IBaseService {
    @Autowired
    private FileBaseService fileBaseService;
    @Autowired
    private DataBaseService dataBaseService;

    @Override
    public void baseServiceMethod1() {
        getDelegate().baseServiceMethod1();
    }

    @Override
    public Object baseServiceMethod2(Object input) {
        return getDelegate().baseServiceMethod2(input);
    }

    private IBaseService getDelegate() {
        if (aisConfig != null && aisConfig.isAisEnabled()) {
            return fileBasedService;
        } else {
            return dataBaseService;
        }
    }
}

然后在客户端中使用DelegatingBaseService

关于java - 在 Spring 中动态更改 Bean 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34084298/

相关文章:

javascript - 在 Spring Controller 中,我得到的日期早于我发送的实际日期

spring - 如何在spring boot embedded tomcat中获取当前客户端请求线程数?

java - 为什么来自 TestNG 交付的 Guice 不能识别 @javax.inject.Inject 而来自 com.google.inject 包的 Guice 可以?

java - 应该如何修改这个类才能遵循 DIP(依赖注入(inject)原则)?

c# - 在 Windsor CaSTLe 中向组件依赖项添加符号

java - java.util.Observable 是线程安全的吗?

java - Java是否将读取位置保存在InputStream中?

java - Spring Web Flow 构建器服务 : when does one need it?

java - JCombobox 改变另一个 JCombobox

java - 我需要如何配置 PersistenceJPAConfig?