我们已经构建了一个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)。查看其他服务发现实现,例如marathon
和eureka
,看来我应该删除所有自动装配注释(即@Component
和@Service
),而是手动配置所有将组件/ bean分为一个或多个@Configuration
类。该应用程序已经自动装配并引导了十多个类-我希望不必重构并手动将它们连接起来。
我的问题:有什么方法可以简单地保留现有的自动装配/项目结构,并以类似于组件扫描的方式spring.factories
进行拾取?像这样:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=project.BootApp
或
org.springframework.boot.autoconfigure.EnableAutoConfiguration=project.*
在没有大量spring.factories
类的情况下,如何重构支持@Configuration
还有其他技巧或最佳实践吗?是否可以拆分差异并自动连接我们的大多数内部对象,然后手动配置诸如DiscoveryClient
和ServiceRegistery
(请参阅spring cloud SPI)的公共对象并在spring.factories
中引用它们?
答案 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不兼容是不正确的。