spring ioc 原理
1. 当容器启动的时,spring 会通过 BeanDefinationReader 读取咱们通过 xml 或者注解配置的 bean,将其转换成对应的 BeanDefination 加载到内存,这个 BeanDefination 中蕴含了 bean 元信息,是否式单例。
2. 当生成了 BeanDefination 之后,spring 就将其注册到 BeanDefinationRegistry,BeanDefinationRegistry 是一个 Map,key 是 Bean 定义的 id,value 是对应的 BeanDefination。
3. 当所有的 BeanDefination 注册完后,spring 给咱们提供了一个扩大点,能够实现 BeanFactoryPostProcessor 接口重写其中的办法,能够操作批改 BeanDefination 中 bean 的元信息。
4. 容器启动后会扫描这个 map 中的 BeanDefination,并应用反射的形式实例化 bean。
5. 对于实例化后的 bean,spring 会应用 BeanWrapper 中封装的反射相干的 API 来对 bean 填充属性,对于根本数据类型,依照咱们的配置设置,对于援用类型,spring 会把曾经创立好的对象放入一个 Map 中,此时 spring 会查看依赖的对象是否曾经在 map 里了,如果有间接注入,如果没有 spring 会暂停该对象的实例化,转而先去实例化依赖的对象,完预先再回头来实现该对象的实例化。
6. 在填充完属性后,spring 提供了一系列的 aware 接口,能够实现对容器自身一些属性的拜访。
7. 而后 spring 又提供了两个扩大点,BeanPostProcessor 这里提供了一个 before 和 after 办法,来对 bean 进行加强,AOP 的动静代理就是在 after 当中实现的。至此咱们对象的初始化实现。
spring 的三级缓存问题
第一级缓存放的实例化初始化过成熟的 bean
第二级缓存和第三级缓存寄存的时实例化但未注入过的 bean
当 A 和 B 循环依赖的时候,先实例化 A,注入时发现依赖 B 就先把 A 扔到第三级缓存,而后先注入
spring AOP 原理
aop 是 ioc 流程中的一个扩大点,在 bean 的创立过程中有一个步骤,也就是 BeanPostProcessor 提供了 before 和 after 两个办法在初始化对象办法前后,能够对 bean 进行加强,aop 就是在 after 办法中实现的。会通过 JDK 动静代理或者 CGLIB 的形式创立 Bean 的代理类,后续对 bean 中办法调用的时候,理论调用的是代理类加强过的办法。
JDK 动静代理:是应用了拦截器的形式,在调用办法的时候先解决拦截器中的逻辑
CGLIB:通过批改代理对象的 class 文件的字节码实现。
spring 的事务
spring 的事务,它实现上其实还是用 AOP 的原理,比如说办法上增加了 @Transaction 注解后,spring 会基于这个类生成一个代理对象,代理对象对办法做了加强,如果有事务处理,那么会先把事务的主动提交给敞开,而后执行业务逻辑,办法执行完没有异样,事务间接提交,如果有异样,间接回滚。
springBoot 的工作原理
主动拆卸,就是主动把第三方的组件的 bean 装载到 IOC 容器中,不须要咱们在写相干的配置。
1. 引入各个组件的 starter,组件中蕴含了一个 @Configuration 配置类,在这个配置类中,有 @Bean 注解申明了组件须要拆卸到 IOC 容器外面的 Bean 对象。
2. 这个配置类是放在第三方 jar 包中的,而后基于约定优于配置的理念把这个配置类的全门路放在 META-INF/spring.factories 文件中,这样 springBoot 就能够通过 SpringFactoriesLoader 晓得第三方 jar 包中配置类的地位。
3. 在启动类的 @SpringBootApplication 这个复合注解上面,有一个 @EnableAutoConfiguration 这个注解就是来实现主动拆卸的,在这个注解上面的 @Import 注解导入了 AutoConfigurationImportSelector 这个类,这个类继承了了 ImportSelector,外面的 selectImports 会读取 spring.factories 中配置类,实现对这些配置类的动静加载,从而实现主动拆卸。