Java 在Spring中动态更改Bean引用
我正在开发基于Spring的web应用程序,并使用XML通过bean进行初始化。我正在尝试动态更改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
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
。上面的解决方案给人留下了深刻的印象,但不知道我们是否可以在春季实现一些功能。。可能会再次销毁并重新创建此豆子。。不知道怎么做。