Spring 引导将实例注册为 bean
Spring boot register an instance as a bean
我正在尝试在 java 代码(spring-引导项目)
中将 Datasource 实例注册为 bean
这是我写的。 (此代码无效。)
@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);
});
}
}
有什么正确的方法可以用实例注册bean吗?
我找不到任何好的样本。
仅供参考,我在上面的代码中期望的是...
- Spring 引导应用程序将上面的 class 读取为
Configure
- 它将在其构造函数中创建一个 Java 实例
- 并且它会在
loadDatasource
方法 中将实例作为 bean 添加到应用程序上下文中
但是,它不起作用。所以我很好奇如何将 java 实例作为 bean 添加到当前 Spring 启动应用程序上下文。
实际上,如果我不使用 DataSource
这样做会更容易。
因为Spring-开机自动配置dataSource
,我必须先禁用这个设置。
这是我为实现目标所做的工作
在@Configuration
Class...
@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);
});
}
}
在上面 class 中,我可以使用 BeanDefinitionRegistry
和 BeanDefinitionBuilder
.
将 java 个实例添加到 spring bean
如果这只是一个bean,到这里就结束了,但是你要添加的是DataSource
个bean,需要做一些额外的工作。
因为开机自动设置 DataSource
,我们必须禁用该设置才能注册自定义数据源。
在你的 @SpringbootApplication
class 中添加 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
.
现在,您可以通过 @Autowired
和 @Qualifier
在其他 bean 中使用这些 bean。
谢谢。
我正在尝试在 java 代码(spring-引导项目)
中将 Datasource 实例注册为 bean这是我写的。 (此代码无效。)
@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);
});
}
}
有什么正确的方法可以用实例注册bean吗? 我找不到任何好的样本。
仅供参考,我在上面的代码中期望的是...
- Spring 引导应用程序将上面的 class 读取为
Configure
- 它将在其构造函数中创建一个 Java 实例
- 并且它会在
loadDatasource
方法 中将实例作为 bean 添加到应用程序上下文中
但是,它不起作用。所以我很好奇如何将 java 实例作为 bean 添加到当前 Spring 启动应用程序上下文。
实际上,如果我不使用 DataSource
这样做会更容易。
因为Spring-开机自动配置dataSource
,我必须先禁用这个设置。
这是我为实现目标所做的工作
在@Configuration
Class...
@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);
});
}
}
在上面 class 中,我可以使用 BeanDefinitionRegistry
和 BeanDefinitionBuilder
.
如果这只是一个bean,到这里就结束了,但是你要添加的是DataSource
个bean,需要做一些额外的工作。
因为开机自动设置 DataSource
,我们必须禁用该设置才能注册自定义数据源。
在你的 @SpringbootApplication
class 中添加 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
.
现在,您可以通过 @Autowired
和 @Qualifier
在其他 bean 中使用这些 bean。
谢谢。