我正在开发基于 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/