FrameWork:Git+SpringBoot

Git

Git全局配置

配置用户密码,用于识别提交代码的用户
$ git config --global user.name "your-name"
$ git config --global user.email "your-email@youremail.com" 
检查配置信息
$ git config --list

IDEA项目中本地库配置

对.git目录中的exclude文件进行配置,对指定资源进行过滤

HELP.md
target/
out/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
.gitignore

### maven ###
mvnw
*.cmd
.mvn/

将项目提交到Gitee平台

1)在Gitee平台注册帐号

2)在Idea中安装Gitee插件并配置Gitee帐号

3)将已经执行过commit操作的代码push到gitee平台

远程还没有仓库时?菜单vcs/import into version control/share project on gitee

将Gitee平台上的代码克隆到本地

1)菜单vcs/Get From Version Control

2)在当前Idea窗口或新窗口打开项目

3)配置项目(jdk,maven,build,…)

4)假如是javase项目需要将项目中的src目录转换为sources root(右键src选择mark directory as sources root)

5)假如是maven项目,要将maven项目添加到maven区(可以右键项目中的pom.xml文件,选择add as maven project)

6)右键项目执行rebuild操作(此操作可对项目从新编译)

常见问题分析

1)Commit操作之前你要做什么?

​ 答:add到暂存区

2)Commit时为什么要提交信息?

​ 答:要说明为什么提交这段代码

3)Commit操作执行完成以后,代码的版本信息存哪里去了?

​ 答:本地库

SpringBoot

概述

SpringBoot,全新的Java软件开发框架(脚手架),其设计目的是用来简化Spring项目的初始搭建以及开发过程。该框架使用了特定的注解方式来进行配置,从而使开发人员不在需要大量的xml配置。不在需要大量的手动依赖管理。SpringBoot框架就是要基于快速构建理念,基于约定大于配置方式,实现技术的开箱即用,以提高开发效率

核心特性

起步依赖(Start Dependency)

自动配置(Auto Configuration)

健康检查(Actator)-监控

嵌入式服务(Tomcat,jetty)

SpringBoot启动过程分析

1.png

在启动过程中底层做了哪些事情,大致描述如下:

1)基于线程通过I/O读取磁盘里面的类,将其加载到内存中,此时会基于类创建字节码对象

2)通过字节码对象获取类的配置信息

3)基于类的配置信息进行相应的配置存储(交给spring管理的类的配置)

4)基于类的配置借助BeanFactory创建类的实例(对象),多个对象存储到Map<String,Object>

thread/IO-->load memory-->Class Object-->Read and Store config-->BeanFactory-->Create Instance-->Store Instance

Spring注解

@SpringBootApplication//注解:描述的类为springboot工程启动类,这个启动类会通过@SpringBootApplication注解告诉springboot工程项目在启动时要做哪些基础操作
@Component//为spring框架中定义的用于描述一般bean对象的一个注解
//SpringBoot工程在启动时会自动扫描启动类所在的包以及子包中的类,并读取这些类的描述,假如这些类使用了类似@Component这样的注解描述,他会交给spring管理
@SpringBootTest//SpringBoot工程中的单元测试类需要使用@SpringBootTest注解进行描述
@Autowired//spring中可以借助@Autowired注解描述属性,用于告诉spring这个属性的值由spring注入
@Scope("singleton")//默认作用域为单例作用域,此作用域通常会配合延迟加载使用
@Lazy//延迟对象的实例的创建,用的时候在去创建
@Scope("prototype")//多例作用域,每次从spring请求类的实例都会创建新的对象
@Qualifier(" ")//需要配合AutoWired注解使用,不能单独使用,用于指定要注入的bean的值
@Repository//此注解一般用于描述数据逻辑层的具体实现对象,此对象要交给spring管理
@Mapper//描述数据逻辑层接口,告诉Mybatis框架这个接口的实现类,由mybatis创建,并将其实现类的对象交给spring管理,Spring会为他管理的这个bean起个名字,默认为接口名,然后首字母小写

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

背景分析

Spring框架除了要解决对象的资源消耗,对象的应用性能问题,是否还要考虑对象的可维护,可扩展性。假如要考虑这个特性,那么该如何实现呢?一般程序中会借助继承或组合实现这样特性,但继承或组合就离不开耦合,如何降低这种耦合呢?

Spring工程中的依赖注入分析

