Spring framework
文章平均质量分 84
梳理spring framework知识体系,记录重要知识点。以Spring 5.2.2.RELEASE版本进行介绍。注:不包括spring boot, spring cloud。这些另外开启专栏。专栏中相关示例源码:https://gitee.com/moon_2012/spring
elegent Developer
每周一篇博文^_^
展开
-
22. spring-容器:详解AnnotationConfigApplicationContext
先看类结构图可以看出跟XmlWebApplicationContext很像,都是基于AbstractApplicationContext, 而容器加载和实例化bean的核心方法都是在AbstractApplicationContext中组织,不同之处各个子类再重写。AnnotationConfigApplicationContextpublic class AnnotationConfigApplicationContext extends GenericApplicationContext imp原创 2021-08-12 13:39:48 · 294 阅读 · 0 评论 -
21. spring-容器:详解XmlWebApplicationContext
先看类结构图类结构图异常复杂,顶层的一些接口之前已经接触过了,像BeanFactory,ApplicationContext,ResourceLoder等。 对于XmlWebApplicationContext来说比较重要的基础类是:1)AbstractRefreshableConfigApplicationContext它是ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, XmlWebApplicationContex原创 2021-08-12 10:45:03 · 905 阅读 · 0 评论 -
20. spring-容器: ApplicationContext
BeanFactory vs ApplicationContext相同点都是spring的容器接口,都具备基本的容器功能, ApplicationContext本质上也是BeanFactory,它是BeanFactory的子接口。不同点BeanFactory只具备基本的容器功能,适用于性能受限的特殊场景。ApplicationContext是高级容器,在BeanFactory的基础上做了增强,如:支持i18n支持ResourceLoader,能作为抽象资源的访问接口消息发送机制(Appli原创 2021-08-10 14:55:23 · 105 阅读 · 0 评论 -
19. spring-容器: 如何解决Spring的循环依赖问题
123123原创 2021-06-18 13:54:21 · 248 阅读 · 1 评论 -
18. spring-容器:XmlBeanFactory源码解析-Bean实例化阶段
上一章讲了容器的启动阶段,完成的工作是从外部文件加载BeanDefinition对象,并注册到容器中。注意:本质上容器中使用一个Map来维护beanName和BeanDefinition对象之间的关系。本节开始讲解Bean的实例化阶段,看看容器内部是如何处理的。我们从DefaultListableBeanFactory的getBean方法为入口,开始跟踪:// 使用DefaultListableBeanFactory容器结合XmlBeanDefinitionReader Default原创 2021-06-11 16:35:30 · 136 阅读 · 1 评论 -
17. spring-容器:XmlBeanFactory源码解析-容器启动阶段
本节跟踪使用XmlBeanFactory容器时的启动阶段, 即包括:使用BeanDefinitionReader从xml文件中读取BeanDefinition。将BeanDefinition注册到容器中通过BeanFactoryPostProcessor对BeanDefinition做后置处理如何学习和阅读源码从本章起开始系统的学习框架源码,因为学习的目标框架都是非常成熟,优秀的框架,提供了某个领域的解决方案,且贡献者都是顶级开发者,所以源码会逻辑复杂,且代码量很大。如果不遵循一些好的阅读实践原创 2021-06-10 18:43:37 · 134 阅读 · 0 评论 -
16. spring-容器: 探索BeanFactory-XmlBeanFactory, DefaultListableBeanFactory, XmlBeanDefinitionReader
BeanFactoryBeanFactory是所有Spring容器的根接口,提供了基本的容器操作方法,定义如下:package org.springframework.beans.factory;import org.springframework.beans.BeansException;import org.springframework.core.ResolvableType;import org.springframework.lang.Nullable;public interf原创 2021-06-04 17:55:19 · 181 阅读 · 0 评论 -
15. spring-容器: 探索BeanFactory-总体分析
从本章起开始探索Spring容器,了解它背后实现的原理。IoC容器实现的大体过程包含两大阶段,分别是:容器启动阶段和Bean实例化阶段。容器启动阶段加载配置元数据,大部分情况下是依赖BeanDefinitionReader来加载和解析,并将解析后的结果组成BeanDefinition对象,最后将这些BeanDefinition注册到BeanDefinitionRegistry中。这一阶段主要做对象管理信息的收集工作。Bean的实例化阶段当某个请求方通过容器的getBean方法明确请求某个对象原创 2021-06-04 12:25:35 · 71 阅读 · 2 评论 -
14. spring-容器: @Autowired, @Qualifier, @Primary, @Resource, @Inject注解
这些注解都是用于标识需要spring容器注入bean。@Autowired, @Qualifier, @Primary是spring自带的注解@Resource, @Inject是JSR 250注解,是javaee规范。spring进行了实现。@Autowired源码如下package org.springframework.beans.factory.annotation;import java.lang.annotation.Documented;import java.lang.ann原创 2021-06-03 14:17:26 · 143 阅读 · 1 评论 -
13. spring-容器: Resource接口详解
在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源等很多资源。因为处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、读取资源、关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便?而且使我们系统更加简洁,都是对不同的底层资源使用同一个接口进行访问。Spring 提供一个Resource接口来统一这些底层资源一致性的访问,而且提供了一些便利的接口,从而能提供原创 2021-06-02 10:53:32 · 1046 阅读 · 1 评论 -
12. spring-容器: SpEL详解
上一章讲解了#{…}中可以写SpEL表达式,本章详细讲一讲如何使用。什么是SpEL即the Spring Expression Language的缩写,是一个强大的表达式语言,能支持在运行时查询和处理对象图。它的语法跟jsp中的EL表达式类似,但提供了额外的特性,最显著的是方法调用(method invocation)和基本的字符串处理功能。除了SpEL, 还有其他类似的框架,如:OGNL,MVEL,JBoss EL。 从SpEL名字可以看出,它创建出来致力于被所有spring产品使用,它的特性由s原创 2021-06-01 19:46:12 · 1010 阅读 · 0 评论 -
11. spring-容器: @Value, @PropertySource详解
在使用Java config配置Bean以前,即xml配置时代,bean的属性值可以通过 <property name=“xxx” value=""/>的形式。 value既可以使用固定值,也可以使用占位符的形式${xxx}。 占位符中的配置的值由一个特殊的bean的解析(MessageSource)。而到了java config时代,给bean属性配置值,可以使用的方式是@Value,本章就来重点讲下@Value如何使用。@Value定义先看源码:package org.springf原创 2021-05-31 19:55:59 · 370 阅读 · 2 评论 -
10. spring-容器: BeanPostProcessor后置处理器-进阶
再谈bean生命周期目前整个bean的生命周期,我们可以进行如下控制:bean的实例化: 容器初始化时调用bean的构造方法,我们可以在构造方法中执行必要的逻辑bean的初始化: 在初始化时,可以通过BeanPostProcessor的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法进行拦截,执行自定义的逻辑;通过@PostConstruct注解、InitializingBean和init-method来指定原创 2021-05-28 17:41:09 · 135 阅读 · 1 评论 -
9. spring-容器: BeanPostProcessor后置处理器-入门
本章讲spring Bean生命周期中非常重要的功能,即BeanPostProcessor后置处理器, 很多功能都依赖BeanPostProcessor实现,如AOP,Autowired,初始化方法调用等。精通BeanPostProcessor并灵活加以利用,spring 容器就学会了一大半。既然如此重要,还是先看源码:package org.springframework.beans.factory.config;import org.springframework.beans.BeansExc原创 2021-05-27 20:35:41 · 75 阅读 · 0 评论 -
8. spring-容器: Bean生命周期管理
Bean的生命周期即指Bean从创建到初始化,使用,再到销毁的过程。 在spring中,bean的生命周期由spring容器来管理,即spring容器负责bean的初始化,使用,再到销毁。并且spring提供了可扩展的方法,我们可以自己指定bean的初始化和销毁方法,当bean进行到当前生命周期的阶段时,会自动调用我们自定义的初始化和销毁方法。注意:spring对bean的生命周期进行管理仅限singleton。prototype的bean spring只负责创建,后续的初始化和销毁就不管了。如何指定原创 2021-05-27 17:41:44 · 414 阅读 · 0 评论 -
7. spring-容器:浅谈FactoryBean
先总结一下目前向spring容器注册Bean主要是以下几种方式:@ComponentScan + @Service, @Component etc…@Configuration + @Bean@Import: javabean, ImportSelector, ImportBeanDefinitionRegistrar注册的Bean往往提供了class路径,然后spring容器利用反射机制生成目标bean对象。但有些场景下实例化bean较复杂,期望可以通过编码的方式定制bean。此时Sprin原创 2021-05-25 14:03:58 · 159 阅读 · 1 评论 -
6. spring-容器: 注解:@Import
spring容器注册Bean的方式通常有如下几种方式:ComponentScan + 注解(@Component, @Service, @Controller): 通常是自己写的类。@Bean注解:通常用于导入第三方包中的组件。@Import注解:快速向Spring容器中导入组件...原创 2021-05-24 20:27:30 · 227 阅读 · 0 评论 -
5. spring-容器: 注解:@Conditional
本节学习一下条件化向容器中注册Bean。这是一个非常实用的功能。比如根据配置开关决定是否加载某组Bean。根据当前是否已有某个Bean决定是否加载该类型的Bean(如用自定义DataSource替换默认的DataSource Bean)。这个功能是后续SpringBoot能实现自动化配置的重要基础。@Conditional注解概述注解源码如下package org.springframework.context.annotation;import java.lang.annotation.Docu原创 2021-05-21 18:08:39 · 94 阅读 · 0 评论 -
4. spring-容器: 注解:@Lazy
默认Spring容器在启动时,会将组件实例化并加载到到容器中,此后该实例是单例,每次容器中返回的都是同一个实例。如果为了加快容器启动速度,可配置组件懒加载,将组件的实例化推迟到首次从容器中获取时。@Lazy注解源码package org.springframework.context.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.原创 2021-05-21 15:00:27 · 145 阅读 · 0 评论 -
3. spring-容器: 注解:@Scope
spring容器中的组件默认是单例的,在容器启动后会实例化这些对象并放到容器中,每次获取对象时,直接从容器中获取。这个特性是合理的,大多数场景也该这么使用。但如果期望每次从spring中获取对象时都是新实例,此时需要借助@Scope注解设置组件的作用域。@Scope注解源码package org.springframework.context.annotation;import java.lang.annotation.Documented;import java.lang.annotation原创 2021-05-21 14:08:24 · 145 阅读 · 1 评论 -
2. spring-容器: 注解:@Configuration; @Bean; @ComponentScan
IoC 和 DIspring容器有两个基本的概念,分别是IoC和DI。IoC:即控制反转,即创建对象的控制权进行了转移,将类的创建交给Spring容器类来管理,它就是一个专门用来创建对象的工厂。DI:即依赖注入,将类里面的属性在创建对象的过程中给属性赋值。即容器动态的将某个依赖关系注入到组件之中。关于这两个术语的论述可以参看编程大师Martin Fowler的文章:IoC和DI模式IoC和DI的关系:同一个概念的不同角度的描述,DI这个概念由Martin Flowler提出,这个术语明确描述了被原创 2021-05-19 13:35:55 · 242 阅读 · 0 评论 -
1. spring-绪论:Spring介绍
什么是Spring定义: spring是java企业级开发中使用最广泛的框架,能使得java开发更快,更容易,更安全,更优雅。spring专注速度,简化和产品级, 是企业级应用开发一站式解决方案。Java生态2020年报告从报告中可看出超过60%的开发者在生产项目使用spring,且超过三分之二的用户使用Spring5。服务端web框架方面,一半的人使用spring boot, 三分之一的使用spring MVC。为什么需要学习理由1: java生态丰富,是使用最广泛的框架,学会它能更好的开原创 2021-05-14 18:06:12 · 246 阅读 · 0 评论