spring框架之学习笔记/复习大纲

Day03-01 知识点


1.在IDEA中通过Git将我们的项目push到Gitee平台
  • 两种方式(没有仓库-share,已有仓库-push)
2.常见问题(FAQ)分析
  • push过程被拒绝(账号不正确或者mail是隐藏账号,仓库名不遵守规则,push时远端仓库有readme)
  • push之前我们前面需要哪些Git操作(add,commit)
  • push时能只push我们指定项目模块吗(不push的模块不要commit)
  • 不同项目可以放到同一个远程仓库(不可以),不同项目不同本地库,也会对应不同远程仓库.
3.通过Git将远端项目克隆(Clone)到本地
  1. 克隆方式(通过idea中clone选项,通过Git Bash工具基于git clone指令)
  2. 常见问题分析(FAQ)分析
    2.1.克隆下来的项目如何运行?(jdk,maven,rebuild,out,mark as source root)
    2.2.克隆的项目可以指定新的名字吗?(可以)
    2.3.直接使用git clone指令克隆下来的项目如何打开?(基于idea菜单中file/open选项)
4.Idea中SpringBoot项目的创建及结构分析
  1. 项目的创建(Spring Initializr-旗舰版,Spring Assistant-社区版,…)
  2. 项目结构分析(pom.xml,src/main/java,src/main/resources,src/test/java,…)
  3. 项目启动过程分析?(thread/io->(Disk->load memory)->Class object->Read and Store Config–>BeanFactory–>Create Instance–>Store Instance)

Day03-02 Spring Boot 工程业务实践初步分析

1.背景分析

Spring Boot工程中是如何对我们自己写的Class进行资源整合和应用的,他在哪些方面做了简化呢?

2.业务初步设计
  1. 创建业务类(例如DefaultCache)
  2. 将业务类交给Spring管理(Spring如何发现这些类)
  3. 从spring中获取对象并进行应用测试(基于单元测试实现)
FAQ?
  1. 创建的业务类对包有要求吗?(需要放在src/java/main目录下,启动类所在包或子包中)
  2. 我们的业务类在交给spring管理时需要如何描述?(借助spring框架中定义的描述bean的注解进行描述)
  3. 为什么我们写类的实例要交给spring管理呢?(Spring可以赋予这个bean对象更多的科学特性)
  4. Springboot工程中的单元测试类编写时有什么要求?(目录,包,注解)
    4.1)目录: src/test/java
    4.2)包: 启动类所在包或子包 (不是src/main/java目录)
    4.3)注解:(@SpringBootTest,@Test-org.junit.jupiter.api.Test)
  5. 如何理解项目中的Has a的关系?(依赖->包含->有一个->在类中有一个其它类型的属性)
  6. 类与类之间的关系我们可以从哪个几个方法着手进行入门理解?(is a,has a ,use a )
    6.1) is a (extends,implements)
    6.2) has a (有一个)
    6.3) use a (使用)
Bug?
  1. NullPointerException(NPE-空指针异常)
  2. UnsatisfiedDependencyException(依赖注入异常)
  3. NoSuchBeanDefinition(没有找到对应的Bean对象)
  4. ParameterResolutionException(参数解析异常-单元测试方法添加参数)
3.总结(Summary)
  1. 通过这个业务入门应用,掌握了SpringBoot中我们自己写类该如何交给Spring管理并且理解了在运行过程中可能出现的一些问题及解决方案
  2. 同时意识springboot工程为我们业务的实现所带来的一些便利(不用我自己关心依赖,没有做基础配置)让我们更多的精力聚焦在了业务的实现上.

Day03-03 Spring Boot 工程中Bean对象的核心特性

1.背景信息
  1. 对于计算机而言,“计算"是它要解决的一个最核心的问题?那如何让计算更加的"高效"和"低耗”
  2. 这也是我们程序员在编程过程中要考虑的一个直接目标.在spring工程中将对象交给spring管理,其目的也是让Spring赋予这些对象更多的科学特性,进而让对象在内存中更加高效和低耗的运行
2.Spring 中Bean的特性分析?

在Spring框架中为我们Bean对象赋予了很多科学特性,例如:

  1. 延迟加载(延迟对象创建)-通过此特性较少资源占用问题(暂时不用的一些大对象,可考虑使用此特性)
  2. 作用域(让对象存储在指定作用域中然后可以重复使用-提高访问性能)
  3. 生周期方法(对象在创建和销毁之前可以对对象进行一些初始化和资源销毁操作)

基于这些特性,可以让我们在sping工程中的对象可以更加高效的解决一些业务问题.

3.Spring 中Bean的特性应用实践?
  1. 创建项目module
  2. 构建一个对象池对象,其类型为ObjectPool?(类似java中字符串池,整数池,线程池,连接池,…)
  3. 通过单元测试类,对对象池进行测试分析
