- 浏览: 958435 次
- 性别:
- 来自: 魔都
文章分类
- 全部博客 (745)
- MultiThread (19)
- My Plan (118)
- JavaBasic (61)
- MyInterview (104)
- InternetTechnique (5)
- ProjectConclusion (1)
- Maven (5)
- MogoDb (5)
- Hadoop (11)
- Memcached (6)
- TechniqueCollect (1)
- Ibaits (1)
- Android (34)
- ItLife (40)
- Tree (2)
- ProjectArchitect (7)
- Open Source (3)
- liunx (5)
- socket (8)
- Spring (27)
- DesginPattern (35)
- WebBasic (13)
- English (13)
- structs (1)
- structs2 (2)
- Oracle (17)
- Hibernate (2)
- JavaScript (4)
- Jdbc (1)
- Jvm (15)
- Ibatis (1)
- DataStructures (13)
- Https/Socket/Tcp/Ip (3)
- Linux (4)
- Webservice (7)
- Io (2)
- Svn (1)
- Css (1)
- Ajax (1)
- ExtJs (1)
- UML (2)
- DataBase (6)
- BankTechnique (3)
- SpringMvc (3)
- Nio (3)
- Load Balancing/Cluster (3)
- Tools (1)
- javaPerformanceOptimization (8)
- Lucene(SEO) (1)
- My Think (80)
- NodeJs (1)
- Quartz (1)
- Distributed-java (1)
- MySql (7)
- Project (4)
- junit (4)
- framework (1)
- enCache (1)
- git (2)
- SCJP (1)
- sd (1)
最新评论
-
lkjxshi:
你都这水平了还考这个证干嘛
SCJP 认证考试指南 -
钟逸华:
问的真多
百度java开发面试题(转) -
zuimeitulip:
觉得我就是这样的,从小阅读量就很少,导致现在的读的速度非常慢, ...
让读书成为一种习惯 -
DDT_123456:
我觉得你是不符合要求。问你hashmap的那个问题,你那样回答 ...
阿里面试2(转) -
jingjing0907:
刚刚写了很多读过此博客的感受,竟然没有发上去,以为我注册账号还 ...
让读书成为一种习惯
读Spring源码之前,你要先清楚,为什么你要用Spring...
Spring最基本的功能是做为管理bean的容器,所以我以为应该先从org.springframework.context包了解咯,包括org.springframework.web.context;
然后是org.springframework.beans
org.springframework.aop
你看那个从core开始看就可以了
从ApplicationContext
Spring中文手册是必须的~~
1.阅读源码的入口在哪里?
2.入门前必备知识了解:IOC和AOP
一、我们从哪里开始
1.准备工作:在官网上下载了Spring源代码之后,导入Eclipse,以方便查询。
2.打开我们使用Spring的项目工程,找到Web.xml这个网站系统配置文件,在其中找到Spring的初始化信息:
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
由配置信息可知,我们开始的入口就这里ContextLoaderListener这个监听器。
在源代码中我们找到了这个类,它的定义是:
- public class ContextLoaderListener extends ContextLoader
- implements ServletContextListener {
- …
- /**
- * Initialize the root web application context.
- */
- public void contextInitialized(ServletContextEvent event) {
- this.contextLoader = createContextLoader();
- if (this.contextLoader == null) {
- this.contextLoader = this;
- }
- this.contextLoader.initWebApplicationContext(event.getServletContext());
- }
- ...
- }
该类继续了ContextLoader并实现了监听器,关于Spring的信息载入配置、初始化便是从这里开始了,具体其他阅读另外写文章来深入了解。
二、关于IOC和AOP
关于Spring IOC 网上很多相关的文章可以阅读,那么我们从中了解到的知识点是什么?
1)IOC容器和AOP切面依赖注入是Spring是核心。
IOC容器为开发者管理对象之间的依赖关系提供了便利和基础服务,其中Bean工厂(BeanFactory)和上下文(ApplicationContext)就是IOC的表现形式。BeanFactory是个接口类,只是对容器提供的最基本服务提供了定义,而DefaultListTableBeanFactory、XmlBeanFactory、ApplicationContext等都是具体的实现。
接口:
- public interface BeanFactory {
- //这里是对工厂Bean的转义定义,因为如果使用bean的名字检索IOC容器得到的对象是工厂Bean生成的对象,
- //如果需要得到工厂Bean本身,需要使用转义的名字来向IOC容器检索
- String FACTORY_BEAN_PREFIX = "&";
- //这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就象一个大的抽象工厂,用户可以根据名字得到需要的bean
- //在Spring中,Bean和普通的JAVA对象不同在于:
- //Bean已经包含了我们在Bean定义信息中的依赖关系的处理,同时Bean是已经被放到IOC容器中进行管理了,有它自己的生命周期
- Object getBean(String name) throws BeansException;
- //这里根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:如果根名字取得的bean实例的Class类型和需要的不同的话。
- Object getBean(String name, Class requiredType) throws BeansException;
- //这里提供对bean的检索,看看是否在IOC容器有这个名字的bean
- boolean containsBean(String name);
- //这里根据bean名字得到bean实例,并同时判断这个bean是不是单件,在配置的时候,默认的Bean被配置成单件形式,如果不需要单件形式,需要用户在Bean定义信息中标注出来,这样IOC容器在每次接受到用户的getBean要求的时候,会生成一个新的Bean返回给客户使用 - 这就是Prototype形式
- boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
- //这里对得到bean实例的Class类型
- Class getType(String name) throws NoSuchBeanDefinitionException;
- //这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
- String[] getAliases(String name);
- }
实现:
XmlBeanFactory的实现是这样的:
- public class XmlBeanFactory extends DefaultListableBeanFactory {
- //这里为容器定义了一个默认使用的bean定义读取器,在Spring的使用中,Bean定义信息的读取是容器初始化的一部分,但是在实现上是和容器的注册以及依赖的注入是分开的,这样可以使用灵活的 bean定义读取机制。
- private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
- //这里需要一个Resource类型的Bean定义信息,实际上的定位过程是由Resource的构建过程来完成的。
- public XmlBeanFactory(Resource resource) throws BeansException {
- this(resource, null);
- }
- //在初始化函数中使用读取器来对资源进行读取,得到bean定义信息。这里完成整个IOC容器对Bean定义信息的载入和注册过程
- public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws
- BeansException {
- super(parentBeanFactory);
- this.reader.loadBeanDefinitions(resource);
- }
我们可以看到IOC容器使用的一些基本过程:
如:DefaultListableBeanFactory
- ClassPathResource res = new ClassPathResource("beans.xml");//读取配置文件
- DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
- XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
- reader.loadBeanDefinitions(res);
这些代码演示了以下几个步骤:
1. 创建IOC配置文件的抽象资源
2. 创建一个BeanFactory,这里我们使用DefaultListableBeanFactory
3. 创建一个载入bean定义信息的读取器,这里使用XmlBeanDefinitionReader来载入XML形式
的bean定义信息,配置给BeanFactory
4. 从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成,这
样完成整个载入和注册bean定义的过程。我们的IoC容器就建立起来了。
再简单的说,我的系统在启动时候,会完成的动作就是
1.由ResourceLoader获取资源文件,也即bean的各种配置文件
2.由BeanDefintion对配置文件的定义信息的载入
3.用BeanDefinitionRegistry接口来实现载入bean定义信息并向IOC容器进行注册。
注意,IOC容器和上下文的初始化一般不包含Bean的依赖注入的实现。
2)AOP这个过程并不是在注册bean的过程实现的。
我们只看到在处理相关的Bean属性的时候,使用了RuntimeBeanReference对象作为依赖信息的纪录。
在IOC容器已经载入了用户定义的Bean信息前提下,这个依赖注入的过程是用户第一次向IOC容器索要Bean的时候触发的,或者是我们可以在Bean定义信息中通过控制lazy-init属性来使得容器完成对Bean的预实例化 - 这个预实例化也是一个完成依赖注入的过程。
我们说明一下过程:
1.用户想IOC容器请求Bean。
2.系统先在缓存中查找是否有该名称的Bean(去各个BeanFactory去查找)
3.没有的话就去创建Bean并进行依赖注入,并且这个请求将被记录起来。
请求Bean具体的实现:
代码入口在DefaultListableBeanFactory的基类AbstractBeanFactory中:
- public Object getBean(String name, Class requiredType, final Object[] args) throwsBeansException {
- ...
- Object sharedInstance = getSingleton(beanName);//先去缓存取
- if (sharedInstance != null) {
- ...
- if (containsBeanDefinition(beanName)) {
- RootBeanDefinition mergedBeanDefinition = getMergedBeanDefinition(beanName, false);
- bean = getObjectForBeanInstance(sharedInstance, name,mergedBeanDefinition);
- }
- else {
- bean = getObjectForBeanInstance(sharedInstance, name, null);
- }
- }
- else {
- }
- ...
- }
注入Bean具体的实现:
具体的bean创建过程和依赖关系的注入在createBean中,这个方法在AbstractAutowireCapableBeanFactory中给出了实现:
- protected Object createBean(String beanName, RootBeanDefinition
- mergedBeanDefinition, Object[] args)
- throws BeanCreationException {
- // Guarantee initialization of beans that the current one depends on.
- // 这里对取得当前bean的所有依赖bean,确定能够取得这些已经被确定的bean,如果没有被创建,那么这个createBean会被这些IOC
- // getbean时创建这些bean
- if (mergedBeanDefinition.getDependsOn() != null) {
- for (int i = 0; i < mergedBeanDefinition.getDependsOn().length; i++) {
- getBean(mergedBeanDefinition.getDependsOn()[i]);
- }
- }
- ........
- // 这里是实例化bean对象的地方,注意这个BeanWrapper类,是对bean操作的主要封装类
- if (instanceWrapper == null) {
- instanceWrapper = createBeanInstance(beanName, mergedBeanDefinition,args);
- }
- Object bean = instanceWrapper.getWrappedInstance();
- ......
- //这个populate方法,是对已经创建的bean实例进行依赖注入的地方,会使用到在loadBeanDefinition的时候得到的那些propertyValue来对bean进行注入。
- if (continueWithPropertyPopulation) {
- populateBean(beanName, mergedBeanDefinition, instanceWrapper);
- }
- //这里完成客户自定义的对bean的一些初始化动作
- Object originalBean = bean;
- bean = initializeBean(beanName, bean, mergedBeanDefinition);
- // Register bean as disposable, and also as dependent on specified "dependsOn"beans.
- registerDisposableBeanIfNecessary(beanName, originalBean,mergedBeanDefinition);
- return bean;
- }
- .........
- }
这就是整个依赖注入的部分处理过程,在这个过程中起主要作用的是WrapperImp ,这个Wrapper不是一
个简单的对bean对象的封装,因为它需要处理在beanDefinition中的信息来迭代的处理依赖注入。
到这里,这是简单的,大概的对IOC和AOP进行了解,入门先到这一点便已经有了大概的印象了。
Spring源代码解析(一):IOC容器:http://www.javaeye.com/topic/86339
Spring源代码解析(二):IoC容器在Web容器中的启动:http://www.javaeye.com/topic/86594
Spring源代码解析(三):Spring JDBC:http://www.javaeye.com/topic/87034
Spring源代码解析(四):Spring MVC:http://www.javaeye.com/topic/87692
Spring源代码解析(五):Spring AOP获取Proxy:http://www.javaeye.com/topic/88187
Spring源代码解析(六):Spring声明式事务处理:http://www.javaeye.com/topic/88189
Spring源代码解析(七):Spring AOP中对拦截器调用的实现:http://www.javaeye.com/topic/107785
Spring源代码解析(八):Spring驱动Hibernate的实现:http://www.javaeye.com/topic/110801
Spring源代码解析(九):Spring Acegi框架鉴权的实现:http://www.javaeye.com/topic/112979
Spring源代码解析(十):Spring Acegi框架授权的实现:http://www.javaeye.com/topic/113436
发表评论
-
spring原理
2013-07-31 23:21 8771、spring原理 s ... -
通过实例浅谈Spring运作机制
2013-07-31 23:06 1173看到这个标题大家可能又想:哎,又一个重新发明轮子的人。在这里 ... -
spring用到的设计模式
2013-06-24 21:45 1199spring源码也读了两遍了,但对于里面描述的关系还是不太 ... -
SPRING事务的属性有哪些?其中,事务隔离级别有哪几种?什么情况需要使用这几种事务隔离级别?
2013-04-14 20:45 3859Spring 声明式事务,propagation属性列表 PR ... -
Spring定时任务的几种实现
2013-01-24 10:32 1016Spring定时任务的几种实现 近日项目开发中需要执行一些 ... -
Spring多数据源解决方案
2012-10-02 22:49 1095... -
spring是如何管理 事务的
2012-07-08 14:43 1529Spring提供的事务管理可以分为两类:编程式的和声明式的。 ... -
【第六章】 AOP 之 6.9 代理机制 ——跟我学spring3
2012-07-07 12:36 874Spring AOP通过代理模式实现,目前支持两 ... -
【第九章】 Spring的事务 之 9.1 数据库事务概述 ——跟我学spring3
2012-07-07 12:37 9919.1 数据库事务概述 事 ... -
【第九章】 Spring的事务 之 9.2 事务管理器 ——跟我学spring3
2012-07-07 12:37 10069.2.1 概述 ... -
【第九章】 Spring的事务 之 9.3 编程式事务 ——跟我学spring3
2012-07-06 00:03 9149.3 编程式事务 9.3.1 编程式事务 ... -
【第九章】 Spring的事务 之 9.4 声明式事务 ——跟我学spring3
2012-07-06 00:03 7589.4 声明式事务 9.4.1 声明式事务 ... -
我对AOP的理解
2012-07-06 00:02 8881、问题 问题:想要添加日志记录 ... -
我对IoC/DI的理解
2012-07-06 00:01 1026IoC IoC: Inversion of ... -
基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
2012-07-06 00:02 2358基于JDK动态代理和CGLIB动态代理的实现S ... -
Spring对事务管理的支持的发展历程(基础篇)
2012-07-05 23:00 9811、问题 Java代 ... -
spring aop 详解
2012-07-01 18:41 1186文章链接:http://stamen.itey ... -
Spring ioc 详解
2012-07-01 18:14 2052文章链接:http://stamen.itey ... -
spring事务探索
2012-07-01 16:46 1007文章链接:http://www.iteye.com/topic ... -
spring aopframework实现
2012-06-18 09:51 1096package cn.itcast.day3.aopfr ...
相关推荐
这个压缩包“教你阅读Spring源码资源.zip”包含了调试代码、Spring库和JDK库,提供了学习Spring源码的良好起点。 首先,让我们从源码的主要部分开始。Spring的核心组件包括IoC(Inversion of Control,控制反转)...
Spring源代码解析(一):IOC容器 Spring源代码解析(二):IoC容器在Web容器中的启动 Spring源代码解析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源...
10. **源码分析**:深入阅读Spring源码,可以帮助我们理解其内部设计思想,如事件驱动、设计模式的应用(如单例、工厂、装饰者等)、类加载机制以及线程安全等Java编程基础。 以上只是Spring框架中部分关键知识点的...
"spring源码" 是指 Spring 框架的源代码。 部分内容解释 1. 下载 GitHub 客户端安装 下载 GitHub 客户端是因为 Spring 源码托管在 GitHub 上,所以我们需要下载 GitHub 客户端来 clone Spring 源码。安装成功后,...
Spring 源码注释中文版的提供,使得开发者能够更加深入地理解 Spring 的工作原理,无需经过复杂的编译过程,可以直接阅读源码注释来学习。 Spring 框架主要由以下几个关键模块组成: 1. **Core Container(核心...
Spring源代码解析1:IOC容器.doc Spring源代码解析2:IoC容器在Web容器中的启动.doc Spring源代码解析3:Spring JDBC .doc Spring源代码解析4:Spring MVC .doc Spring源代码解析5:Spring AOP获取Proxy .doc Spring...
阅读Spring源码以及学习Spring设计思想的总结型项目,仿照spring框架思想,实现的自研简_SimpleFramework
Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码...
通过阅读Spring源码,开发者不仅可以理解其设计思想和实现机制,还能学习到如何编写高质量、可维护的代码。对于希望提升自身技能的Java开发者来说,深入研究Spring源代码是一项非常有价值的实践。
这个压缩包文件中的"spring源码 中英文注释"为开发者提供了一个深入理解Spring框架内部工作原理的机会。通过阅读源码和注释,我们可以更清晰地了解Spring如何管理依赖注入、AOP(面向切面编程)、事务管理、上下文...
在Spring源码的压缩包中,"Spring源码.txt"可能包含了源代码的说明、导入指南或其他相关信息。打开这个文本文件,可以获取更多关于如何使用和理解Spring源码的提示。 总的来说,获取并研究Spring的源代码是提升Java...
在阅读Spring源码笔记时,建议结合实际项目经验,逐步理解并实践源码中的关键概念。"查看密码,打开必看.txt"可能是提供解压文件的密码,确保正确解压并阅读PDF文档,以获得完整的知识体系。 总之,Spring源码学习...
JavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源...
要真正精通Spring源代码,除了理解上述知识点外,还需要阅读和分析Spring的源码,理解其实现细节和设计模式。Spring源码中包含了大量优秀的编程实践,如工厂模式、代理模式、观察者模式等,这些都是提升编程技能的...
《Spring实战》第五版的源代码压缩包"spring实战全部源代码.zip"包含了全面的示例项目,旨在帮助读者深入理解和应用Spring框架。这个压缩包中的"spring-in-action-5-samples-master"目录揭示了书中的各个实战案例,...
通过阅读这些源代码,开发者可以学习到Spring如何实现依赖注入(Dependency Injection,DI),这是Spring的核心特性之一。DI使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。此外,你还能看到AOP(面向...
个人觉得spring3.2的源代码比较好编译,没啥脾气,像我之前下载的spring的最新版本源代码,还有spring4.0的源代码,不论是使用jdk1.6还是1.7甚至是1.8编译都出问题,结果还是觉得spring3.2编译过程轻松一点,配合...
Xmind是一种强大的思维导图工具,它可以清晰地展现Spring源码中的类、接口和方法关系,使得源码阅读更加有序。 总的来说,"Spring源码解析"这个压缩包为我们提供了一个系统性学习Spring源码的途径。通过深入学习和...