Spring框架作为一个资源整合框架,为了降低类与类之间的耦合,提高程序的可扩展性,推荐存在耦合时,要尽量耦合与接口或工厂

SpringBoot整合HikariCP

数据库连接池

背景分析

开发过程中应用程序与数据库交互时,“获得连接”或“释放连接”是非常消耗系统资源的两个过程,频繁地进行数据库连接的建立和关闭会极大影响系统的性能,若多线程并发量很大,这样耗时的数据库连接就可能让系统变得卡顿。因为TCP连接的创建开支十分昂贵,并且数据库所能承载的TCP并发连接数也有限制,针对这种场景,数据库连接池应运而生。

连接池原理分析

在系统初始化的时候,在内存中开辟一片空间,将一定数量的数据库连接作为对象存储在对象池里,并对外提供数据库连接的获取和归还方法。用户访问数据库时,并不是建立一个新的连接,而是从数据库连接池中取出一个已有的空闲连接对象;使用完毕归还后的连接也不会马上关闭,而是由数据库连接池统一管理回收,为下一次借用做好准备。如果由于高并发请求导致数据库连接池中的连接被借用完毕,其他线程就会等待,直到有连接被归还。整个过程中,连接并不会关闭,而是源源不断地循环使用,有借有还。数据库连接池还可以通过设置其参数来控制连接池中的初始连接数、连接的上下限数,以及每个连接的最大使用次数、最大空闲时间等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

Java中的连接池

Java官方,为了在应用程序中更好的应用连接池技术,定义了一套数据源规范,例如
javax.sql.DataSource接口,基于这个接口,很多团队或个人创建了不同的连接池对象。然后我们的应用程序中通过耦合与DataSource接口,便可以方便的切换不同厂商的连接池。Java项目中通过连接池获取连接的一个基本过程,如下图所示:

2.png

在上图中,用户通过DataSource对象的getConnection()方法,获取一个连接。假如池中有连接,则直接将连接返回给用户。假如池中没有连接,则会调用Dirver(驱动,由数据库厂商进行实现)对象的connect方法从数据库获取,拿到连接以后,可以将连接在池中放一份,然后将连接返回给调用方。连接需求方再次需要连接时,可以从池中获取,用完以后再还给池对象。

数据库连接池的优点

资源重用更佳

由于数据库连接得到复用,减少了大量创建和关闭连接带来的开销,也大大减少了内存碎片和数据库临时进程、线程的数量,使得整体系统的运行更加平稳。

系统调优更简便

使用了数据库连接池以后,由于资源重用,大大减少了频繁关闭连接的开销,大大降低了TIME_WAIT的出现频率。

系统响应更快

数据库连接池在应用初始化的过程中一般都会提前准备好一些数据库连接,业务请求可以直接使用已经创建的连接,而不需要等待创建连接的开销。初始化数据库连接配合资源重用,使得数据库连接池可以大大缩短系统整体响应时间。

连接管理更灵活

数据库连接池作为一款中间件,用户可以自行配置连接的最小数量、最大数量、最大空闲时间、获取连接超时间、心跳检测等。另外,用户也可以结合新的技术趋势,增加数据库连接池的动态配置、监控、故障演习等一系列实用的功能。

SpringBoot整合Mybatis

Mybatis最大的优势?

能够低成本的快速实现数据库中的数据操作

开源(免费-成本低)

简单(操作步骤,参数映射,结果映射)

灵活(动态SQL-可以更好适配不同需求-for,if…)

稳定(不会三天两头出错)

Mybatis概述

Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的基础上做了封装和优化,它借助灵活的SQL定制,参数及结果集的映射方式,更好的适应了当前互联网技术的发展。Mybatis框架的简单应用架构如图所示:

3.png

在SpringBoot脚手架工程中,Spring框架会基于MyBatis框架底层配置,创建SqlSessionFactory对象,然后再通过此工厂对象创建SqlSession,最后基于Springku框架为测试类注入SqlSession对象,接下来,我们可以通过SqlSession对象实现与数据库的会话了。

4.png

常见问题分析

1)为什么说建立连接和释放连接是一个耗时操作?

​ 答:TCP–>3次握手,四次挥手

2)Java中连接池的规范是什么?

​ 答:DataSource

3)从HikariCP中获取连接的过程?

​ 答:DataSource–>HikariCPPool–?ConcurrentBag–>CopyOnWriteArrayList–>…

4)MyBatis框架实现与数据库交互的入口对象?

