Spring学习笔记-循环依赖
IoC循环依赖什么是循环依赖 循环依赖其实就是循环引⽤,也就是两个或者两个以上的 Bean 互相持有对⽅,最终形成闭环。⽐如A依赖于B,B依赖于C,C⼜依赖于A。
注意,这⾥不是函数的循环调⽤,是对象的相互依赖关系。循环调⽤其实就是⼀个死循环,除⾮有终结条件。
Spring中循环依赖场景有:
构造器的循环依赖(构造器注⼊)
Field 属性的循环依赖(set注⼊)
scope为prototype原型的bean循环依赖(⽆法解决):对于原型bean的初始化过程中不论是通过构造器参数循环依赖还是通过setXxx⽅法产⽣循环依赖,Spring都会直接报错处理。
其中,构造器的循环依赖问题⽆法解决,只能拋出BeanCurrentlyInCreationException异常,在解决属性循环依赖时,spring采⽤的是提前暴露对象的⽅法。
构造器的循环依赖问题⽆法解决的原因是:Bean加载流程需要先实例化,如果构造器就有依赖会实例化失败,创建流程直接就结束了;
解决方案prototype 原型 ...
Spring学习笔记-IOC源码解析
IOC源码解析通过查看源码,可以得到BeanFactory是Spring的顶级接口。
它提供了一些getBean的方法,它的容器继承体系图,如下所示:
通过其接⼝设计,可以看ApplicationContext除了继承BeanFactory的⼦接⼝,还继承了ResourceLoader(加载资源,用于读取文件等)、MessageSource(国际化)等接⼝,因此其提供的功能也就更丰富了。
IOC容器初始化流程准备工作通过对示例代码进行断点,可以看到多个关键节点的发起位置,都是位于同一个方法:
进入此文件,找到对应的方法,可以看到里面有很多方法,对应了生命周期中的各个节点:
接下来需要去官网进行源码下载,然后导入idea,查看源码。
IOC容器初始化常见的Spring启动方式分为两种:ClassPathApplicationContext和AnnotationConfigApplicationContext;一种以配置文件方式启动,一种是以注解方式启动;
XML配置方式ClassPathApplicationContext查看源码如下:
1234567891 ...
Spring学习笔记-Bean生命周期
SpringBean的生命周期 Spring中Bean的创建是经过了很多的步骤,并且也提供了一些方法,方便在创建过程中获取或执行一些逻辑,完成一下自定义的操作。 我们可以通过这些方法来查看Bean的生命周期。
示例首先创建一个普通的maven项目,引入spring相关依赖:
123456789101112<!--引入Spring IoC容器功能--><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.12.RELEASE</version></dependency><dependency> <groupId>javax.annotation</groupId> <artifactId>javax.anno ...
Spring学习笔记-IOC原理及配置
Bean定义模式在Spring的IOC实现中,对于Bean的定义有三种模式:
模式
应用类型
IOC容器启动方式
纯XML
JavaSE
ApplicationContext context = new ClassPathXMLApplicationContext("Beans.xml") 或者 new FileSystemXmlApplicationContext("/root/Bean.xml")
JavaWeb
ContextLoaderListener监听器去加载XML
XML+注解
JavaSE
ApplicationContext context = new ClassPathXMLApplicationContext("Beans.xml") 或者 new FileSystemXmlApplicationContext( ...
Spring学习笔记-手写IOC与AOP
什么是IOC在传统项目中,类A要使用类B的某个方法f,这时候一般是这么实现:
123456public class A { public void test() { B b = new B(); b.f(); }}
这时,B的创建是有A来自己完成的,我们可以说A拥有B的创建、管理权限。
但是这种情况下,A和B就是强关联的,我们希望A和B是松耦合的状态,显然直接new肯定是不行的。所以IOC(控制反转)主要就是描述了一种将对象的创建管理权限交给IOC容器管理,自己不负责创建管理的思想。
什么是DIDI:依赖注入,其实它和IOC描述的是同⼀件事情,只不过角度不同。
上面我们从对象的角度描述了什么是IOC,如果我们把角度切换到IOC容器时,就会发现ioc容器主要完成的事情,就是把A需要的B,进行注入,这个过程就叫依赖注入。
自定义实现IOC基于上面的解释,要实现一个类似SpringIOC的ioc容器,可以分成几个步骤(基于注解的模式):
扫描指定包下所有类(或者带指定注解的类);
进行类的实例化,生成对象 ...
Mybatis学习笔记-手写简单的Mybatis
1. 传统的JDBC模式在没有使用ORM框架时,我们基本都是通过JDBC进行数据库的操作,一般的逻辑代码如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 通过驱动管理类获取数据库链接 connection = DriverManager.getConnection("jdbc:mysql://localho ...
Java学习笔记-动态代理
1. 代理模式
代理模式一般指的是一个类代表另一个类的功能。这种类型的设计模式属于结构型模式,通过创建具有现有对象的对象,以便向外界提供功能接口。
这里来举例说明:歌星A,擅长唱歌;某晚会邀请A去唱歌,但是实际上不会直接联系A,而是联系A的经纪人B,经纪人经过合同谈判等步骤,最终A去晚会上进行了唱歌。首先定义个接口Star里面定义了唱歌方法如下:
12345678public interface Star{ // 唱歌 void sing(); // 跳舞 void dance();}
然后声明实现类歌星A:
123456789101112public class RapStar implements Star{ @Override public void sing() { System.out.println("RapStar开始freestyle!"); } @Override public void dance() { System ...
Mybatis学习笔记-源码解读与插件原理
mybatis架构简介
Mybatis的架构可以大致分为以下三层:1、API接口层:对外提供增删改查接口,使用传统的MyBatis提供的API或者使用Mapper代理的方式;2、数据处理层:完成参数映射、SQL解析与执行、结果处理等;3、框架支撑层:支持基于XML或者注解定义SQL、事务管理、连接池管理、缓存管理等;
Mybatis作为一个ORM框架,实际上底层还是通过JDBC来操作数据库,完成增删改查的。
想要详细了解底层的原理,首先需要知道Mybatis的九大核心的概念:
组件
描述
SqlSession
作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成数据库增删改查功能
Executor
MyBatis执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler
封装了JDBC Statement操作,负责对JDBC statement的操作,如设置参数、将Statement结果集转换成List集合
ParameterHandler
负责对用户传递的参数转换成JDBC Statement ...
Mybatis学习笔记-注解、延迟加载以及缓存
1. mybatis注解
上一章介绍mybatis的使用时,主要介绍的是通过XML方式进行SQL相关配置,其实我们还可以通过注解来减少编写Mapper映射文件,本章就主要讲解相关的注解。
1.1 常用的CRUD注解
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
通过上面的注解,可以替代mapper.xml里面的相关SQL标签,例如通过
12@Select("select * from user")public List<User> findAll();
可以替代
123<select id="findAll" resultMap="userMap"> select * from user</select>
1.2 结果集注解在注解模式中,怎么指定返回的结果集中数据库字段与实体属性名的对应关系呢?主要是通过@Result和@Results来实现,具体示例如下:
123456@Select("select * from us ...
Mybatis学习笔记-基本概念和复杂映射
1. 概念
MyBatis是一款优秀的基于ORM的半自动轻量级持久层框架,它支持定制化SQL、存储过程以及高级映射,使用XML或注解实现映射对应,结果集自动转换成指定类型,无需自己处理。
1.1 什么是ORMORM全称Object/Relation Mapping:表示对象-关系映射的缩写,它完成面向对象的编程语言到关系数据库的映射。采用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层SQL操作。ORM框架实现的效果:把对持久化对象的保存、修改、删除等操作,转换为对数据库的insert、update、delete操作。
1.2 什么是半自动简单来说,半自动就是还需要开发人员自己写核心的SQL。与之对应的就是全自动,类似Hibernate等,就是无需写SQL都是全自动完成。
2. 配置文件
Mybatis的配置文件一般分为两种,一个是核心配置文件,一个是映射配置文件,核心配置文件配置了Mybatis的核心配置,包括数据库连接信息、是否开启缓存等;映射配置文件主要是用于配置具体的映射关系的文件;
2.1 核 ...




