java - 在没有注释或 xml 配置的情况下创建主要 bean

标签 java spring spring-boot spring-bean

我的项目依赖于另一个项目,并从中导入 Bean(使用 @ImportResource("foo.xml"))。

foo.xml 定义了两个数据源(datasource1datasource2),我想让 datasource1 成为主要数据源(这样 Spring Boot 的所有自动配置都可以工作)。

这可能吗?我发现有一个DefaultListableBeanFactorydeterminePrimaryCandidate方法。 所以我的想法是创建我自己的 ListableBeanFactory,它将扩展 DefaultListableBeanFactory,但是如何强制 Spring Boot 使用我的实现?

或者也许还有另一种更简单的方法将给定 bean 标记为primary(无需更改定义它的配置)。

最佳答案

您可以在项目中创建一个配置,该配置会构建一个注释为 @Primary bean 的新数据源。这个新数据源将是 datasource1,它将由 spring 注入(inject)到新数据源工厂方法中。这里有工作示例。

配置:

@SpringBootApplication
public class BeanSpringExampleApplication
{

    @Bean(name = "dataSource1")
    public FakeDataSource dataSource1()
    {
        return new FakeDataSource("dataSource1");
    }

    @Bean(name = "dataSource2")
    public FakeDataSource dataSource2()
    {
        return new FakeDataSource("dataSource2");
    }

    @Bean
    @Primary
    public FakeDataSource primaryDataSource(
        @Qualifier("dataSource1") FakeDataSource dataSource1)
    {
        return dataSource1;
    }
}

在这里您可以看到三个 bean(使用 FakeDataSource 类),它们模拟了您的情况。 primaryDataSource bean 工厂方法仅返回 dataSource1(它只是一个数据源选择器)。

FakeDataSource 只是一个占位符,以使示例可运行:

public class FakeDataSource
{
    private final String fakeProperty;

    public FakeDataSource(String id)
    {
        fakeProperty = id;
    }

    /**
     * @return the fakeProperty
     */
    public String getFakeProperty()
    {
        return fakeProperty;
    }
}

最后,测试证明一切正常:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BeanSpringExampleApplicationTests
{
    @Autowired
    private FakeDataSource fakeDataSource;

    @Test
    public void should_AutowirePrimaryDataSource() throws Exception
    {
        assertEquals("dataSource1", fakeDataSource.getFakeProperty());
    }

}

关于java - 在没有注释或 xml 配置的情况下创建主要 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43520993/

相关文章:

spring - 在 Spring 的 application.properties 中指定相对路径

java - Spring 启动: Property file with place holder

java - 查找单个正则表达式以获取两个特定单词之间的 3 个或更多字符的单词

java - debug.keystore 不存在

facebook - Spring Social facebook + Spring Security

java - 我可以在不使用 ehcache 的情况下使 spring 缓存过期吗

spring - 如何将 BufferingClientHttpResponseWrapper 与 HttpComponentsAsyncClientHttpRequestFactory 结合使用

mysql - java.sql.SQLException : Access denied for user 'root' @'localhost' (using password: YES) Spring boot 异常

java - 如何将 Web 服务响应写入 json 文件?

java - 如何避免回调中的内存泄漏?