黑马spring boot笔记

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  将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可,外部的切面类也可引用









  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值