什么是Spring?
Spring是由Rod Johnson组织和开发的一个分层的Java SE/EE full-stack (一站式 )轻量级开源框架。
Spring 以 IOC( Inversion of Control,控制反转)和 AOP ( Aspect Oriented Programming,面向切面编程)为 内核。
Spring 使用基本JavaBean来完成以前只可能由EJB ( Enterprise Java Beans,Java企业Bean)完成的工作,取代了EJB的臃肿、低效的开发模式。
Spring 致力于Java EE应用各层的解决方案。
在 表现层 它提供了Spring MVC等功能;
在 业务逻辑层 可以管理事务、记录日志等;
在 持久层 可以整合MyBatis 等技术。
虽然Spring贯穿于表现层、业务逻辑层和持久层,但它并不想取代那些已有的框架,而是以高度的开放性与它们进行无缝整合。
Spring框架的优点
非侵入式设计
Spring是一种非侵入式( non-invasive )框架,它可以使应用程序代码对框架的依赖最小化。
方便解耦、简化开发
Spring就是一个大工厂, 可以将所有对象的创建和依赖关系的维护工作都交给Spring容器
管理,大大地降低了组件之间的耦合性。
支持AOP
Spring提供了对AOP的支持,它允许将一些通用任务, 如安全、事务、日志等进行集中
处理,从而提高了程序的复用性。
支持声明式事务处理
只需要通过配置就可以完成对事务的管理,而无须手动编程。
方便程序的测试
Spring提供了对Junit4的支持,可以通过注解方便地测试Spring程序。
方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持。
降低JavaEE API的使用难度
Spring对Java EE开发中非常难用的一些API (如JDBC、JavaMail 等),都提供了封
使这些API应用难度大大降低。
Spring的体系结构
Spring框架采用的是分层架构,它一系列的功能要素被分成20个模块,这些模块大体分为
Core Container (核心容器)、 Data Access/Integration (数据访问/集成)、 Web、
AOP ( Aspect Oriented Programming)、Instrumentation、Messaging 和 Test。
如下图所示。
Core Container (核心容器)
Spring的核心容器 是其他模块建立的基础,它主要由①Beans模块、②Core核心模块、
③Context 模块、④Context- support模块 和 ⑤SpEL ( Spring Expression Language, Spring表达式语言)模块组成。
Beans模块: BeanFactory
Beans模块:提供了 BeanFactory, 是工厂模式的经典实现,Spring将管理对象称为Bean。 ( BeanFactory在下面详讲 )
ps :实际开发中较少通过创建BeanFactory的方式来管理Bean对象(Java对象),常用方式为 : 通过context模块中的 ApplicationContext 来实现对Bean的管理。
但依然是通过 .xml文件的方式来 配置Bean对象的信息 ( 如 : 让哪个Java对象交给Spring管理,称为Bean )。
Context应用上下文模块 : ApplicationContext
Context上下文模块 : 建立在Core和Beans模块的基础之上,它是访问定义和配置的任何对象的媒介。其中 ApplicationContext接口是上下文模块的焦点。
ApplicationContext 和 BeansFactory都是用于管理Bean的生命周期和依赖关系的核心接口,实际开发中,ApplicationContext常用。
Bean的配置信息是放在 .xml文件中的,意味着要创建 ApplicationContext 就要通过指定的ApplicationContext.xml (有时也称为: beans.xml)来创建。
获取.xml的方式有两种 :
①通过 ClassPathXmlApplicationContext (类路径) —Java项目常用
②通过 FileSystemXmlApplicationContext (绝对路径)
( 在Java项目中,会通过 ClassPathXmlApplicationContext 类类实例化 ApplicationContext容器 )
( 在Web项目中,会通过Web服务器来实例化ApplicationContext容器 : 通过ContextLoaderListener来实现。三大框架整合时,会通过ContextLoaderListener的方式来实例化/创建 ApplicationContext )