在Spring中设计可替换的依赖关系

tpxzln5u  于 2023-11-16  发布在  Spring
关注(0)|答案(2)|浏览(176)

我一直在深入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没有真正提供一种机制来做到这一点?
polhcujo

polhcujo1#

1.与问题的3层部分相关。您可以实现n层(3个或更多)架构,例如将每个层组织在一个单独的包中,或者组织在一个单独的源目录中。您可以将一个包用于表示层,并将控制器放在其中。另一层用于业务逻辑(把所有的抽象放在这一层),把所有的服务和它们的实现放在这一层。另一个数据访问层(数据访问层)把你所有的实体和仓库放在那里。
1.与可替换的接口/组件相关。你在哪里工作并不重要,但你希望有接口和实现,以便更容易地替换实现,所以在Sping Boot 中,您可以使用控制器(表示层)使用服务接口(服务层)作为服务实现示例的类型,并向其中传递所提供的实现(例如使用@Autowired注解注入实现对象),如果具体服务有多个实现,则需要使用@ Autowired注解
考虑下面提供的代码
这个控制器使用BaseService接口作为服务实现对象的类型(注意,在这个例子中,框架自动注入BaseService示例,而不使用Autowired注解,这是平台允许您注入对象的另一种方法)
静止控制器:

@RestController
@RequestMapping("/api")
public class EmployeeRestController {
    private EmployeeService employeeService;
    
    public EmployeeRestController(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }

    @GetMapping("/employees")
    public List<Employee> findAll() {
        return employeeService.findAll();
    }
...
}

字符串
服务接口:

public interface EmployeeService {
    public List<Employee> findAll();
    
    public Employee findById(int theId);
    
...
}


服务实施:

@Service
public class EmployeeServiceImpl implements EmployeeService {
    private EmployeeDAO employeeDAO;

    @Autowired
    public EmployeeServiceImpl(EmployeeDAO employeeDAO) {
        this.employeeDAO = employeeDAO;
    }

    @Override
    @Transactional
    public List<Employee> findAll() {
        return employeeDAO.findAll();
    }
    ...
}


如果你想有很多的实现,请查看这个post。它清楚地回答了这个问题,有很多实现的服务和注入所需的一个在所需的地方使用上述@ reflector注解。

3xiyfsfu

3xiyfsfu2#

你可以在Java Spring中使用Interfaces作为注入对象。Spring注入将查找所述接口的任何实现并返回一个示例。
如果您有多个实现,则必须给予限定符注解来选择所需的实现。

相关问题