编写测试类:
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中
相关推荐
sping3.x企业应用开发实战 zip分割包1
SSH 框架集成,实现 简单的用户登陆和注册功能(内涵相关jar包 Sping4.1+Struts2.3+Hibernate4.3+MySQL驱动5.1).适合初学SSH框架的学者,供参考和学习。 注:内不包含MySQL数据库的相关表,建议运行环境在JDK 1.7...
Sping IoC 容器
### Sping翻转控制器知识点详解 #### 一、Spring IoC 容器概述 ##### 1.1 控制反转(Inversion of Control, IoC)原理 - **定义**:控制反转是一种设计模式,用于降低代码之间的耦合度。在Spring框架中,IoC容器...
5. **配置AOP**:在Spring配置文件中启用AOP并注册切面类,或者在Java配置类中使用`@EnableAspectJAutoProxy`注解。 6. **测试和验证**:编写测试用例,确保切面正确地应用到了目标对象,验证通知在预期的连接点被...
3. 容器管理:Spring容器负责初始化、配置和管理Bean,简化了应用的生命周期管理。 4. 安全性:Spring Security提供了一套完整的安全解决方案,包括认证、授权、CSRF防护等,可以方便地集成到Spring应用程序中。 5...
【标题】:尚学堂_Spring_0200_IOC_Introduction 【内容详解】: Spring 框架是 Java 应用开发中的一个重要组件,它以其依赖注入(Dependency Injection,简称 DI)和控制反转(Inversion of Control,简称 IOC)...
`sping.jar`文件是Spring框架的核心组件之一,包含了Spring框架的基本功能和依赖。在Java开发中,这个jar包扮演着至关重要的角色,因为它提供了许多关键服务,如依赖注入、事务管理、数据访问、以及与各种其他框架的...
_____________sping.cmd written by liuying_____________ ========================================================================== *主机名* *日期与时间* *时延* CTRL+C结束 -------------------------...
Spring 3.x 企业应用开发实战 大家缺少的sping资源包(四部分之二)
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和Spring是Java Web开发中的三个重要框架,它们分别负责MVC模式中的控制器、持久层管理和应用上下文管理。这组框架的整合使用,通常被称为S2SH,为开发者提供了强大的功能,提高了开发效率。...
当这三者结合时,通常Struts1.x 负责前端展示和控制流程,Spring 作为整个应用的容器,管理所有bean的生命周期,包括Struts的Action类和Hibernate的SessionFactory。Hibernate则处理数据持久化。Spring可以通过其AOP...
dwr+springmvc整合的方式一,使用maven构建,maven中使用jetty插件运行项目,使用assembly打包成zip包,zip包括项目和所有使用的jar包。如何没有网络的情况下可以直接使用jar来联系,有网络就直接使用maven就可以...
本篇将深入讲解Spring IOC如何实现bean的实例化。 首先,理解IOC的概念是至关重要的。在传统的编程模式中,开发者需要手动创建和管理对象,而在Spring IOC中,这个过程被反转,由Spring容器负责对象的创建、初始化...
Spring 3.x 企业应用开发实战 大家缺少的Sping资源包(四部分)
sping.ftl springmvc国际化文件
Spring的核心特性之一是基于IoC(Inversion of Control)容器,实现了对象的生命周期管理和依赖注入。 2. **依赖注入(DI)** 在eesy_day03sping项目中,我们可以通过XML配置文件或注解实现DI。DI允许我们在不修改...
今天有空,写了基于C#使用Spring.Net的演示实例,希望能给有需要的人带来帮助,其中演示了配置下的IOC、AOP、属性注入、构造函数注入、通知过滤器、以及不使用配置直接代码硬编的AOP动态代码过程,另外还增加了...