一.Bean的自注册过程 二.自注册过程说明 ConfigurationClassParser解析流程  1.处理@PropertySources注解,配置信息的解析 2.处理@ComponentScan注解:使用ComponentScanAnnotationParser扫描basePackage下的需要解析的类(@SpringBootApplication注解也包括了@ComponentScan注解,只不过basePackages是空的,空的话会去获取当前@Configuration修饰的类所…
原文地址:http://blog.csdn.net/bluishglc/article/details/12709557 Spring-Security的启动加载细节   Spring-Security的启动和Spring框架的启动是一致的,都是从加载并解析xml配置文件开始的,spring通过注册自己的ServletContextListener:ContextLoaderListener,来监听ServletContext,一旦ServletContext建立完成,spring就开始加载并解…
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring源码-IOC部分-Xml Bean解析注册过程[3] Spring源码-IOC部分-自定义IOC容器及Bean解析注册[4] Spring源码-IOC部分-Bean实例化过程[5] Spring源码-IOC部分-Spring是如何解决Bean循环依赖的[6] 本文以Xml Bean解析为例,步骤如下…
在分析Spring 容器创建过程时,我们知道容器默认会加载一些后置处理器PostPRocessor,以AnnotationConfigApplicationContext为例,在构造函数中初始化reader时,加载默认后置处理器.其中 ConfigurationClassPostProcessor这个后置处理器专门处理带有@Configuration注解的类,ConfigurationClassPostProcessor后置处理实现了BeanDefinitionRegistryPostProce…
上一个章节,笔者向大家介绍了spring是如何来过滤配置类的,下面我们来看看在过滤出配置类后,spring是如何来解析配置类的.首先过滤出来的配置类会存放在configCandidates列表, 在代码<1>处会先根据配置类的权重做一个排序,权重越低的配置类排在越前,在解析的时候也越先解析.之后会根据configCandidates列表生成一个set集合candidates,防止configCandidates列表存在相同的元素.之后会在<3>处解析这些配置类,并在<4>…
在上一章笔者介绍了ConfigurationClassParser.doProcessConfigurationClass(...)方法,在这个方法里调用了processImports(...)方法处理配置类的@Import注解,getImports(sourceClass)能从一个配置类上获取@Import注解配置的所有类形成一个集合,如果集合不为空则会在下面代码的<1>处开始遍历处理. 如果一个类是ImportSelector接口的实现类,会进入<2>处的分支,并在<3&…
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring源码-IOC部分-Xml Bean解析注册过程[3] Spring源码-IOC部分-自定义IOC容器及Bean解析注册[4] Spring源码-IOC部分-Bean实例化过程[5] Spring源码-IOC部分-Spring是如何解决Bean循环依赖的[6] 上文介绍了一些常用容器及初始化.Bean…
前情回顾 上篇<Spring读书笔记--bean加载>我们从代码角度介绍了有哪些类负责解析XML文件,又是如何一步步从XML格式脱变成我们熟悉的bean的,直到DefaultBeanDefinitionDocumentReader的registerBeanDefinitions方法.我们抽丝剥茧,终于快看到Spring是如何解析bean的代码了. 在此之前,我们回一下上篇看到过的主要类和方法 XmlBeanFactory(XmlFactory) -> XmlBeanDefinitionR…
public class Test { public static void main(String[] args) throws Exception { BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("bean.xml")); Person person = beanFactory.getBean("person",Person.class); person.info(); }…
Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Spring是如何解决循环依赖? 今天解读Spring核心方法refresh()中最最重要的一个方法finishBeanFactoryInitialization()方法,该方法负责初始化所有的单例bean. finishBeanFactoryInitialization()方法位于refresh()中下标为…
本文是作者原创,版权归作者所有.若要转载,请注明出处. 首先是配置类 package com.lusai.config; import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration; @Configuration@ComponentScan("com.lusai.service")public class S…
IOC容器初始化分为三个步骤,分别是: 1.Resource定位,即BeanDefinition的资源定位. 2.BeanDefinition的载入 3.向IOC容器注册BeanDefinition 下面我们来详细展开这三部分的内容 一.Resource定位 以ApplicationContext的具体实现FileSystemXmlApplicationContext来介绍Resource定位的过程: IOC容器初始化类比为用木桶来装水,Resource的定位过程就是寻找水的过程. 它是由Res…
通过上一篇源码的分析已经完成了BeanDefinition资源文件的定位,本篇继续分析BeanDefinition资源文件的载入和解析. AbstractBeanDefinitionReader的loadBeanDefinitions(String location,Set<Resouce> actualResouces)方法完成定位,紧接着调用loadBeanDefinitions()方法: public int loadBeanDefinitions(Resource... resourc…
彻底读懂Spring(二)你知道Spring是怎么解析配置类的吗? 推荐阅读: Spring官网阅读系列 彻底读懂Spring(一)读源码,我们可以从第一行读起 Spring执行流程图如下: 如果图片显示不清楚可以访问如下链接查看高清大图: Spring执行流程图 这个流程图会随着我们的学习不断的变得越来越详细,也会越来越复杂,希望在这个过程中我们都能朝着精通Spring的目标不断前进! 在上篇文章我们学习了Spring中的第一行代码,我们已经知道了Spring中的第一行代码其实就是创建了一个A…
BeanFactoryPostProcessor 在前面几个章节,笔者有介绍过BeanFactoryPostProcessor,在spring在解析BeanDefinition之后,正式初始化bean之前,会回调我们编写的BeanFactoryPostProcessor接口,接口会传入beanFactory对象,我们可以新增或修改BeanDefinition.spring初始化bean一个典型的流程,就是根据我们标记在类上的@Component生成一个BeanDefinition,BeanDef…
在上一章中笔者介绍了refresh()的<1>处是如何获取beanFactory对象,下面我们要来学习refresh()方法的<2>处是如何调用invokeBeanFactoryPostProcessors方法执行bean工厂后置处理器,这个方法在笔者看来是整个refresh()方法最重要的方法之一,因为就是在这个方法完成了扫描类路径下所有的类,并将类解析成BeanDefinition注册到spring容器中. public abstract class AbstractAppli…
一.前言    在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂模式的概念.在来阅读此篇博文,效果会比较好. 二.知识储备 在介绍本文的之前,不了解或不知道如何解析XML的,请先去学习一下XML的解析.掌握目前主要的几种解析XML中的一种即可,以下博文说明了如何采用Dom4J解析XML文件的,接下去的例子也是常用Dom4J来解析XML.博文地址参考:http:/…
一.BeanFactory介绍 1.1.Bean: 在Spring技术中是基于组件的 最基本了是最常用的单元 其实实例保存在Spring的容器当中 Bean通常被定义在配置文件当中,Bean实例化由Spring的Ioc容器进行管理,Bean的实例可以通过Beanfactory进行访问,实际上大部分J2EE应用,Bean是通过ApplicationContext来访问的,ApplicationContext是BeanFactory的子接口,功能要比BeanFactory强大许多 1.2.BeanF…
1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式:  单例模式是指控制其他对象获得该对象永远只有同一个对象  而多例模式则是根据需要从某个具体集合中获取所需的对象 import java.util.ArrayList; import java.util.List; public class Car implements Moveable{ private static Car…
[java] view plaincopyprint? Java实例的属性值可以有很多种数据类型.基本类型值.字符串类型.java实例甚至其他的Bean实例.java集合.数组等.所以Spring允许通过如下几个元素为Bean实例的属性指定值: value ref bean list.set.map.props 一.value:设置普通属性值 <value.../>元素用于指定字符串类型.基本类型的属性值.Spring使用XML解析器来解析出这些数据,然后利用java.beans.Proper…
在XML中配置bean元素的时候,我们常常要用到parent属性,这个用起来很方便就可以让一个bean获得parent的所有属性 在spring中,这种机制是如何实现的?     对于这种情况 transactionProxy01的parent属性是transactionProxy1 此时我们要获取transactionProxy01的实例 spring应该如何处理呢? <bean id="transactionProxy01" parent="transactionP…
创建Bean的三种方式在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法.实际上,Spring支持使用以下三种方式来创建Bean:(1)调用构造器创建Bean(2)调用静态工厂方法创建Bean(3)调用实例工厂方法创建Bean一 构造器创建Bean实例如果不采用构造注入,Spring底层会调用Bean类的无参数构造器来创建实例,因此该类必须要提供无参数的构造器,并且class属性的值就是该B…
Bean详解 Spring框架的本质其实是:通过XML配置来驱动Java代码,这样就可以把原本由java代码管理的耦合关系,提取到XML配置文件中管理.这样就实现了系统中各组件的解耦,有利于后期的升级和维护.1.Bean的基本定义和Bean别名<beans>元素是Spring配置文件的根元素,该元素可以指定如下属性:default-lazy-init:指定<beans>元素下配置的所有bean默认的延迟初始化行为default-merge:指定<beans>元素下配置的…
之前写过bean的解析,这篇来讲讲bean的加载,加载要比bean的解析复杂些,该文之前在小编原文中有发表过,要看原文的可以直接点击原文查看,从之前的例子开始,Spring中加载一个bean的方式: TestBean bean = factory.getBean("testBean"); 来看看getBean(String name)方法源码, @Override public Object getBean(String name) throws BeansException { re…
主要流程: 1.读取配置文件 2.实例化bean和填充bean属性 这个粗略的流程感觉更像是一个需求,有了这个需求,那么spring内部是怎么处理的呢? 我们知道spring的两个核心接口BeanFactory和ApplicationContext.BeanFactory主要定义容器的核心方法,ApplicationContext加以扩展,主要使用的还是ApplicationContext.在ApplicationContext的子类中,AbstractApplicationContext中的r…
1.在pom.xml中添加maven坐标 <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>4.0.3.RELEASE</version></dependency> <dependency> <groupId&…
一个公共工程中的Spring配置文件,可能会被多个工程引用.因为每个工程可能只需要公共工程中的一部分Bean,所以这些工程的Spring容器启动时,需要区分开哪些Bean要创建出来.另一种场景是:想通过Properties文件中的配置开关,就将Spring配置文件中Bean的实现切换成另一套. 方法一:Qulifier区分Bean 1.1应用实例 以Apache开源框架Jetspeed中的一段配置为例:page-manager.xml ==============================…
spring是我经常使用的框架,可是你真的对spring理解吗? 还是只知道它得使用.如果你想知道它真实的面目请仔细向下看. 1.spring是如何知道哪些Bean需要实例化的? 容器启动过程中,首先调用DispatcherSerlvet的init方法,init方法内部根据web.xml的配置,读取配置的上下文readspring-servlet.xml,然后逐句解析该上下文,当它读取到context:component-scan标签时,就启动对应的解析器,也可以叫做扫描器,对应的Class为:…
一:前言 二:spring的配置文件 三:依赖的第三方库.使用技术.代码布局 四:Document实现 五:获取Element的实现 六:解析Element元素 七:Bean创造器 八:Ioc容器的创建 九:总结 一:前言: Spring作为Bean的管理容器,在我们的项目构建中发挥了举足轻重的作用,尤其是控制反转(IOC)和依赖(DI)注入的特性,将对象的创建完全交给它来实现,当我们把与其他框架进行整合时,比如与Mybatis整合,可以把sqlMapClientTemplate.数据源等Bea…
(重要:spring bean的生命周期. spring的bean周期,装配.看过spring 源码吗?(把容器启动过程说了一遍,xml解析,bean装载,bean缓存等)) 完整的生命周期概述(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean 去一些企业面试时,经常会被问到Spring的问题,有一次就被问到关于Spring中Bean的生命周期是怎样的?其实这也是在业务中经常会遇到的,但容易遗忘,所以专门总结一下以备…