1.maven: 方便的依赖管理 统一的目录结构 标准的项目构建流程 生命周期:必须在同一生命周期中 clean 清理 default 核心。 编译、测试、打包、安装、部署 site 生成报告、发布站点 继承:子工程继承父工程中的配置信息,常见于依赖关系的继承 简化依赖配置、统一管理依赖 <parent>...</parent> 指定打包方式pom(默认jar) 版本锁定: 父工程统一管理依赖版本(dependencyManagement),子工程就无需指定版本号了 自定义属性/引用属性 properties 聚合: 父工程 --> 聚合工程 module 快速构建项目 私服:资源共享 SpringBoot的关系是:Springboot是在Spring的基础之上的拓展,而Spring包含SpringMVC,SpringCloud依赖于SpringBoot开发 2.SpringBoot: 简化 Spring 中繁琐的 XML 配置 起步依赖:Maven的依赖传递 自动配置: 方案一:@ComponentScan组件扫描 繁琐 方案二:@Import导入 使用@Import导入的类会被Spring加载到IOC容器中 导入 普通类 导入 配置类 导入 ImportSelector 接口实现类 @EnableXxxx注解,封装@Import注解 @Conditional 按照一定条件进行判断,满足条件后才会注册对应的bean对象到Spring IOC容器中,在方法或类上 @ConditionalOnClass 是否有对应字节码文件,才注册bean到IOC容器 @ConditionalOnMissingBean 没有对应的bean @ConditionalOnProperty 有对应属性和值 META-INF.spring(注意这里是层级关系的包) --> org.springframework.boot.autoconfigure.AutoConfiguration.imports --> 自动配置的全类名 入门: 1.创建工程,勾选web开发相关依赖 2.创建请求处理类,添加请求处理方法,并添加注解 3.运行启动类 内嵌tomcat Tomcat是一个应用服务器,servlet容器。他可以运行你按照J2EE中的Servlet规范编写好的Java程序。简单的说它是一个Web网站的运行容器,把你写好的网站放进去就可以运行。 DispatcherServlet(Spring boot底层) -- servlet容器,前端控制器 GET -- 请求参数 POST -- 请求体 请求: 简单参数: 1.原始方式:获取请求参数,需要通过HttpServletRequest对象手动获取 2.SpringBoot方式:参数名与形参变量名相同,定义形参即可接收参数 如果方法形参名与请求参数名不匹配,使用@RequestParam完成映射,默认true,所以必须携带该参数 --@RequestParam的属性defaultValue还可用于设置参数的默认值 实体参数: 1.简单实体对象:请求参数名与形参对象属性名相同,定义POJO(实体类)即可 2.复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数 eg:addr.province=sicuan 数组参数:请求参数名与形参数组名相同且请求参数为多个,定义数组类型形参即可接收参数 注:数组输出:Arrays.toString() 集合参数:请求参数名与形参数组名相同且请求参数为多个,@RequestParam绑定参数关系 日期时间类型:使用@DateTimeFormat注解完成日期参数格式转换 json参数(POST请求):JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识 路径参数:通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数 响应: 三层架构:高内聚低耦合 controller(控制层) 接收请求,响应数据 service(业务层) 业务逻辑处理 dao(持久层) 数据访问操作 控制反转IOC:是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。 对象的创建控制权由程序本身转移到外部(容器),无需new对象 依赖注入DI:将实例变量传入到一个对象中去,通过外部来传入依赖的方式。 容器为应用程序提供运行时,所依赖的资源 Bean对象:IOC容器中创建、管理的对象 依赖注入是实现控制反转的一种方式 @Component 将当前类交给IOC容器管理,成为IOC容器中的bean --> 无需new对象,只需注释该代码即可 @Autowired 运行时,IOC容器会提供该类型的bean对象,并赋值给该变量 -- 依赖注入 bean的声明:要把某个对象交给IOC容器处理,需在对应的类加上注解 @Component @Controller @Component的衍生注解,控制器上 @Service @Component的衍生注解,业务类上 @Repository @Component的衍生注解,数据访问类上 @SpringBootApplication具有包扫描作用,默认扫描当前包及其子包 bean的注入: @Autowired 默认按照类型进行,如果存在多个相同类型的bean,会报错 解决: @Primary @Autowired + @Qualifier("bean的名称") @Resource(name="bean的名称") 配置: 命令行参数(--xxx=xxx) > java系统属性(-Dxxx=xxx) > application.properties > application.yml > application.yaml bean作用域: 通过@Scope注解来进行配置作用域 singleton 容器相同 名称 的bean只有一个实例(单例) 默认 在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时) prototype 每次使用该bean时会创建新的实例(非单例) request session application 第三方bean 无法用@Component及衍生注解声明bean,用@Bean 通过@Configuration注解声明一个配置类 ·通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名 ·如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配 3.MyBatis:简化JDBC代码 引入mybatis相关依赖 application.properties -- 数据库的连接信息 @Mapper --> 在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理 数据库连接池 -- 容器,负责分配、管理数据库连接 Druid hikari(默认) lombok -- 通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化代码 @Getter/@Setter 提供get/set方法 @ToString toString方法 @EqualsAndHashCode 重写equals和hashCode @Data @Getter/@Setter + @ToString + @EqualsAndHashCode @NoArgsConstructor 无参构造 @AllArgsConstructor 有参构造 sql注入问题 占位符 #{} -- ? 预编译 不能出现在''内 ${} -- 拼接,可能存在注入问题 #配置mybatis的日志,输出到控制台 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl #开启mybatis的驼峰命名自动映射开关 mybatis.configuration.map-underscore-to-camel-case=true 数据封装: 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装; 若不一致,则不能自动封装 1.起别名:对不一样的列名起别名,别名与实体类属性名一样 2.手动结果映射:通过@Results及@Result进行手动结果映射 3.开启驼峰命名:如果字段名和属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射 mybatis.configuration.map-underscore-to-camel-case=true 新增(主键返回):@Options --> 会自动将生成的主键值赋值给对象对应的属性 XML映射文件: 1.同包同名 2.XML映射文件的namespace属性与Mapper接口全限定名一致 3.映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致 动态SQL: if:使用test属性进行条件判断 <while> -- 关键字,去除不执行的and或or <set> -- 关键字,删除额外的逗号 foreach: collection -- 集合名称 item -- 遍历出来的元素 separator -- 每一次遍历使用的分隔符 open -- 遍历开始前拼接的片段 close -- 遍历结束后拼接的片段 sql-include: sql -- 定义可重用的SQL片段 include -- 通过属性refid,指定包含的sql片段 分页查询插件: PageHelper 4.配置文件: @Value注解常用于外部配置的属性注入, @Value("${配置文件中的key}") yml/yaml : 注意空格 1.定义对象/Map集合: user: name: Tom age: 20 2.定义数组/List/Set hobby: - java - C @ConfigurationProperties(prefix="") @ConfigurationProperties 与 Value: 都是用来注入外部配置的属性的 @Value注解只能一个一个的进行外部属性的注入 @ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中 5.登录校验: 会话技术 ·一次会话可以包含多次请求和响应 ·会话跟踪: 方便在同一次会话的多次请求间共享数据 1.客户端会话跟踪技术:Cookie 请求:Cookie:name=value 响应:Set-Cookie:name=value 优点:HTTP支持 缺点:移动端APP无法使用;不安全,用户可以自己禁用Cookie; 不能跨域 ·第一次响应时设置Cookie,以便后续请求通过该Cookie进行访问 2.服务端:Session 基于Cookie实现 请求:Cookie:JSESSIONID=1 响应:Set-Cookie:JSESSIONID=1 优点:存储在服务器,安全 缺点:服务器集群环境下无法直接使用;Cookie的缺点 3.令牌技术 生成令牌和校验令牌 优点:支持PC端,移动端;解决集群下的认证问题;减轻服务器端存储压力 缺点:需要自己实现 6.JWT: 用于在通信双方以JSON数据格式安全的传输信息 第一部分:Header(头),记录令牌类型、签名算法等 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等 第三部分:Signature(签名),防止Token被篡改,确保安全性。将header、payload加入指定秘钥,通过指定签名算法计算。 生成builder() 解析parse() ·校验时的密钥必须与生成时的密钥一致 ·如果解析时报错,说明JWT令牌被 篡改 或者 失效了,令牌非法 应用:登陆认证 ·生成:登录成功后生成令牌 ·校验:后续每个请求都要携带JWT令牌,系统每次请求处理前都先校验令牌(统一拦截、校验),通过后再处理 7.过滤器Filter: 步骤: 1.定义Filter:定义一个类,实现Filter接口,并重写所有方法 2.配置Filter:Filter类上加@WebFilter注解,配置拦截资源的路径。引导类(即main方法所在类)上加@ServletComponentScan开启Servlet组件支持 doFilter():拦截到请求时调用该方法,可调用多次 拦截路径:/login --> 只拦截/login /login/* --> /login下所有 /* --> 拦截所有 执行流程:请求 --> 放行前逻辑 --> 放行(doFilter) --> 资源 --> 放行后逻辑 过滤器链:配置了多个过滤器 顺序:注解配置的过滤器,优先级是按过滤器类名(字符串)的排序,如AFilter > BFilter 登录校验Filter: 1.获取请求url 2.判断请求url中是否包含login,包含则放行doFilter 3.获取请求头中的令牌(token) <-- 登录时生成的令牌!!! 4.判断令牌是否存在,如果不存在则返回错误结果(未登录) 5.解析token,如果解析失败返回错误结果(未登录) 6.放行 8.拦截器Interceptor: 步骤: 1.定义拦截器,实现HandlerInterceptor接口,并重写方法 2.注册拦截器 preHandle() 目标资源方法执行前执行,返回true放行;返回false不放行 拦截路径: /** 任意级路径 /* 一级路径 addPathPatterns() 需要拦截哪些资源 excludePathPatterns() 不需要拦截哪些资源 Filter和Interceptor: ·接口规范不同:Filter接口、HandlerInterceptor接口 ·拦截规范不同:Filter会拦截所有的资源,Interceptor只会拦截Spring环境中的资源 9.全局异常处理: @RestControllerAdvice @ExceptionHandler 10.事务管理: ·@Transactional 业务层(Service)的方法、类、接口上 ·将当前方法交给Spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回退事务 例子:删除部门后,同时应该删除该部门下的员工。若程序抛出异常,可能导致部门删除但员工未删除。 默认情况下,只有出现RuntimeException才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务 @Transactional(rollbackFor = Exception.class) #开启事务管理日志 logging: level: org.springframework.jdbc.support.JdbcTransactionManager : debug 事务属性: 事务传播行为:当一个事务被另一个事务方法调用时,这个事务方法应如何进行事务控制 REQUIRED 需要事务,有则加入,无则创建新事务(默认) REQUIRES_NEW 需要新事务,无论有无,总是创建新事务。当不希望事务之间互相影响时使用。如日志,无论成功都要记录 SUPPORTS NOT_SUPPORTED MANDATORY NEVER 11.AOP: 面向切面编程,即面向特定方法编程 ·连接点:JoinPoint,可以被AOP控制的方法 ·通知:Advice,指哪些重复的逻辑,即共性功能(最终体现为一个方法) ·切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用 ·切面:Aspect,描述通知与切入点的对应关系(通知+切入点) ·目标对象:Target,通知所应用的对象 @Aspect 连接点: 用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息 通知类型: @Around:环绕通知,在目标方法前、后被执行。 获取连接点信息只能用 ProceedingJoinPoint,调用proceed()让原始方法执行 必须指定Object作为返回值,接收原始方法的返回值 @Before @After @AfterReturning @AfterThrowing 获取连接点信息只能使用JoinPoint,是ProceedingJoinPoint的父类型 通知顺序: 多个切面的切入点都匹配到了目标方法,目标方法运行时多个通知方法都会被执行 ·按类名字母排序(不推荐) ·@Order(数字)加在切面类上来控制顺序 目标方法前,数字小的先执行 目标方法后,数字小的后执行 切入点表达式: execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?) 省略写法:execution(返回值 包名.类名.方法名(方法参数) throws ) 包名.类名. --> 可省,但是不建议 通配符: * 单个独立的任意符号,任意返回值、包名、类名、方法名、任意类型的一个参数 .. 多个连续的任意符号,任意层级的包,任意类型、个数的参数 可以使用 && || ! 来组合表达式 简化 @annotation切入点表达式,用于匹配标识有特定注解的方法 @Retention(RetentionPolicy.RUNTIME) 运行时有效 @Target(ElementType.METHOD) 生效的地方 @PointCut 将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可,外部的切面类也可引用
黑马spring boot笔记
最新推荐文章于 2024-06-16 15:25:15 发布