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吗? 我找不到任何好的样本。


仅供参考,我在上面的代码中期望的是...

但是,它不起作用。所以我很好奇如何将 java 实例作为 bean 添加到当前 Spring 启动应用程序上下文。

实际上,如果我不使用 DataSource 这样做会更容易。

因为Spring-开机自动配置dataSource,我必须先禁用这个设置。

这是我为实现目标所做的工作

@ConfigurationClass...

@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 中,我可以使用 BeanDefinitionRegistryBeanDefinitionBuilder.

将 java 个实例添加到 spring bean

如果这只是一个bean,到这里就结束了,但是你要添加的是DataSource个bean,需要做一些额外的工作。

因为开机自动设置 DataSource,我们必须禁用该设置才能注册自定义数据源。

在你的 @SpringbootApplication class 中添加 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}).

现在,您可以通过 @Autowired@Qualifier 在其他 bean 中使用这些 bean。

谢谢。