Spring Boot 的注解总结和整理
1. @Controller 和 @ResetController( 控制器注解 )
//在springboot开发中,控制层会用@Controller 和 @ResetController 两种注解
//@RestController = @Controller + @ResponseBody
1.1 @Controller
使用注解 @Controller,在控制器中,加有@GetMapping、@PostMapping、@RequestMapping注解的方法返回的是一个视图
1.2 @ResetController
使用注解 @ResetController,在控制器中,对应方法的返回值是json数据
@Controller
public class Test{
@RequestMapping("/Add")
@ResponseBody //这个注解一定和@Controller配合使用,@RestController不需要
public String doTest(Student stu){
System.out.println("测试成功");
return "dddd";
}
}
2. @RequestMapping 和 @Get/Post/Delete/PutMapping ( 处理请求的注解 )
//在spring boot中,在Controller控制器中有很多处理请求的注解,由于请求方式不同,所以使用的注解也不同
//前端发来的请求分为:普通请求||rest请求
//@RequestMapping 是其他几个请求注解的老父亲,get、post、delete、put都继承了@RequestMapping的方法,用来处理对应的 rest请求
//@GetMapping = @RquestMapping.class -> method:GET
//@PostMapping = @RequestMapping.class -> method:POST
//@DeleteMapping = @RequestMapping.class -> method:DELETE
//@PutMapping = @RequestMapping.class -> method:PUT
//****如果要使用@XXX("/{rest}")接收rest请求,就必须在对应的方法中使用@PathVariable注解接收参数
//@RequestMapping("/url")用来接收url请求时,springMvc底层自动将前端传来的参数转换对应的实体类对象
2.0 @RequestMapping
使用这个注解时,一般用来接收url请求,不用它来处理rest请求,因为如果一个Controller中需要处理多个rest请求,就容易出现问 问题,所以一般用它来处理url请求
2.1 @GetMapping
使用这个注解,既可以用来处理url请求,也可以用来处理rest请求,根据前端来决定使用哪一种方式,一般用来实现“查”的功能
@GetMapping("/url")
@GetMapping("/{rest}") //重点使用它来实现“查”
2.2 @PostMapping
使用这个注解,同样可以用来处理url请求和rest请求,一般用来实现“增”的功能
@PostMapping("/url") //重点使用它来实现“增”,将前端传来的参数整合为实体类中的对象,更方便操作
@PostMapping("/{rest}")
2.3 @DeleteMapping
使用这个注解,一般仅用来接收rest请求,用来实现“删”的功能
@DeleteMapping("/{rest}") //用它来实现“删”,因为删除时的传参一般只有 name 和 id 这两个参数
2.4 @PutMapping
使用这个注解,url请求和rest请求都差不多,用来实现“改”的功能,如果要修改的字段不多的话,用rest更好
@PutMapping("/url")
@PutMapping("/{rest}")
@RestController
public class Test {
@RequestMapping("/addHouse")
public String addHouse(Hose house){
String result=houseService.addHouse(house);
return result;
}
@DeleteMapping("/{id}")
public String deleteHouse(@PathVariable int id){
String result=houseService.deleteHouse(id);
return result;
}
}
3. @ResponseBody 和 @RequestBody ( 响应、请求数据的形式 )
//在spring boot中,用@RequestBody来处理请求中的json数据,用@ResponseBody来处理响应数据
//这两种注解运用的情景不同,区分清楚更容易理解
3.1 @ResponseBody
此注解与@Controller结合使用,如果不在Controller中的方法上方使用@ResponseBody注解,那么方法将默认返回给客户端一个页 面,配合@ResponseBody,将会把返回结果整理为json数据发给前端。
所以,它的应用场景是: //后台控制器用了@Controller,但是前端需要的是json数据,则在方法上方加@ResponseBody
3.2 @RequestBody
此注解用来,将前端请求中的字段整合、封装,整理为方法参数中用来传递请求参数的实体类对象,前端必须发送json!
所以,它的应用场景是: //后台接收了前端发来的多个字段的post请求,需要将这些字段转换成对象,去数据库操作(如添加)
@Controller
@RequestMapping("/house")
public class HouseController{
@Autowired
HouseService houseService;
@RequestMapping("/queryHosue")
@ResponseBody ///这是我们的主角
public House queryHouse(int id){
House onehouse=houseService.queryHouse(id);
return onehouse; ///这是我们返回的json数据,而不是把这个onehouse对象放在页面返回给前端
}
@GetMapping("/addHouse")
@ResponeBody
public int addHouse(@RequestBody House house){ /这里把前端发来的House的属性字段整合为house对象
int flag=houseService.addHouse(house);
if(flag==1){
return "添加成功!!";
}
}
}
4. @RequestBody 和 @RequestParam 和 @PathVasiable ( 处理请求参数的注解们 )
// @RequestBody:用来将前端请求中的参数整理为对应的实体类对象
// @RequestParam:用来接收有参或无参的请求,可以决定参数的必要性,并给参数默认值
// @PathVasiable:和RequestParam一样,都是用来接收请求中的参数,不同之处在于,param的参数实在请求的消息体中输入的,而 path的参数是通过url地址输入的
4.1 @RequestBody
Post请求的终结者,将Post格式的url请求中的参数集转换程对应的对象,对应的前端请求方式是:
let url='/house/doEdit'
this.$http.post(url,this.editForm).then(res=>{
console.log(res.data.data)
alert(res.data.msg)
}).catch(e=>{
console.log(e)
})
4.2 @RequestParam(value="pageNum" , required=true , defaultValue="1") int pageNum
一般用来接收get请求,可以接收有参或无参的请求,如果某个参数不是必须有的,则前端可以不传,通过这个注解给它默认值,此注解中 有三个参数:value、required、defaultValue,含义分别是:
//value:表示接收url的参数名,相当于key值,和后面的pageNum对应,一般不加
//defaultValue:表示请求参数的默认值,如果前端传参是传一个空值或空字符串,那么在这里将默认给它一个值来代替空值
//required:true表示这个参数是前端必须要传过来的,哪怕是空值也必须要穿过来,false表示这个参数不传也没事
一般用来接收get类型的url请求,对应的前端请求格式是:
this.$http.get('/house',
{params:{
pageNum:this.pageNum,
pageSize:this.pageSize,
otherSx:this.otherSx
}})
//综上例子,如果在get请求中的pageNum为null,那么到达后端@RequestParam时,回给一个pageNum一个默认值 1
4.3 @PathVasiable
一般只用来接收get类型的rest类型请求,通俗来讲就是为了接收rest请求中url地址后面携带的参数,对应的前端请求格式是:
this.$http.delete('/house/'+id).then(res=>{
alert(res.data.msg)
}).catch(e=>{
console.log(e)
})
后端对应接收rest请求的方法注解,对应的后端格式如:
@DeleteMapping("/{id}")
public String deleteHouse(@PathVariable int id){
String result=houseService.deleteHouse(id);
return result;
}
5. @Component 和 @ComponentScan( 组件注解 )
// @Component和@ComponentScan的使用目的不同
// 在某个类上使用@Component注解,表示这个类加载时是一个候选类,相当于举手,等待被叫
// @ComponentScan用于扫描指定包下的类,看看有哪些举手了,它不仅可以扫描@Component注解的类,也可以扫描 @Controller,@Service,@Repository注解的类
5.1 @Component
用在配置文件中,在整合spring boot整合druid时,在MyBatisProperties这个类上用到了这个注解,用来配置依赖(吧?)
5.2 @ComponentScan
目前还没用到过,查阅资料后知道它的用法特点是可以扫描指定包下的类或是分别扫描一个包下的两个不同包,这里先写下用法,遇到再说
//这是扫描整个包结构
@ComponentScan("com.etoak.config")
//这是扫描一个包结构下的两个不同包
@ComponentScan({"com.etoak.config","come.etoak.controller"})
6. @ConfigurationProperties( prefix=“XXX” )
//这个注解的功能有些抽象,就是让使用它的类变成配置类,类似与.properties文件,括号里的"XXX"就是.yml文件中对应的配置
//我们需要用这个注解将.yml文件中的配置导出应用在类中实现,老师就不讲你说气不气,就他妈硬写,操
//下面示例写出 .yml文件 -> properties类 -> config类 的连锁关系,帮助了解 @ConfigurationProperties的用法
6.* 以spring boot 整合druid 数据源时的配置为例:
6.1 appliaction.yml 文件:
-------------------------------------------------
server:
port: 7001
servlet:
context-path: /boot
mybatis: //注意,自己体会
type-aliases-package: com.etoak.bean
mapper-location: classpath:mappers/ *.xml
-------------------------------------------------
6.2 MyBatisProperties.java 文件(MyBatisProperties类):
-------------------------------------------------
@Component //看看它1
@ConfigurationProperties(prefix="mybatis") //注意,自己体会
public class MyBatisProperties{
private String typeAliasesPackage;
private String mapperLocations;
public String getTypeAliasesPackage(){
return typeAliasesPackage;
}
public void setTypeAliasesPackage(String typeAliasesPackage){
this.typeAliasesPackage=typeAliasesPackage;
}
public String getMapperLocations(){
return mapperLocations;
}
public void setMapperLocations(String mapperLocations){
this.mapperLocations=mapperLocations;
}
}
-------------------------------------------------
6.3 MyBatisConfig.java 文件(MyBatisConfig类):
-------------------------------------------------
@Configuration //看看它2
@MapperScan(basePackage = "com.etoak.mapper")
public class MyBatisConfig{
@Autowired
DataSource dataSource;
@Autowired
MyBatisProperties properties; //这个小家伙眼熟吗,看看上面写的什么
@Bean
public SqlSessionFactoryBean sqlSessionFactory(){
SqlSessionFactoryBean factory=new SqlSessionFactoryBean();
factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage()); //看看这句话
try{
Resource[] resource=resolver.getResource(this.properties.getMapperLocations()); //还有这句
factory.setMapperLocations(resources);
}catch(Exception e){
e.printStackTrace();
}
}
}
-------------------------------------------------
6.4 Druid02App.java 文件(我们实现功能配置的类)
-------------------------------------------------
@SpringBootApplication //看看这个东西哦
@RestController
public class Druid02App{
public static void main(String[] args){
SpringApplication.run(Druid02App.class,args); //看看,就一个注解和一句话就把所有配置都在这用了,气不气
@Autowired
UserMapper userMapper;
@GetMapping("/user/{id}")
public User getUser(@PathVariable int id){
return userMapper.getById(id);
}
}
}
-------------------------------------------------
这个注解多写了点儿废话,因为发现这个注解可以打通spring boot整合druid之后的流程,多写了一些,妙哉/
7. @SpringBootApplication
// @SpringBootApplication的功能主要由它肚子中的三个小注解实现,它本身实现的是读取扫描一个包结构下的组件类和配置类
// @SpringBootApplication肚子中有三个小组件,分别是:
// @SpringBootConfiguration -> 用于扫描注解类,及带有@Configuration的类
// @ComponentScan -> 用于扫描组件类,及带有@Component的类
// @EnableAutoConfiguration -> 开启自动配置,根据我们jar包的依赖自动配置项目
根据我的理解,@SpringBootApplication这个注解,通过肚子里的三个东西,实现了 6.2和 6.3中的两个"看看它",看完这个解析,再结合去看 6.1 ~ 6.2的内容,我觉得可以秒懂。
SpringApplication示例,就把这些整合配置好的东西 run()起来了
8. @Service 和 @WebService
// @Service相当于一个bean标签,作用和 @Controller/@Component/@Respository一样,在spring容器中创建bean
// 在一个Web应用程序中,@Respository ->持久层,@Controller ->控制层,@Service ->业务层,@Component ->中立类(工具类)
// @WebService 用来定义说明书的显示方法,只能用于cxf框架下和整合了cxf的框架,是cxf的特定规则,用来详细介绍自己写的接口
// 在@WebService 定义了几个属性,对应说明书中不同的部分
8.1 @Service
使用这个注解,就相当于配置了一个bean,如果@Service后面不跟括号内容的话,bean的id则默认为@Service注解的类的包结构,如 果在括号中写"XXX"的话,bean的别名就会更改
它的功能可以等效为:
=================================================
@Service
public class TestService{
public void test(){
System.out.println("演示");
}
}
=================================================
<bean id="com.etoak.service.TestService"></bean>
=================================================
8.2 @WebService
在类上使用这个注解,是cxf框架或整合了cxf框架的工程特有的用法,如果没有引入jws依赖,那这个注解没有用
这个注解相当于给调用接口的人提供了一个说明书,用来说明我们写的接口
当服务器开启后,在浏览器的地址栏输入: http://localhost:8080/ws/user(服务的url)/wsdl
就可以看到我们写的接口(@WebService注释的那个类)的说明书
一般情况下,我们需要在 [i]Service 和 [c]ServiceImpl 上都加上@WebService注释