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