目录
@PathVariable //(RESTful)加在参数前,用来获取占位符{}中的值
@RequestParam 参数名和请求参数名称不同时使用,可以设置默认值
@Data //lombok自动提供get set toString hashCode equals
@Accessors(chain = true) //链式编程
@Component @Service @Controller
@MapperScan("cn.tedu.dao")//扫描DAO接口文件所在的包
@Qualifier("helloServiceImplA") //按名称注入
@PropertySource(value = "classpath:/person.properties", encoding = "utf8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@PreAuthorize("hasAuthority('sys:res:createe')")
BCryptPasswordEncoder 密码加密--更安全
UUID.randomUUID().toString().replaceAll("-", "")
setInterval(function(){},1000)
@Override 用来标识重写方法
元注解:
@Target 注解用在哪里:类上、方法上、属性上等等
@Retention 注解的生命周期:源文件中、字节码文件中、运行中
SOURCE 在源文件中有效(即源文件保留)
CLASS 在class文件中有效(即class保留)
RUNTIME 在运行时有效(即运行时保留)
框架注解:
@SpringBootApplication
//标记该类是一个启动类,会进行资源的自动扫描,从启动类当前包,扫描包括当前包以及子包
@ComponentScan与@Component
这一类的注解配合使用,相当于以前xml配置中开启自动扫描的context:component-scan标签,可以配置Spring的扫描范围、Bean的ID命名策略等属性;
@RestController (相当于下面两个注解的作用,接受客户端请求,并作出响应)
@Controller
@ResponseBody 对象-->JSON
- 用户发起请求时,第一步经过前端控制器,
- 但是前端控制器 只负责请求的转发和响应.不做任何业务处理.将请求转发给处理器映射器.
- 处理器映射器接收到前端控制器的请求之后,查询自己维护的服务列表信息.
如果服务列表中没有这个URL的key. 该程序不能处理用户的请求,则返回特定数据,前端控制器接收之后响应用户404.
如果服务列表中有该URL key 则说明请求可以正常执行. 将该方法的对象返回给前端控制器.
- 前端控制器将返回的方法进行接收,但是由于前端控制器只负责转发和响应,不能直接执行该方法.所以交给处理器适配器执行.
- 处理器适配器根据方法的类型(xml配置文件/注解/其他方法),处理器适配器在自己的处理器库中挑选一个最为合适的处理器去执行该方法. 当处理器执行该方法时标识业务开始. 将最终的处理的结果通过ModelAndView对象进行包裹,返回给前端控制器.
ModelAndView: Model: 代表服务器返回的业务数据 View: 服务器端返回的页面的名称
- 视图解析器 将View中的数据进行解析 拼接一个完整的页面路径 前缀/hello后缀
- 视图渲染: 将数据与页面进行绑定. 这样用户就可以在页面中看到具体的数据.
由于现在流行前后端分离. 所以SpringMVC省略了视图解析和视图渲染.只有前5步. 核心注解: @ResponseBody 省略6-7步
@RequestBody JSON串-->对象
@RequestMapping("helloworld") //规定了浏览器访问类的方式
@PathVariable //(RESTful)加在参数前,用来获取占位符{}中的值
@CrossOrigin 跨域的解决方案
@RequestParam 参数名和请求参数名称不同时使用,可以设置默认值
以下注解需要下载lombok插件:
@Data //lombok自动提供get set toString hashCode equals
@NoArgsConstructor //无参构造
@AllArgsConstructor//全参构造
@Accessors(chain = true) //链式编程
XML方式实现IoC:
<!-- 配置一个类的信息 id是bean的唯一标识 class是类的全路径 -->
<!-- 当配置完成时,spring框架自动ioc,帮你new对象
Map<String,Object> - {id = new class()}
Map<String,Object>-{id= Class.forName("cn.tedu.pojo.Hello").newInstance}-->
<bean id="hello" class="cn.tedu.pojo.Hello" />
<bean id="cat" class="cn.tedu.pojo.Cat" />
注解方式实现IoC:
<!-- 注解开发:只需要指定从哪个包开始扫描用了@Component注解的类
自动IoC
base-package需要指定一个包的路径-->
<context:component-scan base-package="cn.tedu.pojo2"/>
@Component @Service @Controller
以上三种注解功能几乎是一样的,可以换着使用。
@Autowired // DI依赖注入
描述两个类的关系
@MapperScan("cn.tedu.dao")//扫描DAO接口文件所在的包
@Qualifier("helloServiceImplA") //按名称注入
/*
1.按照类型注入
按照属性的类型 去Map集合中查找是否有改类型的对象. 如果有则注入.
2.按照名称注入 根据属性的name 去Map集合中查找对应的KEY
*/
@PropertySource(value = "classpath:/person.properties", encoding = "utf8")
让Spring加载该pro文件,指定字符编码为utf8
@Value("${person.name}")
//从Spring容器内部为属性赋值
//spel表达式(spring的el表达式) ${key}
@Mapper
Mybatis为接口创建代理对象,JDK动态代理对象,Spring容器管理
@SpringBootTest
说明:该注解是SpringBoot程序为了简化后端代码测试,提供了专门的测试API
@DateTimeFormat(pattern = "yyyy-MM-dd")
在实体类的日期中所添加的注解,不加默认认为是字符串,不是Date类型
@RestControllerAdvice
定义全局异常的处理类,返回值是一个JSON串
@ExceptionHandler
表示拦截的异常的类型,如果类型匹配,则执行异常方法
@Transactional
事务控制,增删改,用于业务层
属性1: rollbackFor 可以配置特殊的异常类型.遇到某种异常回滚.
属性2: noRollbackFor 可以配置异常类型 遇到某种异常不回滚.
@Configuration
表示这是一个配置类,目的:封装对象,交给Spring容器管理
底层产生一个代理对象
@Bean
描述的是一个方法,将方法的返回值对象,交给Spring容器管理
可以放在@Configuration或者@Component修饰的类里边
@EnableFeignClients
/**
* @EnableFeignClients 注解描述启动类时,用于告诉springboot在启动时,
* 扫描启动类所在包及其子包中的类,假如接口上有@FeignClient注解描述,
* 则对这样的接口创建其实现类,在实现类内部帮我们进行远程服务调用
*/
@FeignClient(name = "服务名")
/**
* 注解用于描述远程服务调用接口,这个借口不需要写实现类,
* 你只需要定义访问规则即可(例如请求方式,请求URL,请求参数)
可能出现错误: . . . . not found:”服务名”
- 服务没有启动,注册表中不存在该服务
- 服务已经启动,有注册信息,需要等待30秒刷新注册表
@RefreshScope
这个注解描述类时,当配置中心的数据发生变化时,会对属性重新初始化
*/
@Aspect
声明该类是一个切面
@Pointcut
定义切入点
@Around
定义环绕通知
@Slf4j
日志
log.debug("Before {}",System.currentTimeMillis()); //{} -- 占位符
log.debug("After {}",System.currentTimeMillis()); //{} -- 占位符
@PreAuthorize("hasAuthority('sys:res:createe')")
表示访问资源需要什么权限
HTTP常见状态码:
500—服务器错误,后端抛异常
后端出错,检查代码
400—坏的请求,(参数类型出错,不匹配)
检查参数类型匹配问题
404—访问地址出错
检查访问路径
503—服务不可用
检查服务存不存在
405—请求资源异常
BUG
BeanInstantiationException
报错原因:添加了mybatis依赖,没有配置数据源或者数据源配置错误。
工具API:
md5明文加密--可被暴力破解
DigestUtils.md5DigestAsHex()
BCryptPasswordEncoder 密码加密--更安全
/**初始化密码加密对象*/
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
UUID
UUID.randomUUID().toString().replaceAll("-", "")
格式化当前时间,返回值为字符串类型
LocalDate.now() --年月日
LocalTime.now() --时分秒
LocalDateTime.now() --年月日时分秒
String nowDate = DateTimeFormatter.ofPattern("yyyy/MM/dd").format(LocalDate.now());
前端定时器
setInterval(function(){},1000)
每隔一秒执行一次该函数