Java Spring引导自动配置命令

Java Spring引导自动配置命令,java,spring,spring-boot,Java,Spring,Spring Boot,我想创建一个springboot自动配置类,它(有条件地)创建一个beana。然而,挑战在于,在Spring Boot的默认自动配置类中创建另一个beanB之前,必须先创建这个bean。beanB不依赖于A 我的第一次尝试是使用@AutoConfigureBefore。这不符合我的预期,从戴夫·赛尔的判断,这不应该 一些背景:前面提到的beanA改变了Mongo数据库,这必须在创建MongoTemplate之前发生。在Boot 1.3.0中有一个新的注释@AutoConfigureOrder。虽

我想创建一个springboot自动配置类,它(有条件地)创建一个bean
a
。然而,挑战在于,在Spring Boot的默认自动配置类中创建另一个bean
B
之前,必须先创建这个bean。bean
B
不依赖于
A

我的第一次尝试是使用
@AutoConfigureBefore
。这不符合我的预期,从戴夫·赛尔的判断,这不应该


一些背景:前面提到的bean
A
改变了Mongo数据库,这必须在创建
MongoTemplate
之前发生。

在Boot 1.3.0中有一个新的注释@AutoConfigureOrder。虽然我至少不清楚这是否仍然与@autoconfigurebefore的行为相同。

事实证明,我想要的是动态地使
B
的实例依赖于
A
。这可以通过使用
BeanFactoryPostProcessor
to的
B
bean来实现

public class DependsOnPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        String[] beanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
                beanFactory, B.class, true, false);
        for (String beanName : beanNames) {
            BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
            definition.setDependsOn(StringUtils.addStringToArray(
                    definition.getDependsOn(), "beanNameOfB");
        }
    }

}

这适用于普通弹簧,无需弹簧靴。为了完成自动配置,我需要将
DependsOnPostProcessor
的bean定义添加到实例化bean
A

的配置类中。请参阅@hzpz的答案,下面是一个在自动配置Hikari数据源之前创建数据库的示例

import com.zaxxer.hikari.HikariDataSource;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.SQLException;
导入java.sql.Statement;
导入javax.annotation.PostConstruct;
导入org.springframework.beans.factory.BeanFactoryUtils;
导入org.springframework.beans.factory.annotation.Value;
导入org.springframework.beans.factory.config.BeanDefinition;
导入org.springframework.beans.factory.config.BeanFactoryPostProcessor;
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.util.StringUtils;
@配置
公共类CreateDatabaseConfig{
@值(${spring.datasource.url}”)
私有字符串url;
@值(${spring.datasource.hikari.username}”)
私有字符串用户名;
@值(${spring.datasource.hikari.password}”)
私有字符串密码;
@值(${spring.datasource.hikari.catalog}”)
私有字符串目录;
@豆子
公共静态BeanFactory后处理器依赖于后处理器(){
返回beanFactory->{
字符串[]beanNames=BeanFactoryUtils.BeanNamesForTypeIncluding祖先(
beanFactory,HikariDataSource.class,true,false);
for(字符串beanName:beanName){
BeanDefinition定义=beanFactory.getBeanDefinition(beanName);
definition.setDependsOn(StringUtils.addStringToArray(
getDependsOn(),“createDatabaseConfig”);
}
};
}
@施工后
公共void init(){
试一试(
Connection Connection=DriverManager.getConnection(url、用户名、密码);
语句Statement=connection.createStatement()
) {
statement.executeUpdate(
“如果不存在创建数据库”`+目录
+“`默认字符集=utf8mb4 COLLATE utf8mb4\u unicode\u ci;”
);
}捕获(SQLE异常){
抛出新的RuntimeException(“创建数据库失败”,e);
}
}
}
可以使用
data.sql
schema.sql
对架构和数据进行更多初始化,请参见

另外,我试图在
schema.sql
创建数据库,但失败了,上面的例子有效:)

谢谢你提供的信息。但据我所知,
@AutoConfigureOrder
只是订购自动配置的另一种方式,而不是它们创建的bean的实例化。你太棒了!有一个
AbstractDependsOnBeanFactoryPostProcessor
,应该使用它来不重新定义相同的代码。