FAQ?
  1. 如何对池对象进行设计才能够更好的让池对象服务于我们的业务?(低耗,高效)
  2. 一般池对象的设计会应用到什么设计模式?(享元模式-重点设计在对象的重用上)
  3. Spring中延迟加载指的是类暂时不加载到内存吗?(不是,类加载到内存后暂时不创建类的实例)
  4. Spring中的延迟加载对象的实例何时创建?(使用时)
  5. Spring中的延迟加载特性重点要解决什么问题?(资源消耗问题)
  6. Spring中对象作用域如何理解?(对象的一个应用范畴问题)
  7. Singleton作用域的类,相同名字的实例在内存中只有一份(会存储到spring的对象池中),可以重用.
  8. Singleton作用域的类如何让其支持延迟加载特性?(使用@Lazy注解描述)
  9. Prototype作用域的类默认支持延迟加载吗?(支持,默认就是使用时创建,无需使用@Lazy注解描述)
  10. Prototype作用域的类的实例是每次从spring框架请求时都会创建吗?会
  11. 程序中的每个对象都有生命周期,但不一定都要定义生命周期方法?正确

Day03-04 Spring Boot 工程中Bean的依赖注入分析

1.背景分析
  1. Spring框架除了要解决对象的资源消耗,对象的应用性能问题,是否还要考虑对象的可维护,可扩展性.
  2. 假如要考虑这个特性,那么该如何实现呢?一般程序中会借助继承或组合实现这样特性,但继承或组合就离不开耦合,如何降低这种耦合呢?
2.Spring 工程中的依赖注入分析?
  • Spring框架作为一个资源整合框架,为了降低类于类之间的耦合,提高其程序的可扩展性,推荐存在耦合时,要尽量耦合于接口或工厂(我们现在项目中对象的创建底层是耦合了Spring的BeanFactory工厂).并由spring框架完成具体值的注入(DI).
3.Spring 工程中依赖注入的业务设计及实现
  1. 创建项目module
  2. 创建业务接口Cache. (com.cy.pj.common.cache.Cache)
  3. 创建业务接口实现类SoftCache,WeakCache.
  4. 定义单元测试类CacheTest,并耦合于Cache接口,然后由spring完成接口值的注入.
FAQ?
  1. @Autowire注解描述属性时,其依赖注入规则是怎样的?
    答:
    1.1. 当spring框架检测到由它管理的bean内部有属性使用了@Autowired注解描述,则会从spring容器中按属性类型查找对应的Bean对象(这个过程叫依赖查找-DL),假如只有一个则直接注入.
    1.2. 假如有多个,还会基于属性名与bean对象的名字进行匹配,假如有匹配的则直接注入,没有匹配则抛出异常(依赖注入异常)
    1.3. 当然我们也可以借助@Qualifier注解配合@Autowired注解使用,指定要注入的bean的名字.

  2. Spring 中的依赖注入(DI)是基于什么技术实现的?
    答:反射技术

  3. Spring 学习过程中有一个设计思想,称之为IOC(控制反转),如何实现控制反转呢?
    答:可以借助DI

Bug分析:
1.NoUniqueBeanDefinitionException (非唯一bean的定义)


homework

自行总结
  1. SpringBoot工程中Bean定义?
  2. SpringBoot工程中Bean对象的特性有哪些?这些特性能带来什么好处?
  3. SpringBoot工程如何实现依赖注入,@Autowired注解描述属性时,其注入规则是怎样的?
  4. springboot工程如何实现hikaricp连接池的整合及应用.

Day04-01 SpringBoot 工程中HikariCP连接池的应用


参考笔记

  1. 背景分析
    我们访问数据库时,需要通过TCP协议与数据库建立连接,连接使用完以后要释放连接,
    TCP协议是一个面向连接的协议,而建立连接需要三次握手,释放连接需要四次挥手,这个
    过程是比较耗时的,假如频繁访问数据库,每次都是直接与数据建立连接,会带来的很大
    的性能问题,对于这样的问题如何解决呢?连接池诞生了.

  2. 什么连接池?
    连接池是池化思想一种应用,基于享元模式做了落地的实现,就是在内存开辟一块区域,存储创建好的连接,让这些连接可以得到重用,进而提高数据库的访问性能.

  3. Java中连接池的实现?
    在java中所有连接池的实现(c3p0,dbcp,druid,hikariCP,…)必须遵守java中的一个设计规范,此规范为javax.sql.DataSource,通过这个规范获取连接池的具体实现,进而取到连接,实现与数据库通讯.

FAQ?
  1. Java中与数据库建立连接需要什么?
    答: 数据库驱动
  2. 这个数据库驱动的设计需要遵守什么规范吗?
    答: JDBC
  3. 当我们通过JDBC API获取到一个连接以后,应用结束我们会将连接返回到池中吗?
    答: 会
  4. 连接池在应用时有什么弊端吗?
    答: 会带来一定的内存开销,以空间换时间
  5. 假如现在让你去设计一个连接池,你会考虑哪些问题?
    5.1)存储结构 (数组->随机访问效率比较高,链表-适合随机插入和删除)
    5.2)算法 (FIFO,FILO,…)
    5.3)线程安全 (锁-锁的粒度会影响性能和并发)
    5.4)参数的设计(最多有多少连接,多余的连接什么时间被释放,…)
