spring底层源码
流程
XiaBeanApplication 主类
加入 @componentScan 对包进行扫描,利用反射得到包的相对路径 根据相对路径去寻找类的字节码文件目录,加入了 @Component 注解,则将其加入IOC容器 判断多例还是单例模式,单例则加入单例池,多例则 new
一个新对象,接着进行依赖注入,将标有@Autowired
的变量上,从单例池创建或取出里面取出对象将其赋值到自动注入上 @Autowired
通过byType再byName查找类型。
Bean的生命周期
UserService.class–>推断构造方法(无参的构造方法)–>对象–>依赖注入–>初始化前–>初始化–>初始化后–>放入Map(单例池)–>Bean对象
初始化前(@PostConstruct)
初始化(执行InitializingBean接口中的afterPropertiesSet,可实现接口添加内容)
初始化后(AOP)
初始化前后的接口为BeanPostProcessor
1 | public interface BeanPostProcessor { |
推断构造方法
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,存放代理对象类的普通对象,打破循环依赖