Spring 自动配置手动导入所有组件

Spring AutoConfiguration manul import all components

我有以下自动配置 class。

@Configuration
@ConditionalOnWebApplication
@EnableConfigurationProperties({LoggerProviderProperties.class})
@Import({LoggerController.class, LogService.class, LogConfig.class})
public class ProviderAutoConfiguration {

}

我需要使用@import 注释导入所有组件、服务、配置,否则,例如,当我从@Import 参数中删除LogService.class(LogController autowires LogService)时,它会抛出以下错误

考虑在您的配置中定义类型为 'com.log.LogService' 的 bean。

我真的必须如上所示手动包含所有这些,还是有任何其他方法可以自动检测 classes 带注释的服务、组件或配置?

!这是入门库,不是可执行应用程序!

您可以使用 @ComponentScan 指定要扫描的包以查找要加载的配置 and/or 组件。

假设您正在使用 Spring 启动,至少根据您的标签看来是这样,您应该看看 @SpringBootApplication

@SpringBootApplication 封装了 @Configuration@EnableAutoConfiguration@ComponentScan 注释及其默认属性。 @ComponentScan 的默认值意味着扫描 @ComponentScan 使用的包上的所有子包。这就是为什么在项目的基础包中包含主要 class 通常是一个好习惯。

您的“库”的问题是它已经需要很多移动部件,例如 Spring Data JPA,正确设置 JPA。如果不可用,它将失败,或者如果您添加 @EnableJpaRepositories and/or 之类的 @ComponentScan@EntityScan 它将(非常严重)干扰(自动)配置Spring 启动或客户端。这就是您要防止的。

您需要做的不是所有这些注释

  1. 有条件地启用 @EnableJpaRepositories 或者只包含依赖项并让自动配置启动(我建议后者)
  2. 不要添加 @ComponentScan@EntityScan 等,而是使用专为初学者设计的 @AutoConfigurationPackage
@Configuration
@ConditionalOnWebApplication
@EnableConfigurationProperties({LoggerProviderProperties.class})
@AutoConfigurationPackage
public class ProviderAutoConfiguration {

}

注意: 这假设 ProviderAutoConfiguration 与另一个 类 在相同或更高的包中。如果在@AutoConfigurationPackage.

中没有指定basePackages

如果您的组件、服务、配置在 com.log 下作为直接 class 或在子包中,您可以使用 @ComponentScan(basePackages="com.log.*")

@Configuration
@ConditionalOnWebApplication
@EnableConfigurationProperties({LoggerProviderProperties.class})
@ComponentScan(basePackages="com.log.*")
public class ProviderAutoConfiguration {

}