@Component //放入IOC容器 @Controller @Service @Repository
@SpringJUnitConfig(value = JavaConfig.class)//指明 配置类,(location = "classpath:spring.xml")也可以指明配置文件
@Test //测试的时候加上 就可以运行
@Autowired //引入IOC容器的对象
@Resource //相比Autowired更不易报错,建议用
@Qualifier(value = "beanId")
//根据 @Qualifier 注解中指定的名称作为 bean 的id进行匹配
@Configuration //表明是 配置类
@ComponentScan(basePackages = "com.atguigu")//扫描包下的注解
@PropertySource(value = "classpath:jdbc.properties")//引入外部配置文件
@Value("${atguigu.url}")//指明声明变量的值为 配置文件的atguigu.url的值
@Bean //会真正让配置类的方法创建的组件存储到IOC容器
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
//作用域,默认单例模式
@Import(value = {JavaConfigurationB.class})//整合配置类
@EnableAspectJAutoProxy // 开启AspectJ的注解 <aop:aspectj-autoproxy />
@Aspect //加上切面才生效
@Order(10)//指定一个优先级的值,值越小,优先级越高!越高的前置先执行,后置后执行
@EnableTransactionManagement // 开启 事务 注解的支持
@Transactional // 添加事务,可放在类或者方法上,表明 类或者方法下有事务
* description:增强类的内部要存储的增强代码
*
* 1.定义方法存储增强代码
* 具体定义几个方法, 根据插入的位置决定!
* 2.使用注解配置 指定插入目标方法的位置
* 前置 @Before
* 后置 @AfterReturning
* 异常 @AfterThrowing
* 最后 @After
* 环绕 @Around
*
* try{
* 前置
* 目标代码执行
* 后置
* }catch(){
* 异常
* }finally{
* 最后
* }
*
* 3.配置切点表达式[选择插入的方法 切点]
* 4.补全注解
* 加入ioc容器 @Component
* 配置切面 @Aspect = 切点 + 增强
*
* spring aop 重点是 配置 -> jdk | cglib
*
* 5.开启aspect注解的支持
*
*/
@EnableAspectJAutoProxy // 开启aspectj的注解 <aop:aspectj-autoproxy />
@Pointcut("execution(* com.atguigu.service.impl.*.*(..))")
public void pc(){}// 切点表达式的提取
@Before("com.atguigu.pointcut.MyPointCut.myAdvicePc()")
@AfterReturning(value = "com.atguigu.pointcut.MyPointCut.myAdvicePc()",returning = "result")
@After("com.atguigu.pointcut.MyPointCut.myAdvicePc()")
@AfterThrowing(value = "com.atguigu.pointcut.MyPointCut.myAdvicePc()",throwing = "throwable")
@Around("com.atguigu.pointcut.MyPointCut.pc()")
TODO: 增强方法中获取目标方法信息
* 1. 全部增强方法中,获取目标方法的信息(方法名,参数,访问修饰符,所属的类的信息...)
* (JoinPoint joinPoint) import org.aspectj.lang.JoinPoint;
* joinPoint 包含目标方法的信息
* 2. 返回的结果 - @AfterThrowing
* (Object result) result接收返回结果
* @AfterReturning(value = "execution(* com..impl.*.*(..))",returning = "形参名")
* 3,异常的信息 - @AfterThrowing
* (Throwable throwable) throwable接收异常信息
* @AfterThrowing(value = "execution(* com..impl.*.*(..))",throwing = "形参名")
*
@Param //这个注解 可以指定多个简单参数的key key = @Param("value值"),key就是名称,不然在mapper文件中取不到
例如:
List<Employee> queryByNameAndSalary(@Param("a") String name, @Param("b") Double salary);
@Data //加上lombok插件和注解 就可以用,作用是为类加上set、get、toString等等方法
@BeforeEach // junit会在每一个@Test方法前执行@BeforeEach方法
@AfterEach // junit会在每一个@Test方法后执行@AfterEach方法
@EnableWebMvc // 相当于给 handlerAdapter配置了json转化器
自动 添加秘书handlerMapping 添加经理handlerAdapter 给经理添加Jacksonjson处理器
@WebServlet("必须使用 / 开头")
@RequestMapping(不必须使用 / 开头)
* 1. 精准地址【 一个 | 多个 】 /user/login {"地址1","地址2"}
* 2. 支持模糊 * 任意一层字符串 | ** 任意一层或多层字符串
* 3. 类上和方法上添加@RequestMapping的区别
* 类上提取通用的访问地址
* 方法上是具体的handler地址
* 访问: 类地址 + 方法地址
* 4. 请求方式指定
* 客户端 -> http(get | post | put | delete) -> ds -> handler
* 默认情况下:@RequestMapping ("login") 只要地址正确 ,任何请求方式都可以访问
* 指定请求方式:method = {RequestMethod.GET,RequestMethod.POST}
* 不符合请求方式: 会出现 405 异常!!!
5.注解进阶 (这些只能使用在方法上)
@GetMapping("xxx") == @RequestMapping(value = "xxx",method = RequestMethod.GET)
@PostMapping("xxx") == @RequestMapping (value = "xxx",method = RequestMethod.POST)
@PutMapping("xxx") == @RequestMapping (value = "xxx",method = RequestMethod.PUT)
@DeleteMapping("xxx")==@RequestMapping(value="xxx",method=RequestMethod.DELEE)
……
@PathVariable | 接收路径参数注解 (接收路径参数时 必须使用的) |
@RequestParam | 用于访问 Servlet 请求参数,包括多部分文件。参数值将转换为声明的方法参数类型。 |
@RequestHeader | 用于访问请求标头。标头值将转换为声明的方法参数类型。 |
@CookieValue | 用于访问Cookie。Cookie 值将转换为声明的方法参数类型。 |
@RequestBody | 用于访问 HTTP 请求正文。正文内容通过使用 HttpMessageConverter 实现转换为声明的方法参数类型。可以单独用 |
是针对请求体的(接请求体中的json数据必须要用RequestBody注解)
@ResponseBody是针对响应体的
@RestController // @RestController = @ResponseBody + @Controller
//@ControllerAdvice和@RestControllerAdvice 代表 全局异常发生,会走此类写的handler
@ControllerAdvice //可以返回逻辑视图 转发和重定向
@RestControllerAdvice // = @ControllerAdvice + @ResponseBody ,直接返回json字符串
@ExceptionHandler(Exception.class)// 如果发生异常 -> ControllerAdvice 注解的类中 -> 根据@ExceptionHandler(指定的异常)比如(ArithmeticException.class) -> 找handler方法
//指定异常 可以精准查找,没有精准匹配的会查父异常
@Validated // 放参数前 让 SpringMVC 在完成数据绑定后执行数据校验的工作。
@Null | 标注值必须为 null |
@NotNull | 标注值不可为 null |
@AssertTrue | 标注值必须为 true |
@AssertFalse | 标注值必须为 false |
@Min(value) | 标注值必须大于或等于 value |
@Max(value) | 标注值必须小于或等于 value |
@DecimalMin(value) | 标注值必须大于或等于 value |
@DecimalMax(value) | 标注值必须小于或等于 value |
@Size(max,min) | 标注值大小必须在 max 和 min 限定的范围内 |
@Digits(integer,fratction) | 标注值值必须是一个数字,且必须在可接受的范围内 |
@Past | 标注值只能用于日期型,且必须是过去的日期 |
@Future | 标注值只能用于日期型,且必须是将来的日期 |
@Pattern(value) | 标注值必须符合指定的正则表达式 |
扩展: | |
| 标注值必须是格式正确的 Email 地址 |
@Length | 标注值字符串大小必须在指定的范围内 |
@NotEmpty | 标注值字符串不能是空字符串 |
@Range | 标注值必须在指定的范围内 |
易混淆:
@NotBlank (字符串,不为null,不为 " " 字符串)
@NotEmpty (集合类型长度大于0)
@NotNull(标准值不可为null)
@CrossOrigin //允许其他源访问我们的controller浏览器大哥就不拦截了 | 前后端分离必须加这个注解,不然前端网址跳转访问时会触发浏览器安全机制(同源策略) (同源策略:比较访问方 和 被访问方的 协议、ip、端口 三个,任何一个不相等都找不到) |