Spring Framework源码
文章平均质量分 89
springframework 是spring 里面的一个基础开源框架,主要用于javaee的企业开发。Spring是什么呢?首先它是一个开源的项目,而且非常活跃;它是一个基于IOC和AOP的构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自
爱写bug的小刘
这个作者很懒,什么都没留下…
展开
-
16、Spring~配置类
Spring容器在启动过程中,在BeanFactory创建之后,会执行BeanFactoryPostProcessors,这里会拿到之前Spring容器自己设置的ConfigurationClassPostProcessor,Spring容器详细的启动过程请移步至《doProcessConfigurationClass()方法详解。processConfigurationClass()方法详解。parse()方法,有几个重载方法,不同参数处理逻辑都是调用。通过上述代码,可以看到,这里会调用。原创 2024-06-26 21:22:32 · 998 阅读 · 0 评论 -
15、Spring~容器启动过程
15、Spring~容器启动过程容器启动过程AnnotationConfigApplicationContext类的四个构造器:启动过程详解无参构造方法refresh()方法prepareRefresh()方法prepareBeanFactory()方法invokeBeanFactoryPostProcessors()方法registerBeanPostProcessors()方法finishBeanFactoryInitialization()方法GenericApplicationContext对象详解原创 2024-06-26 21:21:50 · 1238 阅读 · 1 评论 -
15、Spring之Bean生命周期~总结
扫描这一步扫描将带@Component注解的类扫描成BeanDefinition相关博客《Spring之Bean生命周期~扫描合并BeanDefinition类直接存在继承关系,扫描到的BeanDefinition也需要进行继承;相关博客《Spring之Bean生命周期~合并BeanDefinition获取Bean这一步为什么是获取Bean不是创建Bean,Spring容器中大多数Bean对象都是单例的,有单例池的存在,单例池中没有Bean才会去创建Bean;实例化前实例化。原创 2024-06-21 14:05:09 · 308 阅读 · 0 评论 -
14、Spring之Bean生命周期~推断构造方法
这里我们可以看到,最终会调用ConstructorResolver类的instantiateUsingFactoryMethod()方法,我们详细分析一下ConstructorResolver类的instantiateUsingFactoryMethod()方法。通过上述代码,我们可以看到,这里会调用ConstructorResolver类的autowireConstructor()方法,接下来,我们详细分析ConstructorResolver类的autowireConstructor()方法。原创 2024-06-21 14:05:33 · 1052 阅读 · 0 评论 -
13、Spring之Bean生命周期~循环依赖
AutowiredBeanOne Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。AutowiredBeanTwo Bean对象。原创 2024-06-18 11:34:23 · 662 阅读 · 0 评论 -
12、Spring之Bean生命周期~依赖注入(3)
通过上述代码,我们可以看到,不管是属性还是方法都会调用getResourceToInject()方法查找属性的值,我们这里可以看到,InjectedElement类是一个抽象类,看他的子类会发现,ResourceElement继承啦InjectedElement类,或者在查找注入点时,最后我们可以看到属性或者方法参数被封装成ResourceElement对象放入啦缓存。这里还有一个有意思的判断,判断啦方法参数必须是一个,不能没有参数,也不能有一个以上的参数,否则会报错;getResource()方法详解。原创 2024-06-18 11:33:34 · 640 阅读 · 0 评论 -
11、Spring之Bean生命周期~依赖注入(2)
11、Spring之Bean生命周期~依赖注入(2)依赖注入查找注入点对注入点进行赋值InjectionMetadata.inject()方法AutowiredFieldElement.inject()方法resolveFieldValue()方法resolveDependency方法createOptionalDependency()方法doResolveDependency()方法determineAutowireCandidate()方法resolveMultipleBeans()方法findAuto原创 2024-06-17 09:11:23 · 2413 阅读 · 3 评论 -
10、Spring之Bean生命周期~依赖注入(1)
这里并没有校验属性是不是被static修饰的,因为@Bean(autowire = Autowire.BY_NAME)已经是不推荐的方式,这里没有深入研究,欢迎知道的大佬留言!@Bean(autowire = Autowire.BY_NAME)方式的依赖注入,如果想了解其他方式的依赖注入请移步至《registerDependentBean()方法详解。autowireByName()方法详解。autowireByType()方法详解。原创 2024-06-17 09:10:57 · 774 阅读 · 0 评论 -
9、Spring之Bean生命周期~依赖注入(总)
通过XML中定义Bean时,可手动注入。从类型角度区分,分两种:手动和自动。原创 2024-06-16 16:04:55 · 707 阅读 · 0 评论 -
8、Spring之Bean生命周期~销毁
spring容器在正常关闭的时候会销毁Bean对象,比如上述代码中,执行close方法时,容器关闭,销毁单例的Bean对象;通过上述代码我们可以看到,如果给BeanDefinition设置指定的销毁方法或者把销毁方法设置成(inferred),spring在销毁bean的时候会去找bean中的close方法和shutdown方法;inferDestroyMethodIfNecessary()方法详解。requiresDestruction()方法详解。hasDestroyMethod()方法详解。原创 2024-06-16 11:53:23 · 339 阅读 · 0 评论 -
7、Spring之Bean生命周期~初始化
这里可以看到,首先会判断当前Bean对象是否实现了InitializingBean接口,如果实现了就调用它的afterPropertiesSet()方法,然后判断BeanDefinition中是否指定初始化方法,如果指定啦初始化方法且不是afterPropertiesSet()方法的话,会调用BeanDefinition指定的初始化方法;applyBeanPostProcessorsBeforeInitialization()方法详解。invokeAwareMethods()方法详解。原创 2024-06-10 17:18:45 · 876 阅读 · 0 评论 -
6、Spring之Bean生命周期~创建Bean(2)
【代码】6、Spring之Bean生命周期~创建Bean(2)原创 2024-06-10 17:18:17 · 765 阅读 · 0 评论 -
5、Spring之Bean生命周期~创建Bean(1)
Spring Bean的生命周期首先会经过扫描,然后回经过合并,合并之后就会通过getBean()方法去获取bean,getBean()方法大致逻辑,先根据判断是单例bean还是原型bean,原型bean直接创建,单例bean会判断单例池中有没有,没有的话调用createBean()方法。如果实例化前这一步有返回值,会直接返回,不走后续的实例化、依赖注入、初始化前,直接跳到初始化这一步,执行AOP操作;resolveBeforeInstantiation()方法详解。通过上述代码,我们就可以看到。原创 2024-06-09 16:46:34 · 695 阅读 · 0 评论 -
4、Spring之Bean生命周期~获取Bean
Spring Bean的生命周期首先会经过扫描,然后回经过合并,合并之后就会通过getBean()方法去获取bean,getBean()方法大致逻辑,先根据判断是单例bean还是原型bean,原型bean直接创建,单例bean会判断单例池中有没有,没有的话再去创建。通过canonicalName()方法我们可以看到,会不断地从aliasMap中回去,直到获取到的是null,说明是真正的BeanName;这里我们可以看到如果BeanName是以&开头的话,会截取掉开头所有的&;此方法涉及到解决循环依赖。原创 2024-06-09 16:45:21 · 1095 阅读 · 0 评论 -
3、Spring之Bean生命周期~合并BeanDefinition
spring通过扫描,将class文件封装成BeanDefinition之后,并不能直接拿BeanDefinition去创建Bean对象,中间还需要经过一系列的合并和判断,废话不多说,直接上代码;通过上述代码我们可以看到首先回去mergedBeanDefinitions缓存中判断,这个BeanDefinitions是否已经合并过,如果合并过直接拿缓存中的对象,缓存中没有的话,调用。合并beanDefinition和java中的类继承一样,子类有的用子类,子类没有的用父类;原创 2024-06-07 14:20:43 · 401 阅读 · 0 评论 -
2、Spring之Bean生命周期~扫描
不管那种方式都需要指定spring容器的扫描路径,xml文件通过 <context:component-scan /> 标签设置扫描路径,配置类通过 @ComponentScan 注解设置扫描路径,spring容器在拿到扫描路径之后就会对配置的路径进行挨个扫描,如果符合bean的要求,就会把他封装成一个BeanDefinition。这是只是大致过一个spring容器的创建,具体详细的创建步骤并不会展开细说,只说和bean生命周期有关的部分;findCandidateComponents方法详解。原创 2024-06-07 14:20:24 · 1173 阅读 · 0 评论 -
1、Spring之底层架构核心概念
bean一定是一个对象。在Spring的源码实现中,当我们new一个ApplicationContext时,其底层会new一个BeanFactory出来,当使用ApplicationContext的某些方法时,比如getBean(),底层调用的是BeanFactory的getBean()方法。为什么要使用ASM技术,Spring启动的时候需要去扫描,如果指定的包路径比较宽泛,那么扫描的类是非常多的,那如果在Spring启动时就把这些类全部加载进JVM了,这样不太好,所以使用了ASM技术。原创 2024-06-04 19:50:25 · 1222 阅读 · 0 评论