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)到本地
- 克隆方式(通过idea中clone选项,通过Git Bash工具基于git clone指令)
- 常见问题分析(FAQ)分析
2.1.克隆下来的项目如何运行?(jdk,maven,rebuild,out,mark as source root)
2.2.克隆的项目可以指定新的名字吗?(可以)
2.3.直接使用git clone指令克隆下来的项目如何打开?(基于idea菜单中file/open选项)
4.Idea中SpringBoot项目的创建及结构分析
- 项目的创建(Spring Initializr-旗舰版,Spring Assistant-社区版,…)
- 项目结构分析(pom.xml,src/main/java,src/main/resources,src/test/java,…)
- 项目启动过程分析?(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.业务初步设计
- 创建业务类(例如DefaultCache)
- 将业务类交给Spring管理(Spring如何发现这些类)
- 从spring中获取对象并进行应用测试(基于单元测试实现)
FAQ?
- 创建的业务类对包有要求吗?(需要放在src/java/main目录下,启动类所在包或子包中)
- 我们的业务类在交给spring管理时需要如何描述?(借助spring框架中定义的描述bean的注解进行描述)
- 为什么我们写类的实例要交给spring管理呢?(Spring可以赋予这个bean对象更多的科学特性)
- Springboot工程中的单元测试类编写时有什么要求?(目录,包,注解)
4.1)目录: src/test/java
4.2)包: 启动类所在包或子包 (不是src/main/java目录)
4.3)注解:(@SpringBootTest,@Test-org.junit.jupiter.api.Test) - 如何理解项目中的Has a的关系?(依赖->包含->有一个->在类中有一个其它类型的属性)
- 类与类之间的关系我们可以从哪个几个方法着手进行入门理解?(is a,has a ,use a )
6.1) is a (extends,implements)
6.2) has a (有一个)
6.3) use a (使用)
Bug?
- NullPointerException(NPE-空指针异常)
- UnsatisfiedDependencyException(依赖注入异常)
- NoSuchBeanDefinition(没有找到对应的Bean对象)
- ParameterResolutionException(参数解析异常-单元测试方法添加参数)
3.总结(Summary)
- 通过这个业务入门应用,掌握了SpringBoot中我们自己写类该如何交给Spring管理并且理解了在运行过程中可能出现的一些问题及解决方案
- 同时意识springboot工程为我们业务的实现所带来的一些便利(不用我自己关心依赖,没有做基础配置)让我们更多的精力聚焦在了业务的实现上.
Day03-03 Spring Boot 工程中Bean对象的核心特性
1.背景信息
- 对于计算机而言,“计算"是它要解决的一个最核心的问题?那如何让计算更加的"高效"和"低耗”
- 这也是我们程序员在编程过程中要考虑的一个直接目标.在spring工程中将对象交给spring管理,其目的也是让Spring赋予这些对象更多的科学特性,进而让对象在内存中更加高效和低耗的运行
2.Spring 中Bean的特性分析?
在Spring框架中为我们Bean对象赋予了很多科学特性,例如:
- 延迟加载(延迟对象创建)-通过此特性较少资源占用问题(暂时不用的一些大对象,可考虑使用此特性)
- 作用域(让对象存储在指定作用域中然后可以重复使用-提高访问性能)
- 生周期方法(对象在创建和销毁之前可以对对象进行一些初始化和资源销毁操作)
基于这些特性,可以让我们在sping工程中的对象可以更加高效的解决一些业务问题.
3.Spring 中Bean的特性应用实践?
- 创建项目module
- 构建一个对象池对象,其类型为ObjectPool?(类似java中字符串池,整数池,线程池,连接池,…)
- 通过单元测试类,对对象池进行测试分析
FAQ?
- 如何对池对象进行设计才能够更好的让池对象服务于我们的业务?(低耗,高效)
- 一般池对象的设计会应用到什么设计模式?(享元模式-重点设计在对象的重用上)
- Spring中延迟加载指的是类暂时不加载到内存吗?(不是,类加载到内存后暂时不创建类的实例)
- Spring中的延迟加载对象的实例何时创建?(使用时)
- Spring中的延迟加载特性重点要解决什么问题?(资源消耗问题)
- Spring中对象作用域如何理解?(对象的一个应用范畴问题)
- Singleton作用域的类,相同名字的实例在内存中只有一份(会存储到spring的对象池中),可以重用.
- Singleton作用域的类如何让其支持延迟加载特性?(使用@Lazy注解描述)
- Prototype作用域的类默认支持延迟加载吗?(支持,默认就是使用时创建,无需使用@Lazy注解描述)
- Prototype作用域的类的实例是每次从spring框架请求时都会创建吗?会
- 程序中的每个对象都有生命周期,但不一定都要定义生命周期方法?正确
Day03-04 Spring Boot 工程中Bean的依赖注入分析
1.背景分析
- Spring框架除了要解决对象的资源消耗,对象的应用性能问题,是否还要考虑对象的可维护,可扩展性.
- 假如要考虑这个特性,那么该如何实现呢?一般程序中会借助继承或组合实现这样特性,但继承或组合就离不开耦合,如何降低这种耦合呢?
2.Spring 工程中的依赖注入分析?
- Spring框架作为一个资源整合框架,为了降低类于类之间的耦合,提高其程序的可扩展性,推荐存在耦合时,要尽量耦合于接口或工厂(我们现在项目中对象的创建底层是耦合了Spring的BeanFactory工厂).并由spring框架完成具体值的注入(DI).
3.Spring 工程中依赖注入的业务设计及实现
- 创建项目module
- 创建业务接口Cache. (com.cy.pj.common.cache.Cache)
- 创建业务接口实现类SoftCache,WeakCache.
- 定义单元测试类CacheTest,并耦合于Cache接口,然后由spring完成接口值的注入.
FAQ?
-
@Autowire注解描述属性时,其依赖注入规则是怎样的?
答:
1.1. 当spring框架检测到由它管理的bean内部有属性使用了@Autowired注解描述,则会从spring容器中按属性类型查找对应的Bean对象(这个过程叫依赖查找-DL),假如只有一个则直接注入.
1.2. 假如有多个,还会基于属性名与bean对象的名字进行匹配,假如有匹配的则直接注入,没有匹配则抛出异常(依赖注入异常)
1.3. 当然我们也可以借助@Qualifier注解配合@Autowired注解使用,指定要注入的bean的名字. -
Spring 中的依赖注入(DI)是基于什么技术实现的?
答:反射技术 -
Spring 学习过程中有一个设计思想,称之为IOC(控制反转),如何实现控制反转呢?
答:可以借助DI
Bug分析:
1.NoUniqueBeanDefinitionException (非唯一bean的定义)
homework
自行总结
- SpringBoot工程中Bean定义?
- SpringBoot工程中Bean对象的特性有哪些?这些特性能带来什么好处?
- SpringBoot工程如何实现依赖注入,@Autowired注解描述属性时,其注入规则是怎样的?
- springboot工程如何实现hikaricp连接池的整合及应用.
Day04-01 SpringBoot 工程中HikariCP连接池的应用
-
背景分析
我们访问数据库时,需要通过TCP协议与数据库建立连接,连接使用完以后要释放连接,
TCP协议是一个面向连接的协议,而建立连接需要三次握手,释放连接需要四次挥手,这个
过程是比较耗时的,假如频繁访问数据库,每次都是直接与数据建立连接,会带来的很大
的性能问题,对于这样的问题如何解决呢?连接池诞生了. -
什么连接池?
连接池是池化思想一种应用,基于享元模式做了落地的实现,就是在内存开辟一块区域,存储创建好的连接,让这些连接可以得到重用,进而提高数据库的访问性能. -
Java中连接池的实现?
在java中所有连接池的实现(c3p0,dbcp,druid,hikariCP,…)必须遵守java中的一个设计规范,此规范为javax.sql.DataSource,通过这个规范获取连接池的具体实现,进而取到连接,实现与数据库通讯.
FAQ?
- Java中与数据库建立连接需要什么?
答: 数据库驱动 - 这个数据库驱动的设计需要遵守什么规范吗?
答: JDBC - 当我们通过JDBC API获取到一个连接以后,应用结束我们会将连接返回到池中吗?
答: 会 - 连接池在应用时有什么弊端吗?
答: 会带来一定的内存开销,以空间换时间 - 假如现在让你去设计一个连接池,你会考虑哪些问题?
5.1)存储结构 (数组->随机访问效率比较高,链表-适合随机插入和删除)
5.2)算法 (FIFO,FILO,…)
5.3)线程安全 (锁-锁的粒度会影响性能和并发)
5.4)参数的设计(最多有多少连接,多余的连接什么时间被释放,…)
4.SpringBoot 工程中HikariCP的入门实现
HikariCP目前号称是世界上性能最好的连接池,在SpringBoot工程中也提供了默认的配置实现.具体应用步骤分析:
- 创建项目module
- 添加项目依赖(mysql driver,spring data jdbc)
- 配置连接参数(url,username,password,…)
- 编写单元测试类,对连接池进行单元测试
FAQ?
- 程序中DataSource变量在运行时指向的具体对象是谁?
- 程序中基于DataSource对象获取连接的基本过程是怎样的?
- HikariCP连接产品中具体的连接池对象是谁?
- HikariCP连接池的运行性能为什么好,它在哪些方面做了优化?
Bug
- SqlException (Access denied for user —>访问被拒绝)
- CommunicationException(通讯失败,检查数据库服务是否启动了)
- ‘Url’ attribute is not specified (url没有配置或配置错误)
- Unknow Host ‘dbgoods’ (检查数据库中是否有dbgoods数据库)
4.SpringBoot 工程中基于HikariCP连接池实现一个JDBC业务
- 业务描述?(从数据库将商品信息查询出来并在测试类中做具体输出)
- API设计?(GoodsDao,DefaultGoodsDao,GoodsDaoTests)
- 时序访问设计?(GoodsDaoTest–>GoodsDao–>DefaultGoodsDao–>DataSource–>HikariDataSource->HikariPool->Connection–>JDBC)
- 代码的具体落地实现?(GoodsDao,DefaultGoodsDao,GoodsDaoTests)
- 具体JDBC代码实现如下:
5.1)建立连接(从池中获取Connection对象)
5.2)创建Statement(基于此对象发送SQL)
5.3)发送SQL执行查询操作
5.4)处理查询结果,将结果存储List<Map<String,Object>>
5.5)释放资源
FAQ?
- 数据元对象DataSource从哪里获取?
答案: 由Spring进行值的注入 - 假如DataSource对象的值为null是什么原因?
答案: 是否有特性注解描述 - 结果集映射时,Map中的key是谁?
答案: 字段名 - Map对象存储数据时,key相同,值会覆盖呢?
答案: 会 - HashMap对象中的key是有序的吗?
答案: 无序,不能保证添加的顺序 - 资源释放时有什么规则吗?
答案: 先创建的后关闭 - 你了解什么是元数据吗?
答案: 描述数据的数据,对于一张表而言元数据就是字段名 - 构建JDBC应用时你使用的是规范还是规范的实现?(
答案: 规范,Connection,Statement,ResultSet,…
Bug?
- SQLException?(SQL语法问题)
- NullPointerException(空指针异常)
Day04-02 SpringBoot工程中MyBatis框架的应用.
- MyBatis 概述
- 是一个优秀的持久层框架
持久层:负责将内存中的对象存储到数据库的那一层对象(DAO). - 最大的优势?
能够低成本的快速实现数据库中的数据操作
2.1)开源 (免费-成本低)
2.2)简单 (操作步骤,参数映射,结果映射)
2.4)灵活 (动态SQL-可以更好适配不同需求-for,if,…)
2.5)稳定 (不会三天两头出错)
-
MyBatis框架的应用架构?
1)DAO (自己写的数据访问对象-这个对象中要调用mybatis规范-SqlSession)
2)MyBatis API(规范,规范的实现-封装了JDBC操作)
3)JDBC API (规范-Java官方定义)
4)Driver(JDBC规范的实现-数据库厂商提供其驱动) -
SpringBoot工程中MyBatis 应用快速入门?
1)创建项目module
2)添加项目依赖(mysql,spring data jdbc,mybatis)
3)项目初始配置(url,username,password,mapper-locations)
4)构建单元测试类,对mybatis基础环境做测试分析?(测试类中获取sqlSession对象,基于此对象获取连接)
FAQ?
- 如何理解SqlSession?
答案: mybatis中实现与数据库会话的一个入口对象 - 测试过程中SqlSession规范的具体实现是谁?
答案: SqlSessionTemplate - 测试过程中我们自己创建SqlSessionFactory对象了吗?
答案: 没有,springboot工程底层创建 -开箱即用 - SqlSession对象获取连接时,连接来自哪里?
答案: HikariDataSource关联的连接池对象