gpt4 book ai didi

java - Spring boot : Managing bean scope "manually" for dynamically creating beans at runtime with differing states. 我们的解决方案有问题吗?

转载 作者:行者123 更新时间:2023-12-02 09:43:34 26 4
gpt4 key购买 nike

因此,我们本质上希望拥有一个通用的 JDBC 存储库,它可以在运行时使用不同的数据库详细信息进行实例化。目前的设置本质上是“获取具有详细信息 x、y、z 的 GenericRepo bean。如果存在具有这些详细信息的 bean,则使用该 bean 并使用已存在的 bean。如果不存在,则创建它。”

这似乎是自定义作用域可以用来做的事情,但是我们的解决方案是否存在本质上“错误”的地方,可能会导致问题?

这是一个网络应用程序,可能有多个人同时使用 GenericRepo。

repo 协议(protocol)

@Component
public class GenericDatabaseDAO {

JdbcTemplate data;

public GenericDatabaseDAO() {}

public GenericDatabaseDAO(String username, String password, String url, String driver) {
this.data = new JdbcTemplate(
DataSourceBuilder.create()
.username(username)
.password(password)
.url(url)
.driverClassName(driver)
.build()
);
}

public GenericDatabaseTableModel runQuery(String query) {

return new GenericDatabaseTableModel(data.queryForList(query));
}



@Service
public static class DAOService implements ApplicationContextAware {

ApplicationContext context;
AutowireCapableBeanFactory factory;

HashMap<String,GenericDatabaseDAO> beans = new HashMap<String,GenericDatabaseDAO>();

public GenericDatabaseDAO getDAO(String username, String password, String url, String driver) {

GenericDatabaseDAO dao = beans.get(username+'@'+url);

if(dao == null) {

dao = new GenericDatabaseDAO(username, password, url, driver);
factory.autowireBean(dao);
factory.initializeBean(dao, username+'@'+url);

beans.put(username+'@'+url, dao);
}

return dao;
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
this.factory = context.getAutowireCapableBeanFactory();
}

}
}

我们如何使用存储库

//service class for running sql statements
@Autowired
GenericDatabaseDAO.DAOService factory;


public void runSqlOnDB(String username, String password, String url, String driver){
GenericDatabaseDAO gdbdao = factory.getDAO(username,password,url,driver);
gbdao.runQuery("sql here");

}

最佳答案

您可能需要做的是查看@Configuration注释,以便您可以创建新的bean。

@Bean 注解确保返回的是 Spring bean。最后,@Scope 注解告诉 Spring 每次创建一个新实例。

我没有添加,但您可以轻松研究的是 @Cacheable 注释,以避免某个 bean 的多个实例。注意:为了进行缓存,您的 Maven 或 Gradle 中需要一些额外的 Spring jar。您还需要@EnableCaching

@Configuration
public DaoFactory {

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
// @Cacheable here !
public getDao(String name, String password, String url, String driver) {
return new GenericDatabaseDAO(name, password, url, driver);
}

}

如果你想使用它,请执行类似的操作

@Autowired DaoFactory daoFactory;
...

GenericDatabaseDAO dao = daoFactory.getDao("user", "pwd", "url", "driver");

抱歉,我使用了@Autowired,因为它使示例更简单:)

最后一点:您不需要在 GenericDatabaseDAO 类上添加 @Component 注释。

关于java - Spring boot : Managing bean scope "manually" for dynamically creating beans at runtime with differing states. 我们的解决方案有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56849967/

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