我发现在MVC模式中,主要有4个类;控制器,服务,服务impl和repo。
服务是一个接口,服务impl实现服务类并包含所有逻辑代码。结构类似于: -
Service
接口类
Service{
public void someMethod();
}
ServiceImpl
上课
ServiceImpl implements Service{
public void someMethod(){
//do something
}
}
但是当我们想要从控制器访问服务impl代码时,我们将服务类的方法称为: -
@Autowired
Service service;
Object obj = service.someMethod();
控制器如何执行ServiceImpl
class
答案 0 :(得分:6)
这基本上是Spring的工作原理:
服务实现应该是一个Spring bean(它必须具有@Component
或@Service
注释,或者应该在Spring XML配置文件中定义),以便Spring可以找到它并且在Spring应用程序上下文中注册它。
然后通过@Autowired
注释使用依赖注入将服务的实现注入控制器。这意味着Spring将查看您的控制器,它将在@Autowired
成员变量上找到service
注释,并使用它在应用程序上下文中找到的bean对其进行初始化,该bean将是它先前已注册的服务实现类。因此,在Spring完成后,service
将引用ServiceImpl
。
有关依赖注入如何与Spring一起工作的信息,请参阅Spring Framework参考文档:The IoC container
答案 1 :(得分:2)
拥有这种架构背后的基本理念与春季惯例没什么不同。
让我们明天你决定,你不想为这两个项目单独申请,并进入一个部署webapp和另一个部署服务 例 UserService Web应用程序
因此,对于WebApp连接到UserService,它必须发出http请求以获取任何类型的数据。然后,您必须更改所有WebApp代码,以使其与新更改兼容。例如,直接调用服务方法,您将调用httpClient。为了避免这种返工,你可以做的是,使用接口服务,你实现自己的ServiceImpl并在那里发出所有的http请求,其余的保持不变。
类似的东西将在UserService中完成,它将拥有自己的ServiceImpl,但将在Controller中作为单例对象调用。
你的回答: 您可以直接引用ServiceImpl,它将满足目的,差异仅在ServiceImpl不是当前模块或任何依赖项的一部分时,但最终捆绑项目将通过某些兄弟模块实现其可能
答案 2 :(得分:1)
当您使用注释 @Autowired 时,Spring会自动在其应用程序上下文中搜索要在控制器中注入的候选项。有效候选者应该是标记为Spring bean的具体类,例如使用注释 @Service 。
答案 3 :(得分:0)
@Controller-控制器是一个入口点,您可以在其中使用来自用户界面的请求,定义一堆服务,然后转储一个requestmapping URI路径,该路径指示哪些请求进入后端,返回什么。然后,创建一堆服务,在其中编写一堆接口,然后继续,创建一堆ServiceImplementation文件,然后创建DAO。 关于自动装配的注意事项:它会自动带来您在中指定的实例 @Service-特殊类将被视为服务,用于编写DAO事务。 @Autowired从某个地方带来了您需要的“实例”,通常我们会尝试从Autowired批注中找到所需的“服务”,然后可以添加@qualifier以避免混淆将哪个实例从相似的bean中提取出来。