4.SpringBoot 工程中HikariCP的入门实现

HikariCP目前号称是世界上性能最好的连接池,在SpringBoot工程中也提供了默认的配置实现.具体应用步骤分析:

  1. 创建项目module
  2. 添加项目依赖(mysql driver,spring data jdbc)
  3. 配置连接参数(url,username,password,…)
  4. 编写单元测试类,对连接池进行单元测试
FAQ?
  1. 程序中DataSource变量在运行时指向的具体对象是谁?
  2. 程序中基于DataSource对象获取连接的基本过程是怎样的?
  3. HikariCP连接产品中具体的连接池对象是谁?
  4. HikariCP连接池的运行性能为什么好,它在哪些方面做了优化?
Bug
  1. SqlException (Access denied for user —>访问被拒绝)
  2. CommunicationException(通讯失败,检查数据库服务是否启动了)
  3. ‘Url’ attribute is not specified (url没有配置或配置错误)
  4. Unknow Host ‘dbgoods’ (检查数据库中是否有dbgoods数据库)
4.SpringBoot 工程中基于HikariCP连接池实现一个JDBC业务
  1. 业务描述?(从数据库将商品信息查询出来并在测试类中做具体输出)
  2. API设计?(GoodsDao,DefaultGoodsDao,GoodsDaoTests)
  3. 时序访问设计?(GoodsDaoTest–>GoodsDao–>DefaultGoodsDao–>DataSource–>HikariDataSource->HikariPool->Connection–>JDBC)
  4. 代码的具体落地实现?(GoodsDao,DefaultGoodsDao,GoodsDaoTests)
  5. 具体JDBC代码实现如下:
    5.1)建立连接(从池中获取Connection对象)
    5.2)创建Statement(基于此对象发送SQL)
    5.3)发送SQL执行查询操作
    5.4)处理查询结果,将结果存储List<Map<String,Object>>
    5.5)释放资源
FAQ?
  1. 数据元对象DataSource从哪里获取?
    答案: 由Spring进行值的注入
  2. 假如DataSource对象的值为null是什么原因?
    答案: 是否有特性注解描述
  3. 结果集映射时,Map中的key是谁?
    答案: 字段名
  4. Map对象存储数据时,key相同,值会覆盖呢?
    答案: 会
  5. HashMap对象中的key是有序的吗?
    答案: 无序,不能保证添加的顺序
  6. 资源释放时有什么规则吗?
    答案: 先创建的后关闭
  7. 你了解什么是元数据吗?
    答案: 描述数据的数据,对于一张表而言元数据就是字段名
  8. 构建JDBC应用时你使用的是规范还是规范的实现?(
    答案: 规范,Connection,Statement,ResultSet,…
Bug?
  1. SQLException?(SQL语法问题)
  2. NullPointerException(空指针异常)

Day04-02 SpringBoot工程中MyBatis框架的应用.

参考笔记

  1. MyBatis 概述
  • 是一个优秀的持久层框架
    持久层:负责将内存中的对象存储到数据库的那一层对象(DAO).
  • 最大的优势?
    能够低成本的快速实现数据库中的数据操作
    2.1)开源 (免费-成本低)
    2.2)简单 (操作步骤,参数映射,结果映射)
    2.4)灵活 (动态SQL-可以更好适配不同需求-for,if,…)
    2.5)稳定 (不会三天两头出错)
  1. MyBatis框架的应用架构?
    1)DAO (自己写的数据访问对象-这个对象中要调用mybatis规范-SqlSession)
    2)MyBatis API(规范,规范的实现-封装了JDBC操作)
    3)JDBC API (规范-Java官方定义)
    4)Driver(JDBC规范的实现-数据库厂商提供其驱动)

  2. SpringBoot工程中MyBatis 应用快速入门?
    1)创建项目module
    2)添加项目依赖(mysql,spring data jdbc,mybatis)
    3)项目初始配置(url,username,password,mapper-locations)
    4)构建单元测试类,对mybatis基础环境做测试分析?(测试类中获取sqlSession对象,基于此对象获取连接)

FAQ?
  1. 如何理解SqlSession?
    答案: mybatis中实现与数据库会话的一个入口对象
  2. 测试过程中SqlSession规范的具体实现是谁?
    答案: SqlSessionTemplate
  3. 测试过程中我们自己创建SqlSessionFactory对象了吗?
    答案: 没有,springboot工程底层创建 -开箱即用
  4. SqlSession对象获取连接时,连接来自哪里?
    答案: HikariDataSource关联的连接池对象

猜你喜欢

转载自blog.csdn.net/weixin_40597409/article/details/112733198
今日推荐