如何通过spring.factories将SpringBootApp迁移到库?

时间:2019-02-21 15:46:06

标签: java spring spring-boot spring-cloud

我们已经构建了一个Spring服务发现解决方案,该解决方案通过在根包级别通过@Component进行组件扫描来自动装配几个用@Service@SpringBootApplication注释的本地类。该项目遵循标准的Maven / spring布局:

project
  src/main/java
    service
      - ServiceA.java
      - ServiceB.java
      ...
    model
      - modelA.java
      ...
    component
      - ComponentA.java
      - ComponentB.java

    BootApp.java
    pom.xml

我们现在想以库的形式在内部进行分发,而这样做需要一个spring.factories文件(请参见how marathon does it /请参见spring autoconfig docs)。查看其他服务发现实现,例如marathoneureka,看来我应该删除所有自动装配注释(即@Component@Service),而是手动配置所有将组件/ bean分为一个或多个@Configuration类。该应用程序已经自动装配并引导了十多个类-我希望不必重构并手动将它们连接起来。

我的问题:有什么方法可以简单地保留现有的自动装配/项目结构,并以类似于组件扫描的方式spring.factories进行拾取?像这样:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=project.BootApp

org.springframework.boot.autoconfigure.EnableAutoConfiguration=project.*

在没有大量spring.factories类的情况下,如何重构支持@Configuration还有其他技巧或最佳实践吗?是否可以拆分差异并自动连接我们的大多数内部对象,然后手动配置诸如DiscoveryClientServiceRegistery(请参阅spring cloud SPI)的公共对象并在spring.factories中引用它们?

1 个答案:

答案 0 :(得分:1)

事实证明,可以像使用@ComponentScan一样使用@SpringBootApplication

@Configuration
@ComponentScan("com.bnymellon.tsg.discovery.springcloud.autoconfig")
public class BootApp {

}

关键区别在于@SpringBotApplication包含@EnableAutoConfiguration,在这里不能很好地发挥作用。

PS-我不是从spring-starter-parent继承而来的,所以spring.factories没有包括在构建的工件中。必须将以下内容添加到pom.xml

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.factories</include>
            </includes>
        </resource>
    </resources>
</build>

我想最后,通过注解(例如@Service)自动装配是一种有效的方法,我在这个问题上以为它与spring.factories不兼容是不正确的。