Spring Boot将实例注册为bean

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


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

  • Spring Boot 应用程序会将上面的类读取为Configure
  • 它将在其构造函数中创建一个 Java 实例
  • 它将实例作为 bean 添加到loadDatasource方法中的应用程序上下文中

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

Jun*_* Oh 5

实际上,如果我不使用 来执行此操作,可能会更容易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

谢谢。