Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring中动态更改Bean引用_Java_Spring_Dependency Injection - Fatal编程技术网

Java 在Spring中动态更改Bean引用

Java 在Spring中动态更改Bean引用,java,spring,dependency-injection,Java,Spring,Dependency Injection,我正在开发基于Spring的web应用程序,并使用XML通过bean进行初始化。我正在尝试动态更改bean的引用。 我有一门门面课 PortalFacade -> DataBaseService where it interact with DB. 现在我遇到了一种情况,我想在不重新启动应用程序的情况下开始使用FileBaseService。我正在维护一个值为(DBSWITCH=ON/OFF)的属性,它是spring的一个可重新加载的ResourceBundleMessageSourc

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

 PortalFacade -> DataBaseService where it interact with DB.
现在我遇到了一种情况,我想在不重新启动应用程序的情况下开始使用FileBaseService。我正在维护一个值为(DBSWITCH=ON/OFF)的属性,它是spring的一个可重新加载的ResourceBundleMessageSource

所以现在,一旦它发现switch为OFF,我就必须将引用更改为

 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引用,但当我访问门户时,它不会通过新的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

上面的解决方案给人留下了深刻的印象,但不知道我们是否可以在春季实现一些功能。。可能会再次销毁并重新创建此豆子。。不知道怎么做。