【问题标题】:Sping-boot configuration-properties and service layer injectionspring-boot 配置-属性和服务层注入
【发布时间】:2021-12-28 01:27:39
【问题描述】:

我是 Spring 依赖注入的新手,我想了解最佳实践。我想知道将用@ConfigurationProperties 注释的类注入服务层类(用@Service 注释)是否是一种好的设计理念。我试图将我的application.yml 中的属性映射到一个配置类,如下所示-

@ConstructorBinding
@ConfigurationProperties(prefix = "application")
class ApplicationConfig(
  val kafka: someDeeplyNestedType = SomeDeeplyNestedObj()
 ) {
       // helper functions
   }

然后我在服务层中注入上面的配置类,如下所示 -

@Service
@EnableConfigurationProperties(ApplicationConfig::class)
class RestService(val config: ApplicationConfig) {
   init {
      // Reference config object
     // Reference application.yml properties via config object.
   }
}

我很想知道我是否可以改进我当前的实现 - 不确定是否可以将 configuration 类传递给 service-layer 类。我也很想知道是否有更好的方法来连接ApplicationConfig 而无需使用EnableConfigurationProperties 注释。

【问题讨论】:

    标签: spring-boot dependency-injection configurationproperties


    【解决方案1】:

    这是可以接受的,documented,并且可能“无与伦比”(仅限于:"limitations"(没有 SpEL -> 辅助函数!?;))。

    要使用 @ConfigurationProperties bean,您可以像注入任何其他 bean 一样注入它们,如下例所示:

    @Service
    public class MyService {
    
       private final SomeProperties properties;
       ...
    

    唯一的问题可能来自“深度”,而不是“拥有”(配置)结构......并且可能来自“辅助功能”。

    但是

    prefix = "application"“听起来”很可疑!

    注意:

    [大多数 - 几乎所有](官方)spring* 引导属性,已经是“类型安全”的,并且在spring-boot-autoconfigure packages 中有它们的对象/类表示。

    请研究"typesafe chapter",但也要注视PropertySource Abstraction

    【讨论】:

    • 感谢您的回复。如果可能的话,你能用一个例子来解释你的评论吗?我有点面临你提到的同样的问题——结构化的configProperties 包装app.yml 的类和一个还提供一些帮助函数的类。我担心这会导致紧密耦合。
    • 感谢您的澄清。我只是试图通过指定 application 前缀来解析和绑定应用程序特定属性(属于 app.yml 的一部分)。
    【解决方案2】:

    这没有硬性规定,因为在 Spring Boot 中,我们可以在类级别添加 @EnableConfigurationProperties 并使用原型注解。

    作为良好实践的一部分,EnableConfigurationProperties 或任何配置都应该是配置类或主要 Spring Boot 类的一部分,因此任何开发人员都可以轻松找出这些配置,而不是去任何特定的服务类然后检查。

    在您的情况下,您可以将@EnableConfigurationProperties 注释与@SpringBootApplication 注释结合使用。

    【讨论】:

    • 一般来说,在服务层引用配置类是个好习惯吗?
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2020-06-14
    • 2016-08-16
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多