`

sping4.1.x IOC容器资源Bean注册流程详解

阅读更多

编写测试类:

package cn.smallbug.spring.testioc;

public interface PersonService {

	public void save();
}
public class PersonServiceImpl implements PersonService {

	public PersonServiceImpl(){
		System.out.println("3333333333333");
	}
	@Override
	public void save() {
		System.out.println("person save!");
	}

}
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

	<bean id="personService" class="cn.smallbug.spring.testioc.PersonServiceImpl"></bean>

</beans>
package cn.smallbug.spring.testioc;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Testioc {

	@Test
	public void test01() {
		ApplicationContext context = //
		new FileSystemXmlApplicationContext(//
				"E:/eclipseWorkspace/WorkSpace01/spring/src/test/resources/testioc.xml");
		PersonService service = (PersonService) context.getBean("personService");
		service.save();
	}
}

 <1>继承

接口继承



 

实体



 

 

时序图

 

<2>流程

定位资源:

 

类:FileSystemXmlApplicationContext

方法:Constructor

1) setConfigLocations(configLocations); //设置资源地址字符串(XML文件地址)

2) refresh(); //调用基类的refresh()方法

 

类:AbstractApplicationContext

方法:refresh()

3) obtainFreshBeanFactory()

方法:obtainFreshBeanFactory

4) refreshBeanFactory()

 

类:AbstractRefreshableApplicationContext

方法:refreshBeanFactory()

5) createBeanFactory(); //创建DefaultListableBeanFactory对象,作为实际的IOC容器

6) loadBeanDefinitions(beanFactory); //模板方法模式调用子类实现

 

类:AbstractXmlApplicationContext

方法:loadBeanDefinitions(DefaultListableBeanFactory beanFactory)

7) new XmlBeanDefinitionReader(beanFactory); //创建读取资源的Reader类

8) loadBeanDefinitions(beanDefinitionReader);

方法:loadBeanDefinitions(XmlBeanDefinitionReader reader)

9) reader.loadBeanDefinitions(configLocations);//这个方法有两种情况,分别处理Resource资源和String资源

 

类:AbstractBeanDefinitionReader

方法:loadBeanDefinitions(String... locations)

10) for (String location : locations) {

counter += loadBeanDefinitions(location);

}

方法:loadBeanDefinitions(String location)

11) return loadBeanDefinitions(location, null);

 

方法:loadBeanDefinitions(String location, Set<Resource> actualResources)

12) ResourceLoader resourceLoader = getResourceLoader();//该对象将String转化为Resource

13) ((ResourcePatternResolver) resourceLoader).getResources(location);//转换资源AbstractApplicationContext

 

类:AbstractApplicationContext

方法:getResources(String locationPattern)

14) return this.resourcePatternResolver.getResources(locationPattern);

 

类:PathMatchingResourcePatternResolver

方法:getResources(String locationPattern)

15) return new Resource[] {getResourceLoader().getResource(locationPattern)};

 

类:DefaultResourceLoader

方法:getResource(String location)

16) return getResourceByPath(location);

 

类:FileSystemXmlApplicationContext

方法:getResourceByPath(String path)

17) return new FileSystemResource(path);//创建一个Resource并返回

 

 

 

加载资源:

类:AbstractBeanDefinitionReader

方法:loadBeanDefinitions(String location, Set<Resource> actualResources)

18) int loadCount = loadBeanDefinitions(resources);

方法:loadBeanDefinitions(Resource... resources)

19) for (Resource resource : resources) {

counter += loadBeanDefinitions(resource);//循环加载注册资源

}

 

类:XmlBeanDefinitionReader

方法:loadBeanDefinitions(EncodedResource encodedResource)

20) InputStream inputStream = encodedResource.getResource().getInputStream();//创建IO流

21) return doLoadBeanDefinitions(inputSource, encodedResource.getResource());

方法:doLoadBeanDefinitions(InputSource inputSource, Resource resource)

22) Document doc = doLoadDocument(inputSource, resource);//将读入的资源转化为Docuemnt

23) return registerBeanDefinitions(doc, resource);

方法:registerBeanDefinitions(Document doc, Resource resource)

24) BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();

25) documentReader.registerBeanDefinitions(doc, createReaderContext(resource));

 

类:DefaultBeanDefinitionDocumentReader

方法:registerBeanDefinitions(Document doc, XmlReaderContext readerContext)

26) Element root = doc.getDocumentElement();将Document转化为Element

27) doRegisterBeanDefinitions(root);

方法:doRegisterBeanDefinitions(Element root)

28) this.delegate = createDelegate(getReaderContext(), root, parent);//很重要,解析Element使用的就是这个对象

29) parseBeanDefinitions(root, this.delegate);

方法:parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate)

30) NodeList nl = root.getChildNodes();

for (int i = 0; i < nl.getLength(); i++) {//逐条解析,对应每一个Bean

Node node = nl.item(i);

if (node instanceof Element) {

Element ele = (Element) node;

if (delegate.isDefaultNamespace(ele)) {

parseDefaultElement(ele, delegate);//解析import,alias,bean,beans

}

else {

delegate.parseCustomElement(ele);

}

}

}

方法:parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate)

31) processBeanDefinition(ele, delegate);//解析bean

方法: processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)

32) BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);

方法: parseBeanDefinitionElement(Element ele, BeanDefinition containingBean)

33) String id = ele.getAttribute(ID_ATTRIBUTE);//读取ID

34) String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);//读取name

35) AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);//进一步解析

36) return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);//将解析好的BeanDefinition装入BeanDefinitionHolder

 

注册资源

类:DefaultBeanDefinitionDocumentReader

方法:processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)

37) BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());

 

类:DefaultListableBeanFactory

方法:registerBeanDefinition(String beanName, BeanDefinition beanDefinition)

38) this.beanDefinitionNames.add(beanName);

this.manualSingletonNames.remove(beanName);

this.frozenBeanDefinitionNames = null;

this.beanDefinitionMap.put(beanName, beanDefinition);

 

定义如下:

/** List of bean definition names, in registration order */

private final List<String> beanDefinitionNames = new ArrayList<String>(64);

/** List of names of manually registered singletons, in registration order */

private final Set<String> manualSingletonNames = new LinkedHashSet<String>(16);

/** Map of bean definition objects, keyed by bean name */

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64);

可见最终bean资源其实是注册到了BeanFactory子类的一个ConcurrentHashMap中

 

 

 

  • 大小: 223.4 KB
  • 大小: 6.1 KB
1
4
分享到:
评论

相关推荐

    sping3.x企业应用开发实战

    sping3.x企业应用开发实战 zip分割包1

    Sping4.1+Struts2.3+Hibernate4.3+MySQL驱动5.1(SSH 简单实力整合--用户的登录验证和.注册)内包含jar包

    SSH 框架集成,实现 简单的用户登陆和注册功能(内涵相关jar包 Sping4.1+Struts2.3+Hibernate4.3+MySQL驱动5.1).适合初学SSH框架的学者,供参考和学习。 注:内不包含MySQL数据库的相关表,建议运行环境在JDK 1.7...

    Sping IoC 容器

    Sping IoC 容器

    Sping翻转控制器

    ### Sping翻转控制器知识点详解 #### 一、Spring IoC 容器概述 ##### 1.1 控制反转(Inversion of Control, IoC)原理 - **定义**:控制反转是一种设计模式,用于降低代码之间的耦合度。在Spring框架中,IoC容器...

    SpingAOP.rar

    5. **配置AOP**:在Spring配置文件中启用AOP并注册切面类,或者在Java配置类中使用`@EnableAspectJAutoProxy`注解。 6. **测试和验证**:编写测试用例,确保切面正确地应用到了目标对象,验证通知在预期的连接点被...

    spring4.x________

    3. 容器管理:Spring容器负责初始化、配置和管理Bean,简化了应用的生命周期管理。 4. 安全性:Spring Security提供了一套完整的安全解决方案,包括认证、授权、CSRF防护等,可以方便地集成到Spring应用程序中。 5...

    尚学堂_Sping_0200_IOC_Introduction

    【标题】:尚学堂_Spring_0200_IOC_Introduction 【内容详解】: Spring 框架是 Java 应用开发中的一个重要组件,它以其依赖注入(Dependency Injection,简称 DI)和控制反转(Inversion of Control,简称 IOC)...

    sping.jar包

    `sping.jar`文件是Spring框架的核心组件之一,包含了Spring框架的基本功能和依赖。在Java开发中,这个jar包扮演着至关重要的角色,因为它提供了许多关键服务,如依赖注入、事务管理、数据访问、以及与各种其他框架的...

    sping.cmd&ping;命令加强脚本(含时间戳)windows版

    _____________sping.cmd written by liuying_____________ ========================================================================== *主机名* *日期与时间* *时延* CTRL+C结束 -------------------------...

    Spring 3.x 企业应用开发实战 大家缺少的sping资源包(四部分之四)

    Spring 3.x 企业应用开发实战 大家缺少的sping资源包(四部分之二)

    tomcat2WAS9.rar

    spring4.3.x、CXF3.2.x框架部署到Websphere9,在TOMCAT8.5跑没问题,到WAS9上各种冲突,框架用的jar和工具都...框架使用sping4.3.x,CXF3.2.x,Mybatis3.4,集成了xml读取,poi用来excel写入,easyexcel读取防止内存溢出

    struts2 +hibernate3.x + sping 所有类库 jar包

    Struts2、Hibernate3.x和Spring是Java Web开发中的三个重要框架,它们分别负责MVC模式中的控制器、持久层管理和应用上下文管理。这组框架的整合使用,通常被称为S2SH,为开发者提供了强大的功能,提高了开发效率。...

    Struts1.x+sping2.0+hibernate3.0

    当这三者结合时,通常Struts1.x 负责前端展示和控制流程,Spring 作为整个应用的容器,管理所有bean的生命周期,包括Struts的Action类和Hibernate的SessionFactory。Hibernate则处理数据持久化。Spring可以通过其AOP...

    dwr+springmvc整合方式一

    dwr+springmvc整合的方式一,使用maven构建,maven中使用jetty插件运行项目,使用assembly打包成zip包,zip包括项目和所有使用的jar包。如何没有网络的情况下可以直接使用jar来联系,有网络就直接使用maven就可以...

    SpingIOC注入实例化bean

    本篇将深入讲解Spring IOC如何实现bean的实例化。 首先,理解IOC的概念是至关重要的。在传统的编程模式中,开发者需要手动创建和管理对象,而在Spring IOC中,这个过程被反转,由Spring容器负责对象的创建、初始化...

    Spring 3.x 企业应用开发实战 大家缺少的Sping资源包(四部分)

    Spring 3.x 企业应用开发实战 大家缺少的Sping资源包(四部分)

    sping.ftl springmvc国际化文件

    sping.ftl springmvc国际化文件

    eesy_day03sping.zip

    Spring的核心特性之一是基于IoC(Inversion of Control)容器,实现了对象的生命周期管理和依赖注入。 2. **依赖注入(DI)** 在eesy_day03sping项目中,我们可以通过XML配置文件或注解实现DI。DI允许我们在不修改...

    Spring.Net演示实例(IOC、AOP、属性注入、构造函数注入、通知过滤器)

    今天有空,写了基于C#使用Spring.Net的演示实例,希望能给有需要的人带来帮助,其中演示了配置下的IOC、AOP、属性注入、构造函数注入、通知过滤器、以及不使用配置直接代码硬编的AOP动态代码过程,另外还增加了...

Global site tag (gtag.js) - Google Analytics