spring 如果一个bean已经用@ConfigurationProperties注解了,那么@EnableConfigurationProperties会有什么不同?

iqjalb3h  于 2023-01-29  发布在  Spring
关注(0)|答案(4)|浏览(123)

Sping Boot 文档指出,要使用@ConfigurationProperties注解
您还需要列出要在@EnableConfigurationProperties注解中注册的属性类,如下例所示:
并给出以下代码:

@Configuration
@EnableConfigurationProperties(AcmeProperties.class)
public class MyConfiguration {
}

但在下一段中写道:
即使前面的配置为AcmeProperties创建了一个常规bean,我们也建议@ConfigurationProperties只处理环境,特别是不要从上下文注入其他bean。尽管如此,@EnableConfigurationProperties注解也会自动应用于您的项目,以便从Environment配置任何用@ConfigurationProperties注解的 existing bean。
建议不必在@EnableConfigurationProperties注解下列出@ConfigurationProperties bean。
那么到底是哪一个呢?通过实验,我发现如果我用@ConfigurationProperties注解一个bean,它会像预期的那样获得注入到它的属性,而不需要在@EnableConfigurationProperties中列出它,但是如果是这样的话,为什么要在@EnableConfigurationProperties下列出任何有@ConfigurationProperties注解的东西呢,就像文档中所示的那样?这有什么区别吗?

zujrkrfu

zujrkrfu1#

正如M. Deinum所提到的@EnableConfigurationProperties是为了支持@ConfigurationProperties。如果你看一下Java文档的注解,你会看到:
启用对ConfigurationProperties注解bean的支持。ConfigurationProperties bean可以用标准方式注册(例如使用Bean@Bean方法),或者,为了方便起见,可以直接在此注解上指定。
例如,假设你有一个类,负责从application.yml/application.properties中读取和存储信息,这些信息是连接到不同数据库所必需的,你可以用@ConfigurationProperties来注解它。
然后,通常有一个@Configuration注解类,它为应用程序提供DataSource@Bean,可以使用@EnableConfigurationProperties将其链接到@ConfigurationProperties类,并相应地初始化数据源。
下面是一个小例子:

    • 应用程序. yml**
data-sources:
  db1:
    url: "jdbc:postgresql://localhost:5432}/db1"
    username: test
    password: test
  db2:
    url: "jdbc:postgresql://localhost:5432}/db2"
    username: test
    password: test
    • 数据源配置**
@ConfigurationProperties
public class DataSourcesConfiguration {

    private Map<String, BasicDataSource> dataSources;

    public void setDataSources(Map<String, BasicDataSource> dataSources) {
        this.dataSources = dataSources;
    }

    Map<String, BasicDataSource > getDataSources() {
        return dataSources;
    }
}
    • 数据源连接配置**
@Configuration
@EnableConfigurationProperties(DataSourcesConfiguration.class)
public class DatabaseConnectionConfiguration implements Provider<Connection> {

    private DataSourcesConfiguration dataSourcesConfiguration;

    public DatabaseConnectionConfiguration(DataSourcesConfiguration dataSourcesConfiguration) {
        this.dataSourcesConfiguration = dataSourcesConfiguration;
    }

    @Bean
    public DataSource dataSource() {
        // Use dataSourcesConfiguration to create application data source. E.g., a AbstractRoutingDataSource..
    }

}
uurity8g

uurity8g2#

我花了一段时间才到达这个职位,但我想在这里补充,使其他人可能会受益。
@ConfigurationProperties-用于绑定一个类和一个外化的属性文件。非常强大,必须用于分离bean类和配置实体类。
@Configuration-创建一个配置原型的Spring bean。
@EnableConfigurationProperties-在配置实体类和Spring配置原型之间创建绑定,以便在注入服务属性后可以轻松地检索。

6ojccjat

6ojccjat3#

如果我们看看下面的代码:
@Configuration @EnableConfigurationProperties @ConfigurationProperties(prefix="ar1") public class ar1Settings { }

*@Configuration告诉Spring将其视为配置类并将其注册为Bean
*@EnableConfigurationProperties告诉Spring将该类视为application.yml/properties值的使用者
*@ConfigurationProperties告诉Spring这个类代表哪个部分。

我的理解是,如果您不需要指定属性文件的节,则可以省略@ConfigurationProperties。

lo8azlld

lo8azlld4#

@EnableConfigurationProperties导入EnableConfigurationPropertiesRegistrar,从而支持@ConfigurationProperties注解bean。
@ConfigurationProperties是外部化配置的注解,它将应用于使用@Bean注解的bean配置类或方法,例如

@ConfigurationProperties(prefix = "some-prefix")
   public SomePrefix prefixBean() { 
      return new SomePrefix(); 
}

加载属性并将其绑定到方法或类中与前缀. ps匹配的属性:some-prefix绑定到SomePrefix,因为Spring支持松弛绑定。
在springboot 2.2之前,您可以执行以下操作之一:

@Configuration
@ConfigurationProperties(prefix = "some-prefix")
public class ConfigProperties {
//...some code
}

@Configuration
@EnableConfigurationProperties(SomeClassToBeBounded.class)
public class ConfigProperties {

沿着

@ConfigurationProperties(prefix = "some-prefix")
public class SomeClassToBeBounded{
//...some code
}

来自Spring Boot2.2
你可以用一种简单得多的方法来做:

@ConfigurationProperties(prefix = "some-prefix") 
@ConfigurationPropertiesScan 
public class ConfigProperties { 

//...some code
}

这样,由@SpringBootApplication启用的类路径扫描器就会找到ConfigProperties类,即使我们没有用@Component注解这个类。

相关问题