上一篇文章整体非常轻松,因为在容器启动前,只注册了一个bean定义,就是SpringBoot的主类. OK,今天接着从容器的启动入手,找出剩余所有的bean定义的注册过程. 具体细节肯定会颇为复杂,同样,大家只需关注都干了什么,不用考虑如何干的. 来宏观的看下容器的启动过程,即refresh方法,如下图01: 只捡重要的来说,就是四大步: 第一,准备好bean工厂(BeanFactory). 第二,调用已经注册的bean工厂后处理器(BeanFactoryPostProcessor). 第三,注…
别看Spring现在玩的这么花,其实它的“筹码”就两个,“容器”和“bean定义”. 只有先把bean定义注册到容器里,后续的一切可能才有可能成为可能. 所以在进阶的路上如果要想走的顺畅些,彻底搞清楚bean定义注册的所有细节至关重要. 毕竟这是万里长征的第一步.有句话怎么说来着,“勿在浮沙筑高台”. Spring步入注解和Java配置的时代也有些时日了.而且也旗帜鲜明的表达了bean的注册方法. 这不,就是这个接口,AnnotationConfigRegistry,如下图01: 再来看下这个接…
前景回顾 当我们把写好的业务代码交给Spring之后,Spring都会做些什么呢? 仔细想象一下,再稍微抽象一下,Spring所做的几乎全部都是: “bean的实例化,bean的依赖装配,bean的初始化,bean的方法调用,bean的销毁回收”. 那问题来了,Spring为什么能够准确无误的完成这波对bean的操作呢?答案很简单,就是: “Spring掌握了有关bean的足够多的信息”. 这就是本系列文章第一篇“帝国的基石”的核心思想.Spring通过bean定义的概念收集到了bean的全部信…
一个小小的里程碑 首先感谢能看到本文的朋友,感谢你的一路陪伴. 如果每篇都认真看的话,会发现本系列以bean定义作为切入点,先是详细解说了什么是bean定义,接着又强调了bean定义为什么如此重要. 然后又讲了获取bean定义详细信息的方法,接着又讲了bean定义注册的若干种方式,然后是bean定义注册方式的实现细节. 最后又以SpringBoot应用为例,从容器启动前.启动后分两个阶段解说bean定义是如何进入到容器里的. 就是bean工厂后处理器配合使用@ComponentScan注解和@I…
上一篇文章强调了bean定义注册占Spring应用的半壁江山.而且详细介绍了两个重量级的注册bean定义的类. 今天就以SpringBoot为例,来看看整个SpringBoot应用的bean定义是如何注册进容器的. 先来看看经典的启动入口,如下图01: 可以看到调用的是run方法,并把主类(main或primary)作为第一个参数出入. 接下来要做的事情,就是顺藤摸瓜,看看到底发生了什么,并确定下究竟哪些类被注册了bean定义. 此时,我就是一个快乐的小侦探,OK,走起. 上面的调用走到了这里,…
一.Bean定义继承 bean定义可以包含许多配置信息,包括构造函数参数,属性值和特定于容器的信息,例如初始化方法,静态工厂方法名称等. 子bean定义从父定义继承配置数据.子定义可以根据需要覆盖某些值或添加其他值. Spring Bean定义继承与Java类继承无关,但继承概念是相同的.您可以将父bean定义定义为模板,其他子bean可以从父bean继承所需的配置. 使用基于XML的配置元数据时,可以使用parent属性指定子bean定义,并将父bean指定为此属性的值. 演示示例: (1)编…
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用spring提供的其他对象或者说有一些不需要交给spring管理,但是需要用到spring里的一些对象.如果这是spring框架的独立应用程序,我们通过 ApplicationContext ac = new FileSystemXmlApplicationContext("applicationC…
一个Bean的定义可以包含大量的配置信息,包括构造器参数.属性值以及容器规范信息,比如初始化方法.静态工厂方法名字等等.一子bean的定义可以从父bean的定义中继承配置数据信息.子bean定义可以覆盖一些值只要需要也可以增加其他的值.使用父bean定义和子bean定义可以接受大量的类型说明.实际上,这也是一种形式的模板. 如果你在程序中使用一个ApplicationContext接口,子bean定义就是通过ChildBeanDefinition类来表示的.大部分用户不会在这个级别来处理它们,它…
上一篇文章介绍了对@Configuration类的处理逻辑,这些逻辑都写在ConfigurationClassPostProcessor类中. 这个类不仅是一个“bean工厂后处理器”,还是一个“bean定义注册后处理器”. 这其实是两个接口,它们都是来操作bean定义.所以非常重要. 换句话说,能操作bean定义的,也只有这两个接口,你说重要不重要. 查看下类型信息,在整个Spring中确实只有这两个接口,如下图01: 虽然它们都是进行和bean定义相关的操作,但目的却是明显不同的. bean…
在容器启动快完成时,会把所有的单例bean进行实例化,也可以叫做预先实例化. 这样做的好处之一是,可以及早地发现问题,及早的抛出异常,及早地解决掉. 本文就来看下整个的实例化过程.其实还是比较繁琐的. 一.从容器中找出所有的bean定义名称 因为不知道谁是单例bean,所以只能先全部找出来.如下图01: 二.循环遍历所有的bean名称,检查是否符合条件 首先要合并bean定义,因为bean定义可以有父子关系,类似继承. 然后这个合并后的bean定义必须是,非抽象的,单例的,非延迟初始化的. 那么…
其实对Spring的了解达到一定程度后,你就会发现,无论是使用Spring框架开发的应用,还是Spring框架本身的开发都是围绕着注解构建起来的. 空口无凭,那就说个最普通的例子吧. 在Spring中要启用一项XXX功能,标准做法就是用@EnableXXX这种“启用”类型的注解. 那么这种类型的注解一般都做了什么呢?分析一下吧. 看过本号文章的人都知道,Spring的核心就是bean定义和bean,如果我想增加某方面的功能,只需写若干个类,并作为bean定义注册到容器中即可. 因此“启用”类型的…
在bean的实例化过程中,也会用到一系列的相关注解. 如@PostConstruct和@PreDestroy用来标记初始化和销毁方法. 平常更多的是侧重于应用,很少会有人去了解它背后发生的事情. 今天就来看下它们的源码,这样它们对你来说就不再是黑盒子了,而且学习源码对每个技术人来说都是必经之路. 人们对事物的认知以及自己的做法,往往分为三个阶段: 1)最初看一个事物,非常复杂,简直没有一点头绪,此时很多人就会放弃. 2)过了一段时间后,发现整体来看没有想象中的那么难,此时很多人以为自己已经get…
@Resource是Java的注解,表示一个资源,它具有双向的含义,一个是从外部获取一个资源,一个是向外部提供一个资源. 这其实就对应于Spring的注入和注册.当它用在字段和方法上时,表示前者.当它用在类上时表示后者.Spring只提供了对前者的支持. 该注解本身表示的是资源,资源的含义是很宽泛的.由于绝大部分情况下在使用Spring的时候,它的容器里都是普通的bean,所以这个注解就作为bean的注入来使用了. 对于依赖注入这个事情,整体可以分为三步: 1)找出需要被注入的元素,即标了注解的…
在Spring中能够完成依赖注入的注解有JavaSE提供的@Resource注解,就是上一篇文章介绍的. 还有JavaEE提供的@javax.inject.Inject注解,这个用的很少,因为一般都不会去引用JavaEE的jar包. 编程新说注:JavaEE早已经被Oracle抛弃了.JavaEE这个名字已经成为历史. 还有两个就是@Value和@Autowired注解,这可是Spring自己的亲孩子.所以这两个使用的最多. 虽然注解不一样,但是目的一样,都是用来进行依赖注入,而且Spring处…
非Spring风格的代码与Spring的结合 现在的开发都是基于Spring的,所有的依赖都有Spring管理,这没有问题. 但是要突然写一些非Spring风格的代码时,可能会很不习惯,如果还要和Spring风格的代码结合起来的话,就会稍显麻烦. 因为非Spring风格的代码不由Spring管理,所以Spring不会给我们注入依赖,相反,我们要自己去Spring中拿取依赖. 所以首先目标就是要获取Spring容器,即ApplicationContext,方法通常如下图01: 定义一个类实现App…
现在的Spring相关开发都是基于SpringBoot的. 最后在打包时可以把所有依赖的jar包都打进去,构成一个独立的可执行的jar包.如下图13: 使用java -jar命令就可以运行这个独立的jar包.如下图14: 这个jar包的执行入口就是一个main函数,典型的格式如下: @SpringBootApplicationpublic class TasteSpringApplication {    public static void main(String[] args) {     …
历史还是抛弃了XML,当它逐渐尝到注解的甜头之后. 尤其是在Spring帝国,到处充满着注解的气息. 注解从一个提供附属信息的“门客”,蜕变为颇具中流砥柱的“君侯”. 注解成功登上了帝国的舞台,定会像XML一样留下浓墨重彩的一笔. 重新认识一下注解 注解其实就是注释.批注的意思.就像看书时在旁边记笔记一样. 如果把书上印刷的内容看作是原始信息,那写上的笔记则是新添加的额外信息,且这个额外信息并不会对原始信息造成破坏. 所以注解其实是为原始数据信息添加额外附加数据信息的一种方式,且对原有数据信息没…
问题的描述与方案的提出 在Spring从XML转向注解时,为了自身的开发方便,对注解含义进行了扩充(具体参考本号上一篇文章). 这个扩充直接导致了一个问题,就是需要从注解往元注解以及元元注解(即沿着从下向上的方向)里传递数据. 为了更好的描述这个问题,请再看个示例: @interface A {     String a() default "";} @A@interface B {     String a() default "";     String b()…
认真阅读,收获满满,向智慧又迈进一步... 技术不枯燥,先来点闲聊 先说点好事高兴一下.前段时间看新闻说,我国正式的空间站建设已在进行当中.下半年,长征五号B运载火箭将在海南文昌航天发射场择机将空间站核心舱发射升空.预计用2到3年将空间站建好. 虽然到时你们不让我上去,不过我也为这件事出不了什么力,算扯平了.哈哈,但是我还是会衷心的祝福你. 长征五号火箭首次采用5米大直径的箭体结构,总加注量达到780吨,起飞时共有10台发动机产生1078吨的推力,具备近地轨道25吨.地球同步转移轨道14吨的运载…
序 生活是一杯酒,有时需要麻醉自己,才能够暂时忘却痛苦与不快.生活是一杯茶,有时需要细细品味,才发现苦涩背后也会有甘甜. Spring是一杯酒,一眼望不到边的官方文档,着实让人难以下咽.Spring是一杯茶,在无边的源码中畅游之后,发现色相味道俱全. 高考状元是六月份的网红,Spring帝国是Java界的明星.状元有自己的“武功秘籍”,Spring有自己的“帝国基石”. 请随本文一起,品Spring,寻找帝国的基石. 帝国的基石 无论是大到一个国家,或是小到一个个人,都有自己赖以存在的基石.这个…
概念 BeanFactory是spring的基础类型IOC容器,提供完整的IOC服务支持 默认采用延迟初始化策略,当客户端对象访问受管对象时,才对其进行初始化和依赖注入 理解 BeanFactory将每个对象看做一个bean,通过配置文件,编码,注解等方式获取组装这个bean的 零件,最终对用户提供一个获取bean的接口 用户不用关心bean如何组装 BeanFactory简化并接管了对象间复杂的依赖绑定关系,由业务对象自己去new,去拉业务对象,变成了BeanFactory来推送业务对象,用户…
如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住性子坚持下去. 获取源码 源码的获取有多种途径 GitHub spring-framework spring-wiki 可以从GitHub上获取源代码,然后自行编译 maven 使用过maven的都知道可以通过maven下载相关的源代码和相关文档,简单方便. 这里推荐通过maven的方式构建一个we…
前面说到IOC容器在刷新之前的一些初始化工作,现在来看看在refresh()方法中,是怎样来加载注册我们自己的bean定义的. refresh()方法中有很多功能,从注释中就可以看出来 我们本次重点关注invokeBeanFactoryPostProcessors(beanFactory);这个方法 该方法里面可以获取到前面初始化好的注解读取器AnnotatedBeanDefinitionReader,前面在AnnotationConfigUtils#registerAnnotationConf…
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: package com.thunisoft.ssptsppt.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org…
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,时间不多,研究spring的进度被严重拖下来,不过我会一直坚持写完. 上章说到要带各位去看看bean定义载入的要义,其实就是loadBeanDefinitions这个方法的具体实现步骤,下面我们跟随这个方法去看下它到底是如何载入bean定义的. 上面是我截取的实现了loadBeanDefinitions的类级别截…
5.4.1  xml风格的配置 SpEL支持在Bean定义时注入,默认使用“#{SpEL表达式}”表示,其中“#root”根对象默认可以认为是 ApplicationContext,只有ApplicationContext实现默认支持SpEL,获取根对象属性其实是获取容器中的Bean. 首先看下配置方式(chapter5/el1.xml)吧: <bean id="world" class="java.lang.String"> <construct…
使用Spring注解完成Bean的定义 2010-04-21 16:48:54|  分类: spring|举报|字号 订阅     下载LOFTER客户端     通过@Autowired或@Resource来实现在Bean中自动注入的功能,但还要在配置文件中写Bean定义,下面我们将介绍如何注解Bean,从而从XML配置文件 中完全移除Bean定义的配置. 1. @Component(不推荐使用).@Repository.@Service.@Controller  只需要在对应的类上加上一个@…
转自:http://blog.csdn.net/chjttony/article/details/6259723 1.当spring的IoC容器将Bean定义的资源文件封装为Spring的Resource之后,接下来要做的就是通过Spring的资源加载器(resourceLoader)读入Bean定义资源文件的过程.对于IoC容器来说,Bean定义的载入过程就是将Bean定义资源文件读入进内存并解析转换成Spring所管理的Bean的数据结构的过程.相对于SpringIoC容器定位Bean定义资…
这里Spring管理的Bean,可以认为是一个个的Service,每个Service都是一个服务接口 自动注册Service的好处: 1.根据指定的name/id获取对应的Service,实现简单工厂 2.服务自动注册到Map中,集中管理 方案1:通过接口实现 1.声明接口:定义接口的方法,这里用到的泛型可以根据实际需要忽略 /** * @Description: 资金请求处理 接口 * -- 资金类操作的公共接口 * @author: lishh * @Date: 2019/1/16 20:4…
课程链接: 1 概述 2 代码演练 3 代码解析 1 概述 1.1 bean注解相关 a context:component-scan标签使用 问:该标签的作用是什么? 答:该标签作用是支持注解,在xml配置文件中不用配置bean了 问:该标签的使用条件是什么? 答:spring3.0之后才支持该标签的使用 b 类注解相关 @Component 通用类注解(所有实体类都可以用该注解) @Repository    注解dao类(持久层) @Service 注解Service类(服务层) @Con…