代码之家  ›  专栏  ›  技术社区  ›  springenthusiast

如何将springboot中的重复配置作为jar并用作依赖项

  •  0
  • springenthusiast  · 技术社区  · 1 年前

    我们有许多用于多任务的微服务,其中大多数都有一些常见的功能,如日志配置、度量配置和kafka配置等。 我们计划拥有一个具有通用功能的通用JAR,并在所有微服务中使用。

    当我们用创建自定义springboot jar时 application.yml 有了这些公共配置和其他一些@Component和@Service类,并作为依赖项包含在微服务中,就不会从特定于JAR的文件中读取任何属性 application.yml 在JAR中。

    定制弹簧靴罐-

    src/main/java - 
    
        @Configuration
        public class KafkaConfiguration {}
        
        @Service
        public class CommonProcessor {}
    

    src/main/resources-

    application.yml

    logging:
      level:
        org.apache: DEBUG
    spring:
      cloud:
        stream:
          kafka:
            binder:
              autoCreateTopics: false
              brokers: localhost:9092
              configuration:
                sasl:
                  jaas:
                    config: org.apache.kafka.common.security.plain.PlainLoginModule required username="" password="";
    

    在里面 KafkaConfiguration.java 我正在阅读上面的属性,并创建kafka连接、kafka模板对象等。如果我在这个jar中编写示例消费者/生产者,并作为springboot项目运行,一切都会很好。

    但是,我想在我的微服务中使用这个jar作为依赖项,并使用kafka连接/kafkatemplate等,即当它无法从上面加载任何属性时 application.yml 并且创建bean失败。

    微服务结构-

    src/main/java

    @Component
    public class Consumer {
    @Autowired
    KafkaTemplate kafkaTemplate;
    }
    

    src/main/resources

    application.yml

    test:
     property: test
    example:
     service:
      url: https://localhost:8080/service
    

    pom.xml

    <dependency>
    <groupId>com.test</groupId>
    <artifactId>common-jar</artifactId>
    <version>1.0</version>
    

    我在这里缺少了什么,因为我的JAR文件无法通过加载属性来创建其中定义的bean?这种拥有2个application.yml的方法不正确吗?在一个地方拥有共同属性的最佳方式是什么?

    0 回复  |  直到 1 年前
        1
  •  0
  •   aksappy    1 年前

    对于第一个问题

    如果依赖项具有不同的包名称,则使用 @ComponentScan 像下面这样从另一个包加载任何bean。

    @ComponentScan(basePackages = "com.test.dependency")

    您还可以在主应用程序中以编程方式声明bean。

    第二个问题

    有很多方法可以做到这一点。你可以

    1. 导入属性源(使用@Import)
    2. 有一个自动配置注释(看看这个 AutoConfiguration example )
    3. 使用类路径解析从属性加载默认值。(关于如何读取application.properties,请参阅同一SO)

    对于问题3:

    IMO,依赖项必须允许覆盖主应用程序的属性。作为默认值,您可以将这些值保留在依赖项中,但它是否是要拾取的默认值必须由主应用程序决定。这种方法可以在许多其他sdk甚至spring模块本身中看到。