我正在开发基于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引用。 还有其他办法吗?
答案 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
。