目录
🍸前言
👋一、区别
🍻二、本地测试
2.1 响应类
2.2 控制层
3.@Service 测试
🍺三、分析
👀四、章末
🍸前言
小伙伴们大家好,由于最近比较忙,文章更新的稍微怠慢了,在忙什么?那肯定不是忙着做天命人
今天不更新别的,就拿我之前亲身经历过的一个面试问题吧,当时遇到这道题的时候感觉挺有意思的,但是后面也没有正式了解,今天来实践下。问题看标题能了解到,@Controller 注解能被 @Service 注解代替使用吗?
👋一、区别
@Service 注解和 @Controller 在平时开发的时候,并没有太多注意,主要是使用上有些不同。
@Service 主要是用来标识一个服务类,表示这个类是用来负责处理业务逻辑,与数据访问层交互的。
@Controller 主要是用来标识一个控制器类,表示该类负责处理 WEB 请求,负责将用户请求分发到适当的服务层,然后返回响应。
🍻二、本地测试
简单创建一个 springBoot 项目测试下即可
2.1 响应类
实体类结构很简单,三个属性,@Data 注解简化 get(),set() 方法的编写,@AllArgsConstructor 注解标注全参构造函数(注意使用了这个注解后,默认的无参构造函数就不能使用了,因为默认会提供一个无参构造函数,如果自定义了构造方法,那么默认的失效)
2.2 控制层
先模拟正常使用 @Controller 的方式,请求的话就直返回一个实体类对象即可;
import org.example.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/test")
public class TestServiceController {
@GetMapping("/getTestService")
@ResponseBody
public User getTestService(){
User user = new User("贫僧不白", "灵山脚下", 666);
return user;
}
}
请求结果如下:这里推荐一个快捷请求插件,cool request ,安装这个插件后,在 请求层中的每个方法旁边会有一个标识,点击直接跳转到右边的页面,并且路径,参数,请求体都会直接生成,调试的时候可以省下很多步骤
3.@Service 测试
将 @Controller 改为 @Service,别的地方不需要改动,结果如下:可以看到结果正常显示,说明这里使用 @Service 代替 @Controller 没什么影响
🍺三、分析
通过简单的测试发现,可以使用 @Service 代替 @Controller 标注在控制层上,当时遇到这个问题的时候,感觉这两个注解在没有特殊情况时,都只是声明式注解 ,标注的类可以被 SPring 容器加载注入,所以可以互相替代。
查找相关文章后,得出结论,大概就是控制层的方法,会在 AbstractHandlerMethodMapping 中的 afterPropetriesSet() 完成请求 url 与方法的映射绑定;而控制层会有一个@RequestMapping 注解,借助这个注解可以完成 url 和方法的映射关系维护,所以只要确保 bean 能注入到容器(@Controller @Service 都可以声明为bean)即可,不需要这两个注解处理方法与 URL 的映射。
👀四、章末
文章到这里就结束了~