我有下面的自动配置类。
@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或客户端的(自动)配置。这就是你想要防止的。
你需要做的不是所有这些注释,而是
- 有条件地启用
@EnableJpaRepositories
,或者只包含依赖项并启用自动配置(我建议后者) - 不要添加
@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 {
}