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中配置类,实现对这些配置类的动态加载,从而完成自动装配。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: Java开发 – 不知道算不算详细的分布式事务详解
前言 前日对JUC进行了一个深度总结,不过现在博主能记得的也不多了,只是这东西,不是看几遍写几遍就能完全记住的,功夫在平时,很多知识点都需要反复的看,不光要看,还要用,这样才能了解其原理,掌握其原理,从而能更好的运用于平时的开发中,提高开发效率。今天给大家带来…