spring框架系统学习
http://developer.51cto.com/art/201006/205212.htm
spring详解-----AOP的深刻理解
http://developer.51cto.com/art/201105/262534.htm
Spring从菜鸟到高手
http://tonyaction.blog.51cto.com/227462/42039
java熔岩博客
http://lavasoft.blog.51cto.com/62575/d-4
--以下是具体笔记》
Spring就是面向Bean的编程 bean在Spring中作用就像Object对OOP的意义一样,没有对象的概念就像没有面向对象编程,Spring中没有Bean也就没有Spring存在的意义
我们用Spring的原因是什么,想想你会发现原来Spring解决了一个非常关键的问题他可以让 把对象之间的依赖关系转而用配置文件来管理
前面吧Bean比作一场演出中的演员的话,那Context就是这场演出的舞台背景,而Core应该就是演出的道具了
对Context来说他就是要发现每个Bean之间的关系,为它们建立这种关系并且要维护好 这种关系。所以Context就是一个Bean关系的集合,这个关系集合又叫Ioc容器
其实Core就是发现、建立和维护每 个Bean之间的关系所需要的一些列的工具,从这个角度看来,Core这个组件叫Util更能让你理解。
Bean组件在Spring的org.springframework.beans包下。这个包下的所有类主要解决了三件事:
SpringBean的创建时典型的工厂模式,他的顶级接口是BeanFactory
当Spring成功解析你定义的一个节点后,在Spring的内部他就被转化 成BeanDefinition对象。以后所有的操作都是对这个对象完成的。
Bean的解析过程非常复杂,功能被分的很细
Context在Spring的org.springframework.context包下,他实际上就是给Spring提供一个运行时的环境,用以保存各个对象的状态
ApplicationContext是Context的顶级父类 ApplicationContext继承了BeanFactory,这也说明了Spring容器中运行的主体对象是Bean
总体来说ApplicationContext必须要完成以下几件事:
◆标识一个应用环境
◆利用BeanFactory创建Bean对象
◆保存对象关系表
◆能够捕获各种事件
Core组件作为Spring的核心组件,他其中包含了很多的关键类,其中一个重要组成部分就是定义了资源的访问方式。这种把所有资源都抽象成一个接口的方式很值得在以后的设计中拿来学习
获取资源文件:Resource 接口继承了InputStreamSource接口,这个接口中有getInputStream方法
加载资源文件:ResourceLoader接口完成 他的默认实现是DefaultResourceLoader。
Context是把资源的加载、解析和描述工作委托给了ResourcePatternResolver(继承他)类来完成
Ioc容器实际上就是Context组件结合其他两个组件共同构建了一个Bean关系网,
AbstractApplicationContext.refresh方法就是构建整个Ioc容器过程的完整的代码,了解了里面的每一行代码基本上就了解大部分Spring的原理和功能了
prepareRefresh();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();//创建bean
prepareBeanFactory(beanFactory); //添加一些Spring本身需要的一些工具类
try
{ //下面三行对Spring的功能扩展性起作用
postProcessBeanFactory(beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);//主要是获取实现BeanFactoryPostProcessor接口的子类。并执行它的postProcessBeanFactory方法 它的参数是beanFactory,说明可以对beanFactory做修改
registerBeanPostProcessors(beanFactory)//执行用户自定义的操作。
initMessageSource(); //后面的几行代码是 初始化监听事件和对系统的其他监听者的注册
initApplicationEventMulticaster();
onRefresh();
registerListeners();
finishBeanFactoryInitialization(beanFactory); //下面就是Bean的实例化代码
finishRefresh();
FactoryBean,可以说Spring一大半的扩展的功能都与这个Bean有关,这是个特殊的Bean他是个工厂Bean,可以产生Bean的Bean
如果是普通的Bean就直接创建他的实例,是通过调用getBean方法
然而在Spring内部这个Bean的实例对象是FactoryBean,通过调用这个对象的getObject方 法就能获取用户自定义产生的对象,从而为Spring提供了很好的扩展性
我们把Ioc容器比作一个箱子,这个箱子里有若干个球的模子,可以用这些模子来造很多种不同的球,还有一个造这些球模的机器,这个机器可以产生球模。那么他们的对应关系就是BeanFactory就是 那个造球模的机器,球模就是Bean,而球模造出来的球就是Bean的实例。那前面所说的几个扩展点又在什么地方呢?BeanFactoryPostProcessor对应到当造球模被造出来时,你将有机会可以对其做出设 当的修正,也就是他可以帮你修改球模。而InitializingBean和DisposableBean是在球模造球的开始和结束阶段,你可以完成一些预备和扫尾工作。
Ioc它实际上就是为你构建了一个魔方,Spring为你搭好了骨骼架构,这个魔方到底能变出什么好的东西出来,这必须要有你的参与。那我们怎么参与?这就是前面说的要了解Spring中那有些扩展点 ,我们通过实现那些扩展点来改变Spring的通用行为。至于如何实现扩展点来得到我们想要的个性结果,Spring中有很多例子,其中AOP的实现就是 Spring本身实现了其扩展点来达到了它想要的特性功能