Jun*_* Oh 0 applicationcontext spring-bean spring-boot
我正在尝试将 Datasource 实例注册为 java 代码中的 bean(spring-boot 项目)
这是我写的。(此代码不起作用。)
@Configuration
public class DatabaseConfig {
private Logger logger = Logger.getLogger(DatabaseConfig.class);
@Autowired
ApplicationContext context;
private Map<String, Map<String, String>> dsMap;
private Map<String, String> getTestDataSourceInfo () {
Map<String, String> ds = new HashMap<String, String> ();
ds.put("driverClassName", "com.mysql.jdbc.Driver");
ds.put("url", "jdbc:mysql://123.456.78.912:3306/test");
ds.put("username", "testuser");
ds.put("password", "testuser");
return ds;
}
public DatabaseConfig () {
this.dsMap = new HashMap<String, Map<String, String>>();
dsMap.put("sampleDs", getTestDataSourceInfo());
}
@PostConstruct
public void loadDataSource () {
logger.info("DS ================================ :: " + String.valueOf(this.dsMap));
this.dsMap.forEach((k,v) -> {
logger.info("value ========================== :: " + String.valueOf(v));
DataSource aSource = DataSourceBuilder.create()
.driverClassName(v.get("driverClassName"))
.url(v.get("url"))
.username(v.get("username"))
.password(v.get("password"))
.build();
// PROBLEM STARTS ..............
// Add datasource instance with name to context
context.getAutowireCapableBeanFactory().autowireBean(aSource);
});
}
}
Run Code Online (Sandbox Code Playgroud)
有没有正确的方法向实例注册bean?我找不到任何好的样本。
仅供参考,我在上面的代码中所期望的是......
ConfigureloadDatasource方法中的应用程序上下文中但是,它不起作用。所以我很好奇如何将 java 实例作为 bean 添加到当前的 Spring boot 应用程序上下文中。
实际上,如果我不使用 来执行此操作,可能会更容易DataSource。
由于 Spring-boot 自动执行配置dataSource,我必须首先禁用此设置。
这是我为实现目标所做的事情
在@Configuration班上...
@Configuration
public class DatabaseConfig {
private Logger logger = Logger.getLogger(DatabaseConfig.class);
@Autowired
ApplicationContext context;
private Map<String, Map<String, String>> dsMap;
private Map<String, String> getTestDataSourceInfo () {
Map<String, String> ds = new HashMap<String, String> ();
ds.put("driverClassName", "${ your driverClassName }");
ds.put("url", "${ your url }");
ds.put("username", "${ your user }");
ds.put("password", "${ your password }");
return ds;
}
public DatabaseConfig () {
this.dsMap = new HashMap<String, Map<String, String>>();
dsMap.put("sampleDs1", getTestDataSourceInfo());
dsMap.put("sampleDs2", getTestDataSourceInfo());
}
@PostConstruct
public void loadDataSource () {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) context.getAutowireCapableBeanFactory();
this.dsMap.forEach((k,v) -> {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(BasicDataSource.class);
v.forEach((ds_key, ds_val) -> {
builder.addPropertyValue(ds_key, ds_val);
});
BeanDefinition def = builder.getBeanDefinition();
if(!registry.containsBeanDefinition(k)) registry.registerBeanDefinition(k, def);
});
}
}
Run Code Online (Sandbox Code Playgroud)
BeanDefinitionRegistry在上面的类中,我可以使用和向 spring bean 添加 java 实例BeanDefinitionBuilder。
如果这只是一个bean,那么到这里就结束了,但是你要添加的是DataSourcebean,必须做一些额外的工作。
由于自动启动设置DataSource,我们必须禁用该设置才能注册自定义数据源。
在您的@SpringbootApplication班级中,添加@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}).
现在,您可以通过@Autowired和在其他 bean 中使用这些 bean @Qualifier。
谢谢。
| 归档时间: |
|
| 查看次数: |
7927 次 |
| 最近记录: |