springboot常用注解
看了黑马的javaweb,学习了一些springboot常用注解作为回顾复习
@SpringBootApplication
作用:这是一个组合注解,包括了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。用于标识SpringBoot应用程序的入口类。
@Configuration:指示这个类是一个配置类,它定义了一个或多个@Bean方法,用于创建和配置Spring应用程序上下文中的Bean。
@EnableAutoConfiguration:启用Spring Boot的自动配置机制,它会自动添加所需的依赖项和配置,以使应用程序能够运行。
@ComponentScan:指示Spring Boot扫描当前包及其子包中的所有@Component、@Service、@Repository和@Controller注解的类,并将它们注册为Spring Bean。
@ComponentScan({"dao","funnyboy"}) //如果要扫其他包则需要添加包名
@SpringBootApplication注解通常被用于Spring Boot应用程序的入口类上,用于启动Spring Boot应用程序。它可以简化Spring应用程序的配置和启动过程。
用例:
@SpringBootApplication//默认扫描当前包及其子包
public class SpringbootWebQuickstartApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootWebQuickstartApplication.class, args);
}
}
@RestController
作用:将当前类下的所有方法返回值作为响应数据,方法的返回值如果是一个POJO对象或集合时,会自动将返回值转换为JSON格式,在响应给浏览器。
@RestController = @Controller + @ResponseBody
@RequestMapping
作用:用于映射请求URL和处理方法。它可以用于类级别和方法级别,用于指定请求URL和HTTP方法(GET、POST、PUT、DELETE等)
一般@RequestMapping抽取放在类上
提示:在使用@RequestMapping之前,请求处理类还需要使用@Controller或@RestController进行标记
//部门管理控制器
@Slf4j //是 Lombok 提供的一个注解,该类中使用 log 对象输出日志信息
@RestController
@RequestMapping("/depts")
public class DeptController {
@Autowired
private DeptService deptService;
//查询
@GetMapping
public Result list() {
log.info("查询全部部门的数据");
//调用service查询部门数据
List<Dept> deptList = deptService.list();
return Result.success(deptList);
}
//删除
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id){
log.info("根据id删除部门:{}",id);
//调用service删除部门
deptService.delete(id);
return Result.success();
}
//新增部门
@PostMapping
public Result add(@RequestBody Dept dept){
log.info("新增部门:{}",dept);
deptService.add(dept);
return Result.success();
}
/*
*修改部门
*/
//查询回显
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id){
log.info("获取部门ID:{}",id);
Dept dept=deptService.getById(id);
return Result.success(dept);
}
@PutMapping
public Result updata(@RequestBody Dept dept){
log.info("修改部门:{}",dept);
deptService.updata(dept);
return Result.success();
}
}
@GetMapping
作用:用于映射HTTP GET请求。
@PostMapping
作用:用于映射HTTP POST请求。
@PutMapping
作用:用于映射HTTP PUT请求。
@DeleteMapping
作用:用于映射HTTP DELETE请求。
@RequestParam
解决参数名不一致问题
注意事项:
@RequestParam中的required属性默认为true(默认值也是true),代表该请求参数必须传递,如果不传递将报错
作用:用于获取请求参数的值。
对于简单参数来讲,请求参数名和controller方法中的形参名不一致时,无法接收到请求数据。所以在方法形参前面加上 @RequestParam 然后通过value属性执行请求参数名,从而完成映射。
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=Tom&age=20
// 请求参数名:name
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam("name",required = true) String username , Integer age ){
//请求参数名和形参名不相同
System.out.println(username+" : "+age);
return "OK";
}
}
集合参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam 绑定参数关系
默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使用
@RequestParam绑定参数关系
@RestController
public class RequestController {
//数组集合参数
// http://localhost:8080/simpleParam?name=Tom&age=20
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "OK";
}
}
@PathVariable
获取url中的数据
使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数
@RestController
public class RequestController {
//路径参数
//http://localhost:8080/path/1
@RequestMapping("/path/{id}")
//获取路径参数id,将路径参数绑到形参变量id上
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "OK";
}
}
@DateTimeFormat
因为日期的格式多种多样(如:2022-12-12 10:05:45 、2022/12/12 10:05:45),那么对于日期类型的
参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。
@RestController
public class RequestController {
//日期时间参数
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
//后端controller方法中,需要使用Date类型或LocalDateTime类型,来封装传递的参数。
System.out.println(updateTime);
return "OK";
}
}
@RequestBody
将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性名保持一致)
传递json格式的参数,在Controller中会使用实体类进行封装。
封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使@RequestBody标识。
@RestController
public class RequestController {
//JSON参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "OK";
}
}
什么时候使用 @RequestBody:
如果你的请求方法是 POST 或 PUT,并且请求体中包含复杂的 JSON 数据(例如,包含多个字段的对象),这时需要使用@RequestBody 注解。
而GET 请求通常不使用请求体,而是通过 URL 查询参数传递数据(例如 /page?param1=value1¶m2=value2)。因此不需要 @RequestBody 注解。
@ResponseBody
如果返回值类型是实体对象/集合,将会转换为JSON格式后在响应给浏览器
类型:方法注解、类注解
位置:书写在Controller方法上或类上
作用:将方法返回值直接响应给浏览器
但是在类上添加@RestController就相当于添加了@ResponseBody注解。
表示当前类下所有的方法返回值做为响应数据
- 方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器
@Component
在我们进行程序设计以及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。
基于三层架构的程序执行流程:
前端发起的请求,由Controller层接收(Controller响应数据给前端)
Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)
Serivce层调用Dao层(逻辑处理过程中需要用到的一些数据要从Dao层获取)
Dao层操作文件中的数据(Dao拿到的数据会返回给Service层)
内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
软件设计原则:高内聚低耦合。
高内聚指的是:一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的
联系程度越高,则内聚性越高,即 “高内聚”。
低耦合指的是:软件中各个层、模块之间的依赖关联程序越低越好。
而用三层架构则可以让他们变的高内聚。
那应该怎么解耦呢?
首先不能在EmpController中使用new对象。但是就不能new了,就意味着没有业务层对象(程序运行就报错)
所以可以提供一个容器,容器中存储一些对象(例:EmpService对象)controller程序从容器中获取EmpService类型的对象。
想要实现上述解耦操作,就涉及到Spring中的两个核心概念:
控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容
器或Spring容器
依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
程序运行时需要某个资源,此时容器就为其提供这个资源。
例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象
IOC容器中创建、管理的对象,称之为:bean对象
Spring框架为了更好的标识web应用程序开发当中,bean对象到底归属于哪一层,又提供了
@Component的衍生注解:
@Controller (标注在控制层类上)
@Service (标注在业务层类上(由于与mybatis整合,用的少)
@Repository (标注在数据访问层类上)
对于@Component,不属于以下三类时,用此注解
- Controller
@RestController //@RestController = @Controller + @ResponseBody
public class EmpController {
@Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量
private EmpService empService;
}
- Service
@Component //将当前对象交给IOC容器管理,成为IOC容器的bean
public class EmpServiceA implements EmpService {
@Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量
private EmpDao empDao;
}
- dao
@Component //将当前对象交给IOC容器管理,成为IOC容器的bean
public class EmpDaoA implements EmpDao {
}
- 但是使用四大注解声明的bean,要想生效,还需要被组件扫描注解@ComponentScan扫描
@SpringBootApplication 中,默认扫描的范围是springBoot启动类所在包及其子包,
因为自带@ComponentScan注解。
@Autowired
依赖注入/自动装配
运行时,从IOC容器中获取该类型对象,赋值给该变量
@Primary @Qualifier @Resource
在IOC容器中,如果存在多个相同类型的bean对象,有一下办法:
- @Primary
- @Autowired + @Qualifier(name=“bean的名称”)
使用@Qualifier注解:指定当前要注入的bean对象。
在@Qualifier的value属性中,指定注入的bean的名称。
@Qualifier注解不能单独使用,必须配合@Autowired使用
- @Resource (name=“bean的名称”)
@Autowird 与 @Resource的区别:
@Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
使用@Qualifier注解:指定当前要注入的bean对象。在@Qualifier的value属性中,指定注入的bean的名称。
@Qualifier注解不能单独使用,必须配合@Autowired使用
- @Resource (name=“bean的名称”)
@Autowird 与 @Resource的区别:
@Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
@Autowired 默认是按照类型注入,而@Resource是按照名称注
等等还有些…