我一直在深入Spring以重新回到Java(我的专业经验是C#,ASP.NET Core)。一个有点不同的项目是Spring缺乏基于接口的DI(至少从here和最近的Spring文档here来看)。例如,在.NET中,我可能有一个像这样排列的3层应用程序:
-API项目
----Controllers\WeatherController.cs
- 核心项目
----IWeatherService.cs - 数据项目
----OpenWeatherMapWeatherService.cs
在DI容器配置中,我会将IWeatherService依赖项与OpenWeatherMapWeatherService相关联。如果我以后想使用天气频道,我可以添加WeatherMapelWeatherService.cs并更新IWeatherService的配置以指向WeatherMapelWeatherService。
Spring中是否有一种通用的方式来允许依赖项以这种方式被替换?或者构造器/setter DI没有真正提供一种机制来做到这一点?
2条答案
按热度按时间polhcujo1#
1.与问题的3层部分相关。您可以实现n层(3个或更多)架构,例如将每个层组织在一个单独的包中,或者组织在一个单独的源目录中。您可以将一个包用于表示层,并将控制器放在其中。另一层用于业务逻辑(把所有的抽象放在这一层),把所有的服务和它们的实现放在这一层。另一个数据访问层(数据访问层)把你所有的实体和仓库放在那里。
1.与可替换的接口/组件相关。你在哪里工作并不重要,但你希望有接口和实现,以便更容易地替换实现,所以在Sping Boot 中,您可以使用控制器(表示层)使用服务接口(服务层)作为服务实现示例的类型,并向其中传递所提供的实现(例如使用@Autowired注解注入实现对象),如果具体服务有多个实现,则需要使用@ Autowired注解
考虑下面提供的代码
这个控制器使用BaseService接口作为服务实现对象的类型(注意,在这个例子中,框架自动注入BaseService示例,而不使用Autowired注解,这是平台允许您注入对象的另一种方法)
静止控制器:
字符串
服务接口:
型
服务实施:
型
如果你想有很多的实现,请查看这个post。它清楚地回答了这个问题,有很多实现的服务和注入所需的一个在所需的地方使用上述@ reflector注解。
3xiyfsfu2#
你可以在Java Spring中使用Interfaces作为注入对象。Spring注入将查找所述接口的任何实现并返回一个示例。
如果您有多个实现,则必须给予限定符注解来选择所需的实现。