spring架构
Spring架构是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块:
1, core container
core container核心容器包含有core,beans,context和Expression Language模块。core和beans是框架的基础部分,提供控制反转和依赖注入的特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正的允许你从逻辑中分离出依赖关系和配置。
core模块:主要包含Spring框架基本的核心工具类,Spring中的其他组件都要使用到这个包里面的类,core模块是其他组件的基本核心。
beans模块:该模块是 所以应用都要用到的,它包含访问配置文件,创建和隔离bean以及进行Inversion of control/Dependency Injection 即IOC和DI操作相关的所有类。
context模块:该模块构建于core和beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问法。Context模块基础了beans的特性,为Spring核心提供了大量扩展,添加了对国际化(例如资源绑定),事件传播,资源加载和对Context的透明创建的支持,同时也支持J2EE的一些特性,如EJB,JMX和基础的远程处理。ApplicationContext接口是Context模块的关键。
Expression Language模块:提供了一个强大的表达式语言用于在运行时查询和操作对象。它是JSP2.1规范中定义的unifed expression language的一个扩展。该语言支持设置/获取属性,属性的分配,方法的调用,访问数组上下文(accessiong the context of arrays),容器和索引器,逻辑和算术运算符,命令变量以及从Spring IOC容器中根据名称检索对象。它也支持LIST投影,选择和一般的list聚合。
2. Data Access/Integration
Data Access/Integration层包含有JDBC,ORM,OXM,JMS和Transaction模块。
JDBC模块:JDBC模块提供了一个JDBC抽象层,它可以消除冗长的JDBC编码和解析数据库厂商特有的错误代码。这个模块包含了Spring对JDBC数据访问进行的封装的所有类。
ORM模块:ORM模块为流行的对象-关系映射API,如JPA,JDO,Hibernate,mybatis等,提供了一个交互层。利用ORM封装包,可以混合使用Spring提供的特性进行O/R映射。如简单声明性事务管理。
OXM模块:OXM提供了一个对Object/XML映射实现的抽象层,OXM实现包括JAXB,Caster,XMLBeans,JiBX和XStream。
JMS模块:Java messaging Service,主要包含了一些制造和消费消息的特性。
Transaction模块:支持编程性和声明性的事务管理,这些事务类必须实现特定的接口,并且对所有的POJO都适用。
3. Web
web上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文,所以Spring框架支持Struts的集成,Web模块还简化了处理部分请求以及将请求参数绑定到域对象的工作。Web模块包含了Web,Web-servlet,Web-Struts和Web-Porlet模块。
Web模块:提供了基础的面向web的集成特性,例如:多文件上传,使用Servlet Listeners初始化IOC容器以及一个面向Web的应用上下文。它还包含Spring远程支持中Web的相关部分。
Web-Servlet模块:Spring MVC。
Web-Struts模块:对Struts的支持。
Web-Porlet模块:对Portlet环境和Spring MVC的实现。
4. AOP
AOP模块提供了一个AOP联盟标准的面向切面编程的实现,它可以让你定义如方法拦截器和切点,从而将不同的逻辑代码分开,从而降低代码之间的耦合性,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中。这有点像.NET中的attribute技术。
通过配置管理特性,SpringAOP模块直接将面向切面编程集成到了Spring框架中,所以可以很容易的使Spring框架管理的任何对象支持AOP。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
Aspects模块提供了对AspectsJ的集成支持。
Instrumentation模块提供了class instrumentation支持和classloader实现,使得可以在特定的应用服务器上使用。
5.Test Test模块支持使用JUnit和TestNG对Spring组件进行测试。
一, 容器的基本实现
在Spring中bean是最核心的东西,因为Spring就像一个大水桶,而bean就是水桶中的水,所以如果没有水,那么水桶也就没有存在的必要了,所以Spring容器的基本用法就是定义bean,从容器中获得bean,而获取bean可以从最简单的BeanFactory中获取,但是实际上从BeanFactory中直接获取bean是很少使用的,甚至是不常见的,因为企业级应用中大都会使用ApplicationContext容器。
BeanFactory = new XmlBeanFactory(new classpathResource(“*.xml”));BeanFactory.do();
上面就是使用BeanFactory最简单的实现,那么从上面的代码中我们分析下Spring究竟做了什么?
1.读取配置文件 2.根据配置文件找到对应的类 3.调用实例化的类
根据上面的三个步骤,可以确定Spring至少需要三个类才能完成以上步骤的实现。
1. ConfigReader:用于读取及验证配置文件,并放在内存中。
2. ReflectionUtil:用于根据配置文件类进行反射实例化对象。
3. APP:支持整个逻辑的执行。
在Spring源码中实现上述三个步骤的jar包是beans.jar当然core.jar是必须的,如果只是实现上面的三个步骤,那么其他的模块可以不用导入。
和心类的介绍:
1.DefaultListableBeanFactory
XmlBeanFactory继承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整个bean加载的核心部分,这个类是整个bean加载的核心部分,是Spring注册以及加载bean的默认实现,而对于DefaultListableBeanFactory和XmlBeanFactory不同的地方其实是在XmlBeanFactory使用了自定义的Xml读取器XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取。DefaultListableBeanFactory集成了AbstractAutowireCapableBeanFactory并实现了BeanDefinitionRegistry接口。
1 public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable
1 public interface BeanDefinitionRegistry extends AliasRegistry
1 public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory
1 public interface ListableBeanFactory extends BeanFactory
1 public interface AutowireCapableBeanFactory extends BeanFactory
1 public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry
1 public interface HierarchicalBeanFactory extends BeanFactory
1 public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory
1 public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory
1 public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry
1 public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry
1 public class SimpleAliasRegistry implements AliasRegistry
loading。。。