Spring随笔5

来源:互联网 发布:手机消毒器 知乎 编辑:程序博客网 时间:2024/06/03 18:14
时间 内容 问题 11.02 IOC相关

1、BeanFactory

Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IOC配置机制。我们一般称BeanFactory为IoC容器,称ApplicationContext为应用上下文。但有时为了行文方便ApplicationContext为Spring容器。

XmlBeanfaceory 通过Resource装载Spring配置信息并启动IOC容器,然后就可以通过BeanFacatory#getBean方法从IoC容器中获取Bean了。通过BeanFacory启动IoC容器时,并不会初始化配置文件中的Bean,初始化发生在第一个调用时,对于单例(singleton)的Bean来说,BeanFactory会缓存Bean实例,第二次用getBean获取Bean时将直接从IoC容器的缓存中获取Bean实例。(该缓存用HashMap实现)。

2、ApplicationContext

ApplicationContext的初始化:

ApplicationContext appctx=newClassPathXMLApplicationContext(”全路径地址”);

3、Bean的生命周期

在Web容器中的Servlet用有明确的生命周期,Spring容器中的Bean也拥有生命周期。Bean的生命周期是由多个特定的生命阶段组成的,每个生命阶段都开出了一扇门,允许外界对Bean施加控制。在spring 中,可以从两个层面定义Bean的生命周期:第一个层面是Bean的作用范围,第二个层面是实例化Bean时所经历的一系列阶段。

3.1BeanFactory中的Bean生命周期


Bean的完整生命周期从Spring容器着手实例化Bean开始,知道最终销毁Bean,这当中经过了许多关键点,每个关键点都涉及特定的方法调用,这些方法大致分为三类:

  • Bean自身的方法:电泳Bean构造函数实例化Bean,调用Set设置Bean的属性值以及通过的init-method和destory-method所指定的方法;
  • Bean级生命周期接口方法:
  • 容器级生命周期接口方法:上图中带☆的接口
3.2ApplicationContext中的Bean生命周期

ApplicationContext和BeanFactory最大的不同之处在于,前者会利用Java反射机制自动识别出配置文件中定义的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,并自动将它们注册到应用上下文中;而后者需要在代码中通过手动调用addBeanPostProcessor()方法进行注册。所以这是开发中普遍使用ApplicationContext而很少使用BeanFactory的原因之一。

4、面向对象设计6大原则

转自:http://www.cnblogs.com/cavingdeep/archive/2004/10/28/208956.html
OOD基本上有6大原则,而实际上都是互补的,也就是说一些原则需要利用另一些原则来实现自己。6大原则如下:

1) Open-Close Principle(OCP),开-闭原则,讲的是设计要对扩展有好的支持,而对修改要严格限制。这是最重要也是最为抽象的原则,基本上我们所说的Reusable Software既是基于此原则而开发的。其他的原则也是对它的实现提供了路径。

2) Liskov Substituition Principle(LSP),里氏代换原则,很严格的原则,规则是“子类必须能够替换基类,否则不应当设计为其子类。”也就是说,子类只能去扩展基类,而不是隐藏或覆盖基类,如有这方面需要的设计就应当参考以下两种方法替换:

3) Dependence Inversion Principle(DIP),依赖倒换原则,“设计要依赖于抽象而不是具体化”。换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需要哪些哪些类,因为这些是具体。这样做有什么好处呢?人的思维本身实际上就是很抽象的,我们分析问题的时候不是一下子就考虑到细节,而是很抽象的将整个问题都构思出来,所以面向抽象设计是符合人的思维的。另外这个原则会很好的支持OCP,面向抽象的设计使我们能够不必太多依赖于实现,这样扩展就成为了可能,这个原则也是另一篇文章《Design by Contract》的基石。

4) Interface Segregation Principle(ISP),“将大的接口打散成多个小接口”,这样做的好处很明显,我不知道有没有必要再继续描述了,为了节省篇幅,实际上我对这些原则只是做了一个小总结,如果有需要更深入了解的话推荐看《Java与模式》,MS MVP的一本巨作!^_^

5) Composition/Aggregation Reuse Principle(CARP),设计者首先应当考虑复合/聚合,而不是继承(因为它很直观,第一印象就是“哦,这个就是OO啊”)。这个就是所谓的“Favor Composition over Inheritance”,在实践中复合/聚合会带来比继承更大的利益,所以要优先考虑。

6) Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法则或最少知识原则,这个原则首次在Demeter系统中得到正式运用,所以定义为迪米特法则。它讲的是“一个对象应当尽可能少的去了解其他对象”。也就是又一个关于如何松耦合(Loosely-Coupled)的法则。

好了,以上是6大原则(或法则)的介绍,对这些原则的深入研究正是如何得到设计模式的道路。

5、小结

控制反转包含两个层面的意思:“控制”是接口实现类的选择控制权;“反转”是指这种选择控制权从调用类转移到外部第三方类或容器的手中。

通过学习java的反射机制,更深入的理解Spring依赖注入。

Spring框架sane最核心的接口:BeanFactory、ApplicationContext和WebApplicationContext,框架中其大部分的类都是围绕它们展开、为它们提供服务和支持。而其中Resource是一个不可忽略的接口,框架通过Resource实现了和具体资源的解耦,不论它们位于何种存储介质中,都可以通过相同的实例返回,和Resource配合的另一个接口是ResourceLoader。

Spring为Bean提供了细致周全的生命周期过程,通过配置方式进行Bean生命周期的控制。

今日任务 明日计划 问题解决 继续学习Spring AOP学习 Xml装配 pom.xml配置 TomCat war包部署
0 0