spring源码解析
panzm_csdn
这个作者很懒,什么都没留下…
展开
-
spring容器的基本实现之核心类介绍
spring中最核心的两个类。1 DefaultListableBeanFactory DefaultListableBeanFactory是整个bean加载的核心部分,是spring注册及加载bean的默认实现。我们先简单了解一下上面类图中的各个类的作用。AliasRegistry:定义对alias的简单增删改等操作。SimpleAliasRegistry:主要使用map作为alias的缓存,并...原创 2018-04-08 11:12:52 · 654 阅读 · 0 评论 -
获取XMlL的验证模式
XML验证模式有2种:DTD(Document Type Definition)和XSD(XML Schemas Definition)。验证模式的读取:protected int getValidationModeForResource(Resource resource) { int validationModeToUse = getValidationMode(); if (vali...原创 2018-04-20 15:12:05 · 340 阅读 · 0 评论 -
获取Document
经过了验证模式准备的步骤就可以进行Document加载了。public Document loadDocument(InputSource inputSource, EntityResolver entityResolver, ErrorHandler errorHandler, int validationMode, boolean namespaceAware) throws Excep...原创 2018-04-20 15:43:12 · 277 阅读 · 0 评论 -
解析及注册BeanDefinitions
当程序已经拥有XML文档文件的Document的实例对象时,就会被引入下面这个方法。public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException { BeanDefinitionDocumentReader documentReader = crea...原创 2018-04-20 16:44:41 · 251 阅读 · 0 评论 -
alias标签的解析
protected void processAliasRegistration(Element ele) { String name = ele.getAttribute(NAME_ATTRIBUTE); String alias = ele.getAttribute(ALIAS_ATTRIBUTE); boolean valid = true; if (!StringUtils....原创 2018-04-25 14:52:29 · 554 阅读 · 0 评论 -
import标签的解析
<import resource="a.xml"/> <import resource="b.xml"/>applicationContext.xml文件中使用import的方式导入有模块配置文件,以后若有新模块的加入,那就可以简单修改这个文件了。protected void importBeanDefinitionResource(Element ele) { ...原创 2018-04-25 15:02:28 · 942 阅读 · 0 评论 -
自定义标签的解析
探究一下自定义标签的解析过程public BeanDefinition parseCustomElement(Element ele) { return parseCustomElement(ele, null); }public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) { S...原创 2018-04-25 16:20:40 · 426 阅读 · 0 评论 -
bean的加载
bean加载的功能实现远比bean的解析要复杂得多。User user = (User) bf.getBean("user");研究AbstractBeanFactory的实现:public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); }prote...原创 2018-04-26 14:06:22 · 380 阅读 · 0 评论 -
ApplicationContext加载xml
使用BeanFactory方式加载XMLBeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanTest.xml"));使用ApplicationContext方式加载XMLApplicationContext context = new ClassPathXmlApplicationContext("beanTest.xml"...原创 2018-05-04 10:34:10 · 490 阅读 · 0 评论 -
FactoryBean的使用
一般情况下,spring通过反射机制利用bean的class属性指定实现类来实例化bean。FactoryBean接口对于spring框架来说占有重要的地位,spring本身就提供了70多个FactoryBean的实现。他们隐藏了实例化一些复杂bean的细节,给上层应用带来了便利。在该接口中还定义了以下3个方法:T getObject():返回由FactoryBean创建的bean实例,如果isS...原创 2018-04-26 14:23:27 · 148 阅读 · 0 评论 -
缓存中获取单例bean
单例在spring的同一个容器内只会被创建一次,后续再获取bean直接从单例缓存中获取,当然这里也只是尝试加载,首先尝试从缓存中加载,然后再次尝试从singletonFactories中加载。因为在创建单例的时候会存在依赖注入的情况,而在创建依赖的时候为了避免循环依赖,spring创建bean的原则是不等bean创建完成就会将创建bean的ObjectFactory提早曝光加入到缓存中,一旦下一个...原创 2018-04-26 15:45:38 · 163 阅读 · 0 评论 -
加载BeanFactory
protected void prepareRefresh() { this.startupDate = System.currentTimeMillis(); synchronized (this.activeMonitor) { this.active = true; } if (logger.isInfoEnabled()) { logger.info("Re...原创 2018-05-04 11:16:13 · 120 阅读 · 0 评论 -
功能扩展
进入prepareBeanFactory前,spring已经完成了对配置的解析,而ApplicationContext在功能上的扩展也由此展开。protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // Tell the internal bean factory to use the ...原创 2018-05-04 14:28:40 · 302 阅读 · 0 评论 -
从bean的实例中获取对象
在getBean方法中,getObjectForBeanInstance是个高频率使用的方法,无论是从缓存中获得bean还是根据不同的scope策略加载bean。总之,我们得到bean的实例后要做的第一步就是调用这个方法来检测一下正确性,其实就是用于检测当前bean是否是FactoryBean类型的bean,如果是,那么需要调用该bean对应的FactoryBean实例中的getObject()作...原创 2018-04-27 16:09:28 · 776 阅读 · 0 评论 -
加载bean
this.reader.loadBeanDefinitions(resource),这句代码是整个资源加载的切入点。(1)封装资源文件。当进入XmlBeanDefinitionReader后首先对参数Resource使用EncodedResource类进行封装。(2)获取输入流。从Resource中获取对应的InputStream并构造InputSource。(3)通过构造的InputSource...原创 2018-04-20 14:34:00 · 131 阅读 · 0 评论 -
配置文件的封装
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanTest.xml"));首先调用ClasspathResource的构造函数来构造Resource资源文件的实例对象,这样后续的资源处理就可以用Resource提供的各种服务来操作了,当有了Resource后就可以进行XmlBeanFactory的初始化了。在java中,将...原创 2018-04-20 11:02:08 · 412 阅读 · 0 评论 -
spring整体架构
spring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块。(1)Core Container Core Container(核心容器)包含有Core、Beans、Context和Expression Language模块。Core和Beans模块是框架的基础部分,提供IOC(转控制)和依赖注入特性。Core模块主要包含spring框架基本的核心工具类,spring的其他组件都...原创 2018-04-04 16:00:04 · 248 阅读 · 0 评论 -
默认标签的解析
默认标签的解析是在parseDefaultElement函数中进行的,分别对4种不同标签(import、alias、bean、beans)做了不同的处理。private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { if (delegate.nodeNameEquals(ele, I...原创 2018-04-23 09:21:55 · 159 阅读 · 0 评论 -
bean标签的解析及注册
在4种标签的解析中,对bean标签的解析最为复杂也最为重要。进入函数processBeanDefinition(ele,delegate)。protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { BeanDefinitionHolder bdHolder = deleg...原创 2018-04-23 10:01:56 · 122 阅读 · 0 评论 -
解析BeanDefinition
首先从元素解析及信息提取开始,进入BeanDefinitionDelegate类的parseBeanDefinitionElement方法。public BeanDefinitionHolder parseBeanDefinitionElement(Element ele) { return parseBeanDefinitionElement(ele, null); }public Bea...原创 2018-04-23 10:45:02 · 311 阅读 · 0 评论 -
创建用于属性承载的BeanDefinition
BeanDefinition是一个接口,在spring中存在三种实现:RootBeanDefinition、ChildBeanDefinition以及GenericBeanDefinition。三种实现均继承了AbstractBeanDefinition,其中beanDefinition是配置文件<bean>元素标签在容器中的内部表示形式。<bean>元素标签拥有class...原创 2018-04-23 11:04:45 · 201 阅读 · 0 评论 -
解析各种属性
当创建了bean信息的承载实例后,便可以进行bean信息的各种属性解析了。parseBeanDedinitionAttributes方法是对element所有元素属性进行解析。public AbstractBeanDefinition parseBeanDefinitionAttributes(Element ele, String beanName, BeanDefinition cont...原创 2018-04-23 11:21:41 · 227 阅读 · 0 评论 -
解析子元素meta
在开始解析元数据的分析前,先回顾下元数据meta属性的使用。 <bean id="user" class="com.pan.entity.User" > <meta key="testStr" value="aaaaaa"/> </bean>这段代码并不会体现在User的属性中,而是一个额外的声明,当需要使用里面的信息时可以通过B原创 2018-04-23 13:51:06 · 411 阅读 · 0 评论 -
解析子元素lookup-method
子元素lookup-method似乎不是很常用,但是在某些时候它的确是非常有用的属性,通常我们称它为获取器注入。引用《spring in action》中的一句话:获取器注入是一种特殊的方法注入,它是把一个方法声明为返回某种类型的bean,但实际要返回的bean是在配置文件里面配置的,此方法可用在设计有些可插拔的功能上,解除程序依赖。(1)首先创建一个父类package com.pan.entit...原创 2018-04-23 14:51:29 · 273 阅读 · 0 评论 -
解析子元素replaced-method
方法替换:可以在运行时用新的方法替换现有的方法。replaced-method不但可以动态地替换返回实体bean,而且还能动态地更改原有方法的逻辑。源码分析:public void parseReplacedMethodSubElements(Element beanEle, MethodOverrides overrides) { NodeList nl = beanEle.getChild...原创 2018-04-23 15:06:36 · 237 阅读 · 0 评论 -
解析子元素constructor-arg
对构造函数的解析是非常常用的。 <bean id="user" class="com.pan.entity.User" > <constructor-arg index="0" value="1"></constructor-arg> <constructor-arg index="1" va原创 2018-04-23 16:39:24 · 2277 阅读 · 2 评论 -
解析子元素property
parsePropertyElement函数完成了对property属性的提取。public void parsePropertyElements(Element beanEle, BeanDefinition bd) { NodeList nl = beanEle.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) {...原创 2018-04-24 09:19:15 · 350 阅读 · 0 评论 -
解析默认标签中的自定义标签元素
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); if (bdHolder != null) { bdHo...原创 2018-04-24 11:07:39 · 257 阅读 · 0 评论 -
注册解析的BeanDefinition
对于配置文件,解析也解析完了,装饰也装饰完了,对于得到的beanDefinition已经可以满足后续的使用要求了,唯一还剩下的工作就是注册了,也就是BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry())代码的解析了。public static void register...原创 2018-04-25 14:27:35 · 334 阅读 · 0 评论 -
获取单例
如果缓存中不存在已经加载的单例bean就需要从头开始bean的加载过程了,而spring中使用getSingleton的重载方法实现bean的加载过程。public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(beanName, "'beanName...原创 2018-04-27 16:51:22 · 407 阅读 · 1 评论