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

时间:2017-04-20 13:29:56

标签: java spring spring-boot spring-bean

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

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

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

或许还有另一种更简单的方法可以将给定的bean标记为primary(不改变定义它的配置)。

1 个答案:

答案 0 :(得分:0)

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

配置:

@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());
    }

}