元注解:修饰注解的注解
@Target(ElementType.位置)
作用:声明被修饰的注解只能在哪些位置使用,属于空间范畴
位置:
- TYPE,类,接口
- FIELD,成员变量
- METHOD,成员方法
- PARAMETER,方法参数
- CONSTRUCTOR,构造器
- LOCAL_VARIABLE,局部变量
@Retention(RetentionPolicy.保留周期)
作用:声明注解的保留周期,属于时间范畴
保留周期:
- SOURCE: 只作用在源码阶段,字节码文件中不存在
- CLASS(默认值): 保留到字节码文件阶段,运行阶段不存在
- RUNTIME(开发常用): 一直保留到运行阶段。
Spring
@ComponentScan(“com.itheima”)
标注在主配置类上,用于声明包扫描的范围
控制反转(IOC)
Bean 的创建
标注在自己开发的类上,用于将当前类对象放入Spring容器:
@Controller:在表示层类上使用
@Service:在业务层类上使用
@Repository:在持久层类上使用
@Component:在不属于三层的类上使用
Bean的作用域
标注在类上,声明对象是单例还是多例:
- @Scope(“singleton”):创建单例对象
- @Scope(“prototype”):创建多例对象
@Lazy 延迟对象创建时机
依赖注入
@Autowired
标注在属性上,表示自动依赖注入,用于从Spring容器中获取属性的值,Spring会根据被标注对象的类型自动从IOC容器中查找
- 如果找不到,就会报错 NoSuchBeanDefinitionException
- 如果恰好找到一个,就会自动完成依赖注入
- 如果找到了多个,也会报错 NoUniqueBeanDefinitionException
@Qualifier
- 依赖注入时,根据一个接口查到了多个对象,使用这两个注解确定使用哪个对象
- 标注在要赋值的属性上,代表在按照类型匹配的基础上,再按照指定名称匹配
- 注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用
@Primary
- 依赖注入时,根据一个接口查到了多个对象,使用这两个注解确定使用哪个对象
- @Primary标注在实现类上,表示当一个接口有多个实现的类时,默认使用哪个作为主实现
- 注意:在同一个接口下,不能同时在多个实现类设置
第三方Bean
@Bean
写在方法上,表示将该方法的返回对象添加到Spring容器中,Bean的名称默认是方法名
@Configuration
写在配置类上,表示该类是一个配置类,Spring在启动的时候会自动扫描加载类中的配置
测试类优化
@RunWith(SpringJUnit4ClassRunner.class)
帮我们启动Spring容器
//等价于
// 1.读取配置类中的配置信息,然后启动spring容器
AnnotationConfigApplicationContext act =
new AnnotationConfigApplicationContext(SpringConfig.class);
@ContextConfiguration(classes = SpringConfig.class)
指定配置类
Spring AOP
@EnableAspectJAutoProxy :激活切面自动代理
写在配置类中
@PointCut:切入点表达式
- 作用:主要用来决定项目中的哪些方法需要加入通知
- 常见形式:
- execution(……):根据方法的签名来匹配
- @annotation(……) :根据注解匹配
@Aspect:定义切面类,加上@Component注解
@Order:主要用来控制配置类的加载顺序
通知类型(前四个和后边的环绕通知互斥,直接用环绕通知就可以)
@Before:前置通知
此注解标注的通知方法在目标方法前被执行
@AfterReturning: 返回后通知
此注解标注的通知方法在目标方法后被执行,有异常不会执行
@AfterThrowing: 异常后通知
此注解标注的通知方法发生异常后执行
@After:后置通知
此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行
@Around环绕通知
需要自己调用 ProceedingJoinPoint.proceed() 来让原始方法执行,其他通知不需要考虑目标方法执行
@Around环绕通知方法的返回值,必须指定为Object,来接收原始方法的返回结果
事务管理
@Transactional
位置:业务(service)层的方法上、类上、接口上
作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务
SpringMvc
Controller类上
@Controller
- 标注在表示层,Spring会使用注解标注的类创建出对象,然后放入容器
- 简化:@RestController = @Controller + @ResponseBody ;所以可以直接使用@RestController
@ResponseBody
- 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合 ,将会转换为JSON格式响应
- 位置:Controller方法上/类上(如果标在类上,代表类中所有方法上都生效)
- 简化:@RestController = @Controller + @ResponseBody ;
所以可以直接使用@RestController
@RestController
@RestController
中包含5个注解,所以可以直接省略@Controller
和@ResponseBody
注解
方法上+类上
@RequestMapping:用于映射web请求,包括访问路径和参数
- 位置: 方法 类
- @RequestMapping(value = “/user/demo1”,method = RequestMethod.GET
- 属性:
- value: 等同于path,用于为当前方法绑定访问路径
- method:用于限制请求类型,如果省略此选项,代表不对请求类型做限制
- 注意:此注解也可以标注在类上,代表类中的所有方法都可以共用一段URL
Restful风格接口:根据请求类型使用不同的注解
@PostMapping
用于增加信息
@PutMapping
用于更改信息
@GetMapping
用于查询信息
@DeleteMapping
用于删除信息
接收参数
@RequestParam :集合
1. 场景1:使用List或者Set接收参数的时候
请求参数名与形参集合名称相同且请求参数为多个,使用@RequestParam
绑定参数关系
** 2.场景2:接收参数名和URL路径中参数不一样的时候**
** 3.场景3:给参数设置默认值**
@DateTimeFormat:日期参数格式转换
@RequestBody :请求体中json
- SpringMVC也可以接收请求体中的json字符串为参数,并且自动封装为指定对象
- 使用
@RequestBody
标注请求参数之前,表示从请求体中接收json
参数,并且封装到指定的对象@RequestBody
只能标注在对象或者是一个Map
前面
@PathVariable:路径参数
- @PathVariable: 通过请求路径传入参数
- 步骤:
- 1)请求路径上使用{}占位
- 2)使用@PathVariable将占位符位置的数据赋值到指定的参数
全局异常处理
@RestControllerAdvice
标注在类上,声明当前类是一个用于专门处理异常的类
@ExceptionHandler
标注在方法上,声明当前方法可以处理哪些异常
SpringBoot
定时任务控制
@Scheduled
@Scheduled注解是Spring Boot提供的用于定时任务控制的注解,主要用于控制任务在某个指定时间执行,或者每隔一段时间执行。
@Scheduled
需要配合@EnableScheduling
使用。使用时,将@Scheduled
注解放在待定时的方法名上方,将@EnableScheduling
放在项目主启动类类名上方。
@Scheduled
主要有三种配置执行时间的方式:cron、fixedRate
和fixedDelay
。
**关于fixedRate
和 **fixedDelay
的区别:
fixedRate
** 的间隔时间是上次任务开始后,开始计算时间间隔,达到指定时间间隔后,开始执行下一次任务;**- 而
fixedDelay
的间隔时间是上次任务结束后,开始计算时间间隔,达到指定时间间隔后,开始执行下一次任务。cron
是@Scheduled
的一个参数,是一个字符串,以空格隔开。
cron表达式格式:
@Scheduled(cron = "{秒数} {分钟} {小时} {日期} {月份} {星期}")
“30 10 1 20 10 ? 2011” 2011年10月20号1点10分30秒触发任务
“30 10 1 ? 10 * 2011” 2011年10月每天1点10分30秒触发任务
自动生成构造方法
@RequiredArgsConstructor
@RequiredArgsConstructor
是一个Lombok提供的注解,用于自动生成构造函数。- 基于构造方法为属性赋值,容器通过调用类的构造方法将其进行依赖注入.
- 可以用来代替@Autowired注解注入
- 声明的变量必须加上final修饰
- 区别:
- @Autowired :
- @RequiredArgsConstructor:
- 先在
controller
类上添加注解:
- 用到的时候可以直接
SpringCloud
Feign
@EnableFeignClients
- 在启动类中使用,用于启用 Feign 客户端的功能
- 会自动扫描指定的包和子包,查找所有标记了 `@FeignClient 的接口
basePackages
** 属性:用来指定要扫描的基础包或类**- 可以与 @Configuration 注解一起使用,允许你在同一个类中定义配置和启用 Feign 客户端。
@FeignClient
- 用于标记一个接口作为 Feign 客户端。
- 可以在该注解中指定服务名(
**name**
)、服务路径(path
)等信息。
Conditional 系列注解
此系列注解为按照条件判断
@ConditionalonClass()
- 该注解可以用在类及方法上;类指的是标有@Configuration的类,方法是标有@Bean的方法
- @ConditionalOnClass注解的作用是当项目中存在某个类时才会使标有该注解的类或方法生效
- 属性: name属性,name属性指定的是全限类名,也就是包含包名+类名