当前位置: 首页 > 面试题库 >

如果已经使用@ConfigurationProperties注释了bean,那么@EnableConfigurationproperties有什么区别?

富锦
2023-03-14
问题内容

Spring Boot文档说要使用@ConfigurationProperties注释

您还需要列出要在@EnableConfigurationProperties注释中注册的属性类 ,如以下示例所示:

并给出以下代码:

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

但是在下一段中说:

即使前面的配置为AcmeProperty创建了常规bean,我们也建议@ConfigurationProperties仅处理环境,尤其不要从上下文中注入其他bean。话虽如此,@EnableConfigurationProperties
注释也会自动应用到您的项目中,以便从环境配置任何使用@ConfigurationProperties注释的现有bean。

建议不必@ConfigurationProperties@EnableConfigurationProperties注释下列出bean 。

那是什么呢?从实验上看,我已经看到,如果用@ConfigurationProperties它注释一个Bean时,可以按预期注入属性,而无需在中列出它@EnableConfigurationProperties,但是如果是这种情况,那么为什么要列出任何带有@ConfigurationProperties注释的东西@EnableConfigurationProperties,如文档所示?有什么区别吗?


问题答案:

正如M.
Deinum所说的@EnableConfigurationProperties是为了支持@ConfigurationProperties。如果查看批注Java
Doc,您将看到:

启用对带有ConfigurationProperty注释的Bean的支持。可以以标准方式(例如,使用Bean
@Bean方法)注册ConfigurationProperties Bean,或者为了方便起见,可以在此批注上直接指定。[…]

例如,假设您有一个类,该类的职责是从application.yml/
application.properties中读取和存储与不同数据库建立连接所需的信息。您用添加注释@ConfigurationProperties

然后,通常会有一个带@Configuration注释的类DataSource
@Bean为您的应用程序提供一个。您可以使用将@EnableConfigurationProperties其链接到@ConfigurationProperties该类并相应地初始化您的数据源。

这是一个小例子:

application.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;
    }
}

DataSourceConnectionConfiguration

@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..
    }

}


 类似资料:
  • 问题内容: 已经了解Python是一种解释性语言…但是,当我查看Python源代码时,我看到的是Windows标识为“编译的Python文件”的文件。这些从哪里来? 问题答案: 它们包含字节码,这是Python解释器将源代码编译到的字节码。然后,此代码由Python的虚拟机执行。 Python的文档解释了这样的定义: Python是一种解释型语言,与编译型语言相反,尽管由于字节码编译器的存在,两者

  • 问题内容: 有人可以给MWE 直接在方法上使用注释的方法吗? 我已经看到了无数的关于在类定义中使用它的示例-但还没有方法的示例。 引用文档: 这种添加到一个类定义或 一个方法 @Target(value = {TYPE, METHOD }) 因此,我认为还有一种可能性和预期的用途-但不幸的是,我无法弄清楚。 问题答案: 这里的DataSource类具有属性url,用户名,密码,driverClas

  • 问题内容: 我大致了解这种构造的作用:它创建了SomeType EJB,并将对象注入到另一个EJB中。 现在,我有一个以这样的方式开始的类:(尽管我认为只有的相关,我会给出所有类级别的注释) 什么的就做吗?他们可能会从JNDI获取或创建“ name1” …对象,但是将结果放在哪里?我看不到附近有任何电话,但是代码库很大,所以我对此不太确定。 额外的问题:我想这两个注释只是重复默认值? 更新:目前有

  • 我正在尝试Akka Stream API,我不知道为什么这会抛出java.lang.IllegalArgumentException:[Partition.in]已经在第5行连接 但如果我将validationPartitioner改为用builder包装。添加(…)然后移除。从 一切正常。如果我只是删除. in代码不编译。为什么强制使用构建器,我是否遗漏了什么或者是错误?

  • 问题内容: 我遇到了xdoclet项目,发现它很受欢迎。所以问题来了,既然我们在Java中有注释:xdoclet是旧式的吗? 还是xdoclet有我看不见/了解的东西。 问题答案: 是通过的注释实现。注释可以完成所有(以及更多)可以完成的工作。 然而,一个明显的区别是,是 无创 。也就是说,它不需要您将类导入到自己的代码中。如果您在自己的代码中使用第3方Java注释,那么在没有第3方jar的情况下