
吃透Spring源码
文章平均质量分 89
Spring framework源码
吃透Java
专注Java技术,每天都要努力一点点
展开
-
吃透Spring源码(二十三):事物传播特性
一,上篇源码总结关于异常回滚:如果有保存点,回滚到保存点。否则,如果当前是一个新事物(transaction != null && newTransaction==true),直接进行回滚。否则,设置全局回滚标记,如果既没有保存点,又不是新的事务,如果可以设置全局的回滚标记的话,就会设置。关于事物提交:如果在事务链中已经被标记回滚,那么不会尝试提交事务,直接回滚如果设置了全局回滚,则进行全局回滚如果是新事务(transaction != null &&原创 2021-03-20 09:44:12 · 353 阅读 · 0 评论 -
吃透Spring源码(二十二):事物执行流程
文章目录执行流程1,AOP拦截器入口2,TransactionInterceptor事物的核心处理一,获取事物1,`doGetTransaction()`获取当前事物2,如果当前已存在事物3,如果当前事物不存在二,挂起事物三,恢复事物四,执行目标方法五,异常回滚六,事物提交七,总结执行流程1,AOP拦截器入口测试类:public class TransactionTest { public static void main(String[] args) { Annotatio原创 2021-03-19 09:14:49 · 502 阅读 · 0 评论 -
吃透Spring源码(二十一):事物初始化流程之注解配置方式
一,例子准备BookDao.javapublic class BookDao { @Autowired JdbcTemplate jdbcTemplate; public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplat原创 2021-03-16 17:05:42 · 440 阅读 · 0 评论 -
吃透Spring源码(二十):AOP拦截器链执行过程
文章目录例子准备一,执行流程二,获取拦截器链三,执行拦截器链1,`ExposeInvocationInterceptor`2,AspectJAfterThrowingAdvice3,AfterReturningAdviceInterceptor4,AspectJAfterAdvice5,AspectJAroundAdvice6,MethodBeforeAdviceInterceptor7,返回到AspectJAroundAdvice8,返回到AspectJAfterAdvice9,返回到AfterRetur原创 2021-03-15 09:03:55 · 1121 阅读 · 1 评论 -
吃透Spring源码(十九):CGLIB动态代理创建过程
CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。 CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP为他们提供方法的interception(拦截)。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。除了CGLIB包,脚本语言例如Groovy和BeanShell,也是使用ASM来生成jav原创 2021-03-13 12:17:59 · 1424 阅读 · 0 评论 -
吃透Spring源码(十八):AOP创建过程之注解配置方式
一,例子准备切面类:LogUtil.java@Aspect@Componentpublic class LogUtil { @Pointcut("execution(public Integer com.mashibing.aop.annotation.service.MyCalculator.*(Integer,Integer))") public void myPointCut(){} @Around("myPointCut()") public Object原创 2021-03-12 16:11:18 · 501 阅读 · 2 评论 -
吃透Spring源码(十七):AOP创建过程之XML配置方式
一,例子准备切面类LogUtil.javapublic class LogUtil { private int start(JoinPoint joinPoint){ //获取方法签名 Signature signature = joinPoint.getSignature(); //获取参数信息 Object[] args = joinPoint.getArgs(); System.out.println("lo原创 2021-03-11 20:13:33 · 480 阅读 · 1 评论 -
吃透Spring源码(十六):ConfigurationClassPostProcessor详细介绍
一,ConfigurationClassPostProcessor简介ConfigurationClassPostProcessor是一个后置处理器的类,主要功能是参与BeanFactory的建造,主要功能如下:解析加了@Configuration的配置类解析@ComponentScan扫描的包解析@ComponentScans扫描的包解析@Import注解ConfigurationClassPostProcessor类图:ConfigurationClassPostProcessor原创 2021-03-10 18:19:44 · 1990 阅读 · 1 评论 -
吃透Spring源码(十五):invokeBeanFactoryPostProcessors 执行流程
进入源码之前先来了解一下BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor:主要针对的操作对象是BeanFactory,主要是对BeanFactory的修改。BeanDefinitionRegistryPostProcessor:是BeanFactoryPostProcessor的子接口,主要针对的操作对象是BeanDefinitionpublic interface BeanFa原创 2021-03-09 18:41:43 · 537 阅读 · 2 评论 -
吃透Spring源码(十四):动态代理JDK实现方式源码分析
JDK动态代理**所谓动态代理是指:在程序运行期间根据需要动态创建代理类及其实例来完成具体的功能。**动态代理主要分为JDK动态代理和cglib动态代理两大类,本文主要对JDK动态代理进行探讨。使用步骤新建接口新建一个接口实现类实现代理类回调接口InvocationHandler通过Proxy.newProxyInstance()方法创建代理类使用案例1,新建HelloWord接口public interface HelloWord { void sayHello();原创 2020-12-23 16:41:38 · 436 阅读 · 0 评论 -
吃透Spring源码(十三):Spring循环依赖源码分析
一,循环依赖1,什么是循环依赖循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。在Spring中一般分为构造器循环依赖和filed属性循环依赖。2,构造器循环依赖实例化A对象需要依赖B对象,实例化B对象需要依赖A对象,所以最终两个都实例化不了。@Componentpublic class A { private B b; public A(B b) { this.b = b;原创 2020-12-07 18:07:09 · 1010 阅读 · 0 评论 -
吃透Spring源码(十二):Spring initializeBean源码分析
一,initializeBean方法概述Spring中的initializeBean()方法是doCreateBean方法三部曲的最后一步,完成initializeBean()则整个bean的创建过程才算完成,我们来看一下bean的创建过程doCreateBean()方法中三部曲:实例化(createBeanInstance),填充属性(populateBean),初始化(initializeBean)。public abstract class AbstractAutowireCapableBeanF原创 2020-12-04 15:53:48 · 1001 阅读 · 3 评论 -
吃透Spring源码(十一):Spring属性填充populateBean源码分析
一,属性填充分类Spring实例化前面我们已经分析过了,实例化之后,紧接着就是对属性进行填充了,属性填充主要是对自动注入(autowired)的处理,我们大致可以把他分为三类:autowireByName:通过名字对属性填充。autowireByType:通过类型对属性填充。@Autowired:通过bean的后置处理器AutowiredAnnotationBeanPostProcessor对@Autowired注解属性填充我们来看一下具体源码: protected void populat原创 2020-11-27 16:33:39 · 1632 阅读 · 0 评论 -
吃透Spring源码(九):Spring实例化(createBeanInstance)源码解析
一,createBeanInstance()方法概述createBeanInstance 是Spring实例化的核心代码,它根据不同的情况会调用四种实例化方法:obtainFromSupplier():通过Supplier实例化。instantiateUsingFactoryMethod():通过工厂方法实例化。autowireConstructor():用合适的构造函数实例化。instantiateBean():用无参构造函数实例化。protected BeanWrapper create原创 2020-11-18 18:02:16 · 1221 阅读 · 1 评论 -
吃透Spring源码(十):Spring实例化Bean的五种方式源码解析
一,概述对于我们Java来说,创建对象无非就是new或者通过反射两种方式。Spring中实例化对象一般是通过反射来实现的,但是Spring的强大之处不仅仅在于它为Java开发者提供了极大便利,更在于它的开放式架构,使得用户可以拥有最大扩展Spring的能力。我们大致可以总结出以下五种实例化bean的方式:实现InstantiationAwareBeanPostProcessor接口实现FactoryBean接口通过Supplier接口工厂方法factory-method通过反射二,实现原创 2020-11-19 11:01:35 · 832 阅读 · 10 评论 -
吃透Spring源码(八):Spring中FactoryBean真相揭秘
一,FactoryBean和BeanFactoryFactoryBean:首先它是一个Bean,但又不仅仅是一个Bean。它是一个能生产或修饰对象生成的工厂Bean,类似于设计模式中的工厂模式和装饰器模式。它能在需要的时候生产一个对象,且不仅仅限于它自身,它能返回任何Bean的实例。BeanFactory:是Spring中Bean工厂的顶层接口,也是我们常说的SpringIOC容器,它定下了IOC容器的一些规范和常用方法并管理着Spring中所有的Bean。二,FactoryBean揭秘定义一个原创 2020-11-17 14:34:17 · 579 阅读 · 0 评论 -
吃透Spring源码(七):自定义类型转换器
一,ConversionService转换服务一般来说,用户可以使⽤用内置的或者⾃己实现Converter接⼝来实现类型转换,ConversionService类接口内部调用Converter接口实现类来实现类型转换。1,ConversionService接口类型转换的服务接口,这是转换系统的入口,调用convert(Object, Class)进行一次线程安全的类型转换。public interface ConversionService { // 判断能否进行类型转换 boolean c原创 2020-11-16 18:24:07 · 2174 阅读 · 0 评论 -
吃透Spring源码(六):spring事件通知机制源码解析
一,Spring事件机制Spring 中的事件通知机制就是观察者模式的一种实现。观察者是 ApplicationListener,可以实现接口定义观察者,也可以使用注解@EventListener定义观察者。观察者感兴趣的是某种状态的变化,这种状态变化使用 ApplicationEvent 来传达,也就是事件对象。我们说的 Spring 中的事件,就是 ApplicationEvent。在事件中,被观察者可以认为是发出事件的一方,只有在状态变化时才发布事件。当有状态发生变化时,发布者调用 Applicat原创 2020-11-09 17:09:39 · 836 阅读 · 1 评论 -
吃透Spring源码(五):spring中Beanefinition完全解析
大家用过spring的应该都知道BeanDefinition是记录bean的定义信息的,但是我们看源码时会发现,源码中通过BeanDefinition接口派生出来好多类,比如GenericBeanDefinition,AnnotatedGenericBeanDefinition,RootBeanDefinition等等,那么他们之间有什么区别,都是在什么情况下用到的呢?这篇文章就带大家一起探讨。1,BeanDefinition常用类关系图2,BeanDefinition接口BeanDefinitio原创 2020-11-04 15:40:19 · 1122 阅读 · 1 评论 -
吃透Spring源码(四):自定义属性编辑器PropertyEditor
Spring的强大之处不仅仅在于它为Java开发者提供了极大便利,更在于它的开放式架构,使得用户可以拥有最大扩展Spring的能力。我们在xml定义bean时,输入的内容都是字符串。spring会根据已经注册好的属性编辑器解析这些字符串,实例化成对应的类型。一,源码相关1,创建默认的propertyEditorRegister在AbstractApplicationContext的refresh()方法的prepareBeanFactory()方法中创建一个默认的PropertyEditorR.原创 2020-10-21 15:43:24 · 1731 阅读 · 2 评论 -
吃透Spring源码(二):customizeBeanFactory方法扩展点
Spring的强大之处不仅仅在于它为Java开发者提供了极大便利,更在于它的开放式架构,使得用户可以拥有最大扩展Spring的能力。protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) { // 如果属性allowBeanDefinitionOverriding不为空,设置给beanFactory对象相应属性,是否允许覆盖同名称的不同定义的对象 if (this.allowBeanDefiniti.原创 2020-10-20 17:00:38 · 1544 阅读 · 3 评论 -
吃透Spring源码(三):自定义配置文件标签
Spring的强大之处不仅仅在于它为Java开发者提供了极大便利,更在于它的开放式架构,使得用户可以拥有最大扩展Spring的能力。我们在用xml定义spring信息时,默认的element只包含beans,bean,import,alias这四个,其它任何标签都属于自定义标签,均需要引入相应的命名空间,如:context,aop标签等。protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate del.原创 2020-10-21 10:11:57 · 506 阅读 · 2 评论 -
吃透Spring源码(一):initPropertySources方法扩展点
Spring的强大之处不仅仅在于它为Java开发者提供了极大便利,更在于它的开放式架构,使得用户可以拥有最大扩展Spring的能力。protected void initPropertySources() { // For subclasses: do nothing by default. }在AbstractApplicationContext类中有一个initPropertySources方法是留给子类扩展,它是在refresh()的第一个方法prepareRefresh();方法中调.原创 2020-10-20 12:02:47 · 3720 阅读 · 0 评论