Spring引导将一个实例注册为bean

时间:2017-06-27 10:05:15

标签: spring-boot applicationcontext spring-bean

我试图在java代码(spring-boot project)中将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启动应用程序将上面的类作为Configure
  • 读取
  • 它将在其构造函数
  • 中创建一个Java实例
  • 它会将实例作为bean添加到loadDatasource方法
  • 中的应用程序上下文中

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

1 个答案:

答案 0 :(得分:3)

实际上,如果我不使用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);
        });
    }
}

在上面的课程中,我可以使用BeanDefinitionRegistryBeanDefinitionBuilder将java实例添加到spring bean。

如果这只是一个bean,它会在这里结束,但你想要添加的是DataSource bean,还需要做一些额外的工作。

因为,引导自动设置DataSource,我们必须禁用该设置来注册自定义数据源。

@SpringbootApplication课程中,添加@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

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

感谢。