springboot常用注解

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&param2=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是按照名称注

等等还有些…

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值