AM
SpringBoot运行原理分析

@Autowired注解应用规则?
1.直接描述变量
2.描述set方法(通常配合无参构造函数使用)
3.描述有参构造,在描述构造方法时可以省略注解,spring框架在创建Bean时默认会先走无参构造,若是只有有参构造,则会直接报错,解决方案有两种,一种是创建无参构造,另一种是不写无参构造,通过@Qualifier注解来给参数直接赋值
PM
在SpringBoot项目中如何整合第三方资源(连接池、Mybatis、SpringMVC)
"池"的概念,优劣势:

1."="右边会有编译时的优化自动封箱,将右边的语句转化为Integer.valueOf(100)
2.从池中取数的好处,就是可以在需要数据时直接取出,不需要创建(new),坏处就是占据内存空间,池的本质就是在用空间去换取时间
3.Spring提供Bean池也是因为,要优化时间,让我们的对象能够重用,在创建对象、销毁对象的时候会当误整体程序的运行时间
连接池
1.概述:
在实际开发过程中"获得连接"和"释放连接"是非常消耗时间的事情与数据库建立连接所需要协议(TCP/IP面向连接的协议),连接Tomcat时所用的HTTP协议是TCP协议中的应用层协议,为什么说这两个连接是在考法过程中最为耗时的呢,是因为TCP协议是一个面向连接的协议,特点就是,在建立连接时有三次握手,第一次是我可以给你发消息吗,第二次服务端回复可以,第三次就是发送消息,同时在释放连接的时候有四次挥手,拜拜四次,多以十分的耗时,所以为了解决"三次握手和四次挥手"就会使用连接池
2.如何使用池
用户想要连接数据库时,首先不是去直接连接收据库,而是检查是否有连接池,有池就通过池去取一个连接,通过DataSource找到池对象,池中有连接,直接连接返回,若是没有会访问驱动程序,与数据库创建连接都是通过Driver接口

3.整合HikariCP连接池
HiKariCP号称是目前世界上最快的连接池,有江湖一哥的称号,目前在springboot工程默认推荐使用HiKariCP连接池,现在我们创建一个新的项目,项目名为CGB-SBOOT-04,在此工程中整合HiKariCP,其步骤如下:
①添加依赖:
创建依赖分为两种方式一种是在创建项目时直接添加进去,另外一种是在项目创建后添加,在项目创建后添加步骤为:项目右键-->Spring-->AddStartes
②配置连接池:
在application.properties文件中写入数据库地址、用户名、密码,书写格式如下图

③原理分析:
首先通过测试类拿到数据库池对象,在JAVA中想要拿到池对象先要拿到DataSource对象,我们之所以不是直接拿HikariDataSource对象是因为,耦合与规范,退一万步讲虽然目前HikariDataSource是好用的连接池,一旦未来有更加好用的连接池出现,我们改变连接池,不需要修改前两步的代码,通过DataSource找到具体的数据源,通过数据源可以拿到具体的连接池,拿到池后首先初始化,然后通过Driver放入连接池,连接对应数据库的驱动,再由对应的数据库驱动去数据库中拿出数据。

4.整合MyBatis框架
Mybatis是持久层框架,把内存中的对象写到数据库中的这一层叫做持久层,Mabatis就是这一层的一个API,所有的框架都是解决一个共性的问题,就是数据持久化,底层以JDBC实现与数据库交互
亨元模式
意图:运用共享技术有效地支持大量细粒度的对象。
主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
何时使用: 1、系统中有大量对象。
2、这些对象消耗大量内存。
3、这些对象的状态大部分可以外部化。
4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
5、系统不依赖于这些对象身份,这些对象是不可分辨的。
如何解决:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。
关键代码:用 HashMap 存储这些对象。
应用实例:1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。
2、数据库的数据池。
优点:大大减少对象的创建,降低系统的内存,使效率提高。
缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。
使用场景: 1、系统有大量相似对象。
2、需要缓冲池的场景。
注意事项: 1、注意划分外部状态和内部状态,否则可能会引起线程 安全问题。
2、这些类必须有一个工厂对象加以控制。
详见:https://www.runoob.com/design-pattern/flyweight-pattern.html
FAQ?
同一类型,参数名称不同在Spring框架中创建一份对象还是两份?
同一类型只会创建一份
请问datasource对象在运行时指向的具体对象类型是什么?
通过datasource.getClass().getName获取具体类型或可以通过加断点找到具体类型为com.zaxxer.hikari.HikariDataSource
请问datasource对象是谁帮你创建的?
spring框架基于底层的自动配置(DataSourceAutoConfiguration)
请问获取连接的过程是什么样的?
getConnection方法调用的时候,会先看一下当前环境下面有没有连接池,若果没有先创建连接池,然后连接数据库取到连接放入连接池中,因为连接池占用的资源较多,所以在一开始运行时是不会创建连接池的
常见错误
测试数据库连接池连接时报错

1.确定错误信息为Bean对象创建异常
2.确定出错的Bean对象名称
3.下文报错信息为JDBC报错,查看application文件,发现符号写错,调整后程序正常运行
拓展
连接池源码查看

**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。