抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

spring底层源码

流程

XiaBeanApplication 主类
加入 @componentScan 对包进行扫描,利用反射得到包的相对路径 根据相对路径去寻找类的字节码文件目录,加入了 @Component 注解,则将其加入IOC容器 判断多例还是单例模式,单例则加入单例池,多例则 new 一个新对象,接着进行依赖注入,将标有@Autowired的变量上,从单例池创建或取出里面取出对象将其赋值到自动注入上 @Autowired通过byType再byName查找类型。

Bean的生命周期

UserService.class–>推断构造方法(无参的构造方法)–>对象–>依赖注入–>初始化前–>初始化–>初始化后–>放入Map(单例池)–>Bean对象

初始化前(@PostConstruct)
初始化(执行InitializingBean接口中的afterPropertiesSet,可实现接口添加内容)
初始化后(AOP)
初始化前后的接口为BeanPostProcessor

1
2
3
4
5
6
public interface BeanPostProcessor {
//初始化前调用
public Object postProcessBeforeInitialization(String beanName, Object bean);
//初始化后调用
public Object postProcessAfterInitialization(String beanName, Object bean);
}

推断构造方法

1.将一个类加入Bean,其构造方法中有其他加入Bean的类,会默认运行这个构造方法,如果有多个构造方法,会默认先使用无参构造方法
2.若是有多个构造方法(不包括无参构造),则需要手动使用@Autowired 来选择构造器,否则报错。

事务实现原理

@Transactional开启事务
核心思想:修改事务提交方式
1.事务管理器新建一个数据库连接conn
2.conn.autocommit = false 关闭SQL语句自动提交
3.成功则conn.commit()提交,抛出异常或失败则conn.rollback()回滚

注:只有代理对象运行方法事务才会生效,即bean对象调用才有用

循环依赖问题

Spring采用三级缓存解决循环依赖问题
循环依赖–>提前进行AOP

第一级缓存: singletonObjects,单例池
第二级缓存: earlySingletonObjects,存入未经过完整bean生命周期的代理对象,解决多个对象互相依赖
第三级缓存: singletonFactories,存放代理对象类的普通对象,打破循环依赖

评论