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



我有下面的自动配置类。

@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。

我真的必须像上面所示的那样手动包含所有这些吗,或者有没有其他方法可以自动检测注释为"服务"、"组件"或"配置"的类?

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

您的"图书馆";它已经需要很多移动部件,比如SpringDataJPA,正确地设置JPA。如果这不可用,它将失败,或者如果添加@EnableJpaRepositories和/或@ComponentScan@EntityScan之类的东西,它将(非常严重)干扰Spring Boot或客户端的(自动)配置。这就是你想要防止的。

你需要做的不是所有这些注释,而是

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

注意:这假设ProviderAutoConfiguration与其他类在同一个或更高的包中。如果未指定@AutoConfigurationPackage中的basePackages

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

假设您使用的是Spring Boot,至少根据您的标签,您应该看看@SpringBootApplication

@SpringBootApplication使用默认属性封装@Configuration@EnableAutoConfiguration@ComponentScan注释。@ComponentScan的默认值意味着扫描使用@ComponentScan的包上的所有子包。这就是为什么在项目的基本包中包含主类通常是一种很好的做法。

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

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

最新更新