gpt4 book ai didi

java - 在 Spring 中动态更改 Bean 引用

转载 作者:行者123 更新时间:2023-11-30 07:44:45 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com