Spring Boot 将实例注册为 bean

Posted

技术标签:

【中文标题】Spring Boot 将实例注册为 bean【英文标题】:Spring boot register an instance as a bean 【发布时间】:2017-06-27 10:05:14 【问题描述】:

我正在尝试将 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);
        );
    

是否有任何适当的方法可以向实例注册 bean? 我找不到任何好的样品。


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

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

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

【问题讨论】:

Spring boot 带有数据源的自动配置:docs.spring.io/spring-boot/docs/current/reference/html/… 您不必使用它,但无论如何它可以向您展示如何在独立(注册自己)或在自动配置 @pandaadb 感谢您的参考,很抱歉我没有明确表达我的观点。我想知道的不是如何使用嵌入式数据源 bean,而是如何将 java 实例注册为当前应用程序上下文的 bean。我还用帖子编辑内容。 【参考方案1】:

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

谢谢。

【讨论】:

以上是关于Spring Boot 将实例注册为 bean的主要内容,如果未能解决你的问题,请参考以下文章

如何在Spring Boot中运行时注册bean?

spring组件注册

测试单元 Spring boot:无法注册模拟 bean

String注解驱动开发如何按照条件向Spring容器中注册bean?这次我懂了!!

Spring Boot 企业级应用开发实战 刘伟东-2018年3月第一版

如何从 Spring Boot 应用程序中的所有子包中注册 bean?