​ 答:SqlSession

5)SqlSession对象是如何创建的?

​ 答:SqlSessionFactory

6)具体的SqlSession对象?

​ 答:DafultSqlSession(线程不安全) SqsSessionTemplate(安全)

7)Mybatis为我们的Dao接口创建的实现类及其方法内部做了什么?

​ 答:获取sqlSession对象

​ 获取sql映射的key信息(namespace,elementID)

​ 基于statement获取sql映射信息(底层是存储在了MapperdStatement对象中)

​ 基于sqlSession以及sql实现与数据库的会话

8)数据层接口(XxxDao)可以有多个实现类吗?

​ 答:可以,但是需要时注入那个需要我们进行设计

9)业务类中使用的日志API是谁?

​ 答:org.slf4j.Logger

10)日志API的应用中使用到了什么设计模式?

​ 答:门面模式

11)日志的级别?

​ 答:trace,debug,info,error

12)日志可以记录到文件吗?如何配置?

​ 答:可以,loggin.file.path

13)为什么要将日志的记录放到商品业务逻辑对象中?

​ 答:日志记录本身就属于一个业务

14)如何对池对象进行设计才能够更好的让池对象服务于我们的业务?

​ 答:低耗,高效

15)一般池对象的设计会应用到什么设计模式?

​ 答:享元模式-重点设计在对象的重用上

16)Spring中延迟加载指的是类暂时不加载到内存吗?

​ 答:步是,类加载到内存后暂时不创建类的实例

17)Spring中的延迟加载对象的实例是何时创建?

​ 答:使用时

18)Spring中的延迟加载特性重点要解决什么问题?

​ 答:资源消耗问题

19)Spring中对象作用域如何理解?

​ 答:对象的一个应用范畴问题

20)Singleton作用域的类,相同名字的实例在内存中只有一份(会存储到spring的对象池中),可以重用

21)Singleton作用域的类如何让其支持延迟加载特性?

​ 答:使用@Lazy注解描述

22)Prototype作用域的类如何让默认支持延迟加载吗?

​ 答:支持,默认就是使用时创建,无需使用@Lazy注解描述

23)Prototype作用域的类是实例是每次从spring框架请求时都会创建吗?

​ 答:会

24)程序中的每个对象都有生命周期,但不一定都要定义生命周期方法?

​ 答:正确

25)@Autowired注解描述属性时,其依赖注入规则是怎样的?

​ 答:当Spring框架检测到由它管理的bean内部有属性使用了@Autowired注解描述,则会从spring容器中按属性类型查找对应的Bean对象(这个过程叫依赖查找-DL),假如只有一个则直接注入,假如有多个,还会基于属性名名域bean对象的名字进行匹配,假如由匹配的则直接注入,没有匹配则抛出异常(依赖注入异常),当然我们也可以借助@Qualifier注解配合@Autowired注解使用,指定要注入的bean的名字

26)Spring中的依赖注入(DI)是基于什么技术实现的?

​ 答:反射技术

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

28)假如现在让你去设计一个连接池,你会考虑哪些问题?

​ 答:存储结构(数组–>随机访问效率比较高,链表–>适合随即插入和删除)

​ 算法(FIFO,FILO,…)

​ 线程安全(锁-锁的粒度会影响性能和并发)

​ 参数的设计(最多由多少连接,多余的连接什么时间释放)

29)属于元对象DataSource从哪里获取?

​ 答:由Spring进行值的注入

30)假如DataSource对象的值为null是什么原因?

​ 答:是否由特性注解描述

31)结果集映射时,Map中的key是谁?

​ 答:字段名

32)Map对象存储数据时,key相同,值会覆盖吗?

​ 答:会

33)HashMap对象中的key是有序的吗?

​ 答:无序,不能保证添加的顺序

34)资源释放时由上面规则吗?

​ 答:先创建的后关闭

35)什么是元数据?

​ 答:描述数据的数据,对于一张表而言,元数据就是字段名

36)构建JDBC应用时使用的是规范还是规范的实现?

​ 答:规范,Connection,Statement,ResultSet

37)SqlSession规范的具体实现是谁?

​ 答:SqlSessionTemplate

38)我们自己创建SqlSessionFactory对象了吗?

​ 答:没有,springboot工程底层创建-开箱即用

39)SqlSession对象获取连接时,连接来自哪里?

​ 答:HikariDataSource关联的连接池对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值