一,
1.ClassPathXmlApplicationContext---从类路径下的xml配置文件中加载上下文定义,把应用上下文定义当作类资源。
2.FileSystemXmlApplicationContext--读取文件路径下的XML配置文件并加载上下文定义。
3.XmlWebApplicationContext--读取web应用下的XML配置文件并装载上下文定义。
无论我们是从文件路径下装载应用上下文还是从类路径下装载应用上下文,将Bean加载到Bean工厂的过程都是相似的,例如下列代码展示了如何加载一个FileSystemXmlApplicationContext:
ApplicationContext context=new FileSystemXmlApplicationContext("D:foo.xml");
类似的,你也可以用ClassPathXmlApplication从应用的类路径下加载应用上下文:
ApplicationContext context=new ClassPathXmlApplication("foo.xml");
使用FileSystemXmlApplicationContext与ClassPathXmlApplication的区别在于:FileSystemXmlApplicationContext在指定的文件系统路径下查找foo.xml文件;而ClassPathXmlApplication是在所有的类路径(包含jar文件)下查找foo.xml文件。
通过现有的应用上下引用,你可以调用应用上下文的getBean()方法从Spring容器中获取Bean
二,Bean的生命周期:
传统的Java应用,Bean的生命周期很简单,使用Java关键字new进行实例化,然后改Bean就可以被使用了,一旦Bean不在被使用,则有Java自动进行垃圾回收。
相比之下,Spring容器中的Bean的生命周期就显得相对细腻多了,正确理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来自定义Bean的创建过程。
1.Spring对Bean进行实例化
2.Spring 将值和Bean的引用注入到Bean对应的属性中。
3.如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()接口方法。
4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()接口方法,将BeanFactory容器实例传入。
5.如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()接口方法,将上下文的引用传入。
6.如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()接口方法。
7.如果Bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()接口方法,类似地,如果Bean使用init-method声明了初始化方法,该方法也会被调用。
8.如果Bean实现了BeanPostProcessor接口,Spring将调用他们的postPoressAfterInitialization()方法。
9.此时此刻,Bean准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,知道该应用上下文被销毁。
10.如果Bean实现了DisposableBean接口,Spring将调用他的destory()接口方法,同样,如果Bean使用destory-method声明了销毁方法,该方法也会被调用。
三,Spring框架的模块:
Spring是由几个不同模块所构成的,当我们下载Spring文件后,在dist目录下你会看到20个不同的jar文件,组成Spring的20个jar文件依据其功能可以划分为6个不同的功能模块。
六个模块依次为:
1.Data access&Integration:{JDBC,OXM,Transaction,ORM,JMS}:数据访问集成层,由JDBC,OXM(Object--XML Mapping,它的目的是在java对象几乎总是一个 plain old Java object,或简写为 POJO,和 XML 文档之间来回转换),ORM(对象关系映射),JMS(java消息服务应用程序接口),Transaction(事物模块为你的实现了特定接口的类和所有POJO提供了编程和声明式事务管理)
2.Web and remoting:web和远程处理
3.AOP:面向切面编程
4.Instrumenttation:Instrumentation模块提供了class instrumentation支持和classloader实现,使得可以在特定的应用服务器上使用.
5.Core Spring Container:Spring核心容器,包含Core,Beans,Context,Expression Language模块.
Core和Beans模块:框架的基础部分,提供IoC(反转控制)和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正的允许你从程序逻辑中分离出依赖关系和配置。
Context模块:构建于Core和Beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法。Context模块继承了Beans的特性,然后添加了对国际化(例如资源绑定)、事件传播、资源加载和对Context的透明创建的支持。Context模块同时也支持J2EE的一些特性,例如EJB、JMX和基础的远程处理。ApplicationContext接口是Context模块的关键。
Expression Language模块:Expression Language模块提供了一个强大的表达式语言用于在运行时查询和操纵对象。它是JSP2.1规范中定义的unifed expression language的一个扩展。该语言支持设置/获取属性的值、属性的分配、方法的调用、访问数组上下文(accessiong the context of arrays)、容器和索引器、逻辑和算术运算符、命名变量以及从Spring的IoC容器中根据名称检索对象。它也支持list投影、选择和一般的list聚合。
6.Test模块:
Test模块支持使用JUnit和TestNG对Spring组件进行测试。