Таким образом, мы, по сути, хотим иметь общее репозиторий JDBC, который может быть создан с различными деталями базы данных во время выполнения. В настоящее время настройка по сути состоит в том, чтобы «получить бин GenericRepo с деталями x, y, z. Если бин существует с этими деталями, используйте этот боб вместо этого и используйте уже существующий. Если он не существует, создайте его».
Это похоже на то, для чего можно использовать пользовательские области, но есть ли что-то изначально "неправильное" в нашем решении, которое может вызвать проблемы?
Это веб-приложение, в котором может быть несколько человек, использующих GenericRepo одновременно.
Репо
@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");
}