Java SpringBoot:如何使泛型类与框架不紧密耦合?
前端开发人员正在开发我的第一个JavaSpring引导API。我已经阅读了很多关于Spring/Spring Boot中“最佳实践”的文章,并且一直在尝试重构我的代码以遵循这些实践 下面是一个通用类的示例,我使用它来处理各种服务的所有HTTP请求。最初我用注释了这个类,但正如我所提到的,我正在尝试学习并遵循Spring的“最佳实践”。我特别感兴趣的是实现所描述的内容(本文中的编号3和4)。这说明应该避免使用@component,因为我们不希望与Spring框架紧密耦合,我们希望避免“整个类路径扫描”。 使用Java SpringBoot:如何使泛型类与框架不紧密耦合?,java,spring,spring-boot,Java,Spring,Spring Boot,前端开发人员正在开发我的第一个JavaSpring引导API。我已经阅读了很多关于Spring/Spring Boot中“最佳实践”的文章,并且一直在尝试重构我的代码以遵循这些实践 下面是一个通用类的示例,我使用它来处理各种服务的所有HTTP请求。最初我用注释了这个类,但正如我所提到的,我正在尝试学习并遵循Spring的“最佳实践”。我特别感兴趣的是实现所描述的内容(本文中的编号3和4)。这说明应该避免使用@component,因为我们不希望与Spring框架紧密耦合,我们希望避免“整个类路径扫
@component
注释,我的服务可以按预期工作,但当我删除它时,会出现异常:
org.springframework.beans.factory.noSuchBean定义异常:否
类型的限定bean
这在Java中似乎是一个非常常见的例外,因为有很多关于它的问题,但这些解决方案对我来说并不奏效
我希望社区能帮助我回答的问题分为两部分:
将
@Component
添加到类中会强制使用您的类的任何人了解Spring(即Spring是编译时依赖项)
最简单的替代方法是在应用程序中创建单独的类,用@Configuration
注释,并让它处理创建Springbean类的操作
例如:
@Configuration
public class MyConfiguration {
@Bean
public HttpService httpService() {
return new HttpService();
}
}
这使您的HttpService
类不受Spring依赖项的影响(假设它不使用任何其他Spring注释,如@Autowired
),但它可以在您自己的应用程序中作为springbean
请注意,您的类仍然依赖于
restemplatebuilder
,它本身就是一个Spring引导类,这意味着您的类(以及任何使用它的人)将需要Spring。查看您链接的文章,我认为对术语“域”存在误解。“域”是应用程序生成其价值的地方。以Steam为例,搜索和购买游戏的能力产生(商业)价值。另一方面,HTTP服务是一个技术细节。是的,这是必要的,但它本身不会产生任何价值。因此,本文第3点和第4点不适用于HttpService
在典型的web应用程序中,至少有三层:
- 提供API的一个层:这些是您的端点和API使用的所有对象。例如,这包括表示端点传递/返回的请求和响应的实体
- 提供持久性的一层:通常是存储库、DAO或任何您想要使用的持久性模型。同样,持久化单元所需的一切都应该包含在这个层中
- 一层包含实际域:这就是我们在谈论“域”时所谈论的内容。这里我们看到了应用程序的实际功能
- OpenShift有一个RESTAPI和一个CLI
- AWS有一个RESTAPI和几个CLI,其中许多是第三方的
- Steam有一个网络店面、一个桌面应用程序和一个移动客户端
- KeyClope允许从不同来源(LDAP、OAuth2/OIDC、数据库等)提取身份验证信息
@Component
,因为我们不希望与Spring框架紧密耦合
它说我们不希望我们的域类与Spring紧密耦合。HttpService
(它绑定到web上下文并取决于Spring的RestTemplateBuilder
)和MySuperSpecificDomainCalculator
(不管它放在什么上下文中都应该继续工作)之间存在差异
。。。我们希望避免“整个类路径扫描”
在使用类路径扫描时,我看不出有什么非常糟糕的地方。您可以让Spring扫描一小部分包。您可以精确地指向依赖于Spring的类所在的位置。带有@Bean
方法的@Configuration
是另一种选择
我如何正确地使其成为可用的ge
@Configuration
public class MyConfiguration {
@Bean
public HttpService httpService() {
return new HttpService();
}
}