在Spring

时间:2015-12-04 08:55:31

标签: java spring dependency-injection

我正在开发基于Spring的Web应用程序,并使用XML初始化bean。我试图动态更改bean的引用。 我有一个Facade类

 PortalFacade -> DataBaseService where it interact with DB.

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

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

 PortalFacade -> FileBaseService.

所以现在,任何进入我的门户网站的新请求都应由FileBaseService提供服务。

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

    SpringObjectFactory fact=BaseSpringObjectFactory.getInstance(); 

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

    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引用。 还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

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

@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