一、SpringBoot 简介
- Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。
- 大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。
- 然后有发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot
- SpringBoot 从本质上来说就是 Spring,简化了 Spring中的配置和统一各种依赖的版本
- 核心特性:
- 自动配置:自动提供 Spring 应用程序常见应用功能的相关配置
- 起步依赖:告诉 SpringBoot 需要什么功能,就能引入对应的库,无需考虑该功能依赖库的版本问题
- 监控程序 Actuator:可以深入了解 SpringBoot 应用程序内部情况,如创建了哪些 Bean、自动配置的决策、应用程序的状态信息
二、常用注解
(一) 组件相关注解
1. @Controller
- 用于修饰 MVC 中
controller
层的组件,会被组件扫描并生成实例化对象 - 通常与
@RequestMapping
联用,当SpringMVC获取到请求时会转发到指定路径的方法进行处理
2. @Service
- 用于修饰
service
层的组件,会被组件扫描并生成实例化对象 service
层组件专注于系统业务逻辑的处理
3. @Repository
- 用于修饰
dao
层的组件,会被组件扫描并生成实例化对象 dao
层组件专注于系统数据的处理,例如数据库中的数据
4. @Component
- 用于修饰SpringBoot中的组件,会被组件扫描并生成实例化对象
@Controller
、@Service
、@Repository
都是特殊的组件注解
(二)依赖注入注解
1. @Autowired
- 注释在 类的成员变量 上,自动为变量匹配 Bean 实例
-
// 替代了 private MyService myService = new MyService(); @Autowired private MyService myService;
-
- 注释在 类的构造函数 上,自动为参数匹配 Bean 实例
-
private MyService myService; @Autowired public MyClass(MyService myService) { this.myService = myService; }
-
- 注释在 类的方法 上,自动为参数匹配 Bean 实例
-
private MyService myService; @Autowired public void setMyService(MyService myService) { this.myService = myService; }
-
2. @Resource
- 会根据对象的
名称
自动注入依赖对象 - 如果想要根据类型进行注入,可以设置属性为
type = UmsAdminService.class
3. @Qualifier
- 当同一个对象有多个实例可以注入时,使用
@Autowired
注解无法进行注入 - 这时可以使用
@Qualifier
注解指定实例的名称进行精确注入
(三)实例与生命周期相关注解
1. @Bean
- 用于修饰方法,标识该方法会创建一个Bean实例,并交给Spring容器来管理
2. @Scope
- 用于声明一个Spring
Bean
实例的作用域,作用域的范围有以下几种:- singleton:单例模式,在Spring容器中该实例唯一,Spring默认的实例模式。
- prototype:原型模式,每次使用实例都将重新创建。
- request:在同一请求中使用相同的实例,不同请求重新创建。
- session:在同一会话中使用相同的实例,不同会话重新创建。
3. @Primary
- 当同一个对象有多个实例时,优先选择该实例
4. @PostConstruct
- 用于修饰方法,当对象实例被创建并且依赖注入完成后执行,可用于对象实例的初始化操作
5. @PreDestroy
- 用于修饰方法,当对象实例将被Spring容器移除时执行,可用于对象实例持有资源的释放
(四)SpringMVC相关注解
1. @RequestMapping(value = " ", method = RequestMethod.xx)
- 注解在方法上或类上
- 可用于将 Web 请求路径映射到处理类的方法上
- 意思是,如果针对该路径发送请求,那么将会由这个方法来处理该请求
- 例如,如果接收到GET请求 “/brand/listAll” 时,会调用该方法处理请求,在例子中时获取所有品牌信息并将结果封装为一个对象进行返回
- URL 请求路径 —— 即端点 endpoint:
- 指 Web 服务提供的特定资源或功能的 URL
- 通过访问不同的端点,客户端可以与 Web 服务进行交互,执行特定的操作或获取特定的数据
- 需要开发者自己命名定义注解中的 value 和方法名
- 意思是,如果针对该路径发送请求,那么将会由这个方法来处理该请求
- 作用于类上时,可以统一类中所有方法的路由路径;作用于方法上时,可单独指定方法的路由路径;method 属性可以指定请求的方式,如GET, POST, PUT, DELETE等
- GET 和 POST 的区别
- GET 用于获取资源,不会对服务器上的数据产生副作用,如获取、删除
- POST 用于创建或更新资源,有可能会改变服务器上的数据,如新建、更新
- 如果类上定义基本URL路径为 “/brand”,此控制器类中的某个方法定义 “/listAll” 端点
- 此控制器类中定义的所有端点将在 http://localhost:8080/brand 路径下访问
- 该 “listAll” 端点将在 http://localhost:8080/brand/listAll 下访问
- GET 和 POST 的区别
- 特例:
- @GetMapping
- 用于表示GET请求方法,等价于
@RequestMapping(method = RequestMethod.GET)
- 用于表示GET请求方法,等价于
- @PostMapping
- 用于表示POST请求方法,等价于
@RequestMapping(method = RequestMethod.POST)
- 用于表示POST请求方法,等价于
- @GetMapping
2. @ResponseBody
- 注解在方法上
- 表明该方法的返回对象会被自动转换为 JSON 格式
- 多与 @Controller 一起使用,自动将方法的返回值转化为适当的格式 JSON/XML,并将其写入 HTTP 响应体中返回给客户端,而不是将其作为视图解析并渲染
3. @RequestBody
- 注解在方法的参数对象上
- 将 请求体中的 JSON 数据 转化为 方法的参数对象
- 多与 @PostMapping、@PutMapping 等一起使用,用于处理 POST, PUT 等请求方法
- @PostMapping XXX xxx:
- 会将请求体映射为 XXX 类型的 xxx 对象,从而可以直接在方法中使用该 xxx 对象来处理请求体中的数据
4. @RequestParam
- 注解在方法的参数对象上
- 用于从 HTTP 请求中提取参数,可以将请求中的查询参数、表单参数或路径变量映射到方法的参数上
- 例如 @RequestParam(value = "", defaultValue = "", required = true) Integer pageNum
5. @PathVariable
- 注解在方法的参数对象上
- 用于从 URL 路径中提取变量值
- 使用 @RequestrianMapping(value = "/update/{id}", method = RequestMethod.POST) 指定请求路径
- 使用 @PathVariable("id") Long id 从路径中提取 id 的值
- 即 如果路径为 /update/1,那么可获取到 id = 1
6. @RequestPart
- 用于接收文件上传中的文件参数,通常是
multipart/form-data
形式传入的参数
7. @RestController
- 用于表示
controller
层的组件 - 与
@Controller
注解的不同在于,相当于在每个请求处理方法上都添加了@ResponseBody
注解,这些方法都将返回JSON格式数据
(五)配置相关注解
1. @Configuration
- 用于声明一个 Java 形式的配置类,SpringBoot 推荐使用 Java 配置
- 在该类中声明的 Bean 等配置将被 SpringBoot 的组件扫描功能扫描到
2. @EnableAutoConfiguration
- 启用 SpringBoot 的自动化配置,
- 会根据在
pom.xml
添加的依赖和application-dev.yml
中的配置自动创建需要的配置
3. @ComponentScan
- 启用 SpringBoot 的组件扫描功能,将自动装配和注入指定包下的Bean实例
4. @SpringBootApplication
- 用于表示 SpringBoot 应用中的启动类
- 相当于
@EnableAutoConfiguration
、@EnableAutoConfiguration
和@ComponentScan
三个注解的结合体
5. @EnableCaching
- 当添加 Spring Data Redis 依赖之后,可用该注解开启 Spring 基于注解的缓存管理功能
6. @value
- 用于注入在配置文件中配置好的属性
7. @ConfigurationProperties
- 用于批量注入外部配置,以对象的形式来导入指定前缀的配置
8. @Conditional
-
用于表示当某个条件满足时,该组件或 Bean 将被 Spring 容器创建
-
常用的条件注解有:
-
@ConditionalOnBean:当某个 Bean 存在时,配置生效
-
@ConditionalOnMissingBean:当某个 Bean 不存在时,配置生效
-
@ConditionalOnClass:当某个类在 Classpath 存在时,配置生效
-
@ConditionalOnMissingClass:当某个类在 Classpath 不存在时,配置生效
-
(六)数据库事务相关注解
1. @EnableTransactionManagement
- 启用 Spring 基于注解的事务管理功能
- 需要和
@Configuration
注解一起使用
2. @Transactional
- 表示方法和类需要开启事务
- 当作用与类上时,类中所有方法均会开启事务
- 当作用于方法上时,方法开启事务,方法上的注解无法被子类所继承
(七)SpringSecurity相关注解
1. @EnableWebSecurity
- 启用 SpringSecurity 的Web功能
2. @EnableGlobalMethodSecurity
- 启用 SpringSecurity 基于方法的安全功能,
- 当使用
@PreAuthorize
修饰接口方法时,需要有对应权限的用户才能访问
(八)全局异常处理注解
1. @ControllerAdvice
- 常与
@ExceptionHandler
注解一起使用 - 用于捕获全局异常,能作用于所有 controller 中
2. @ExceptionHandler
- 修饰方法时,表示该方法为处理全局异常的方法
(九)AOP相关注解
1. @Aspect
- 用于定义切面,切面是通知和切点的结合,定义了何时、何地应用通知功能
2. @Before
- 表示前置通知(Before)
- 通知方法会在目标方法调用之前执行
- 通知描述了切面要完成的工作以及何时执行
3. @After
- 表示后置通知(After)
- 通知方法会在目标方法返回或抛出异常后执行
4. @AfterReturning
- 表示返回通知(AfterReturning)
- 通知方法会在目标方法返回后执行
5. @AfterThrowing
- 表示异常通知(AfterThrowing)
- 通知方法会在目标方法返回后执行
6. @Around
- 表示环绕通知(Around)
- 通知方法会将目标方法封装起来,在目标方法调用之前和之后执行自定义的行为
7. @Pointcut
- 定义切点表达式,定义了通知功能被应用的范围
8. @Order
- 用于定义组件的执行顺序,在AOP中指的是切面的执行顺序,value属性越低优先级越高
(十)AOP相关注解
1. @SpringBootTest
- 用于指定测试类启用 Spring Boot Test 功能,默认会提供 Mock 环境
2. @Test
- 指定方法为测试方法