第1章 Spring的基本应用
Spring是当前主流的Java Web开发框架,它是为了解决企业应用开发的复杂性问题而产生的
1.1 Spring概述
Spring:是轻量级开源框架,它以IoC(控制反转)和AOP(面向切面编程)为内核,使用基本的JavaBean来完成以前只可能由EJB(Java企业Bean)完成的工作,取代了EJB的臃肿和低效的开发模式
Spring致力于Java EE应用各层的解决方案,在表现层它提供了Spring MVC以及与Struts框架的整合功能;在业务逻辑层可以管理事物,记录日记等;在持久层可以整合MyBatis,Hibernate,JdbcTemplate等技术
Spring是企业应用开发很好的一站式选择,虽然Spring贯穿于表现层,业务逻辑层和持久层,但它并不想取代哪些已有的框架,而是以高度的开放性与它们进行无缝整合
1.1.2 Spring框架的优点
Spring具有简单,可测试和松耦合等特点,从这个角度出发,Spring不仅可以用于服务器端开发,也可以应用于任何Java应用的开发中,具体优点如下:
1.非侵入式设计
Spring是一种非侵入式框架,它可以使应用程序代码对框架的依赖最小化
2.方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理,大大地降低了组件之间的耦合性
3.支持AOP
Spring提供了对AOP的支持,它允许将一些通用任务,如安全,事物,日记等进行集中式处理,从而提高了程序的复用性
4.支持声明式事务处理
只需要通过配置就可以完成对事务的管理,而无须手动编程
5.方便程序的测试
Spring提供了对Junit4的支持,可以通过注解方便地测试Spring程序
6.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持
7.降低JavaEE API的使用难度
Spring对Java EE开发中非常难用的一些API,都提供了封装,使用这些API应用难度大大降低
1.1.3 Spring的体系结构
Spring框架采用的分层结构,它一系列的功能要素被分成20个模块,接下来只介绍主要模块如下:
1.Core Container(核心容器)
Spring的核心容器是其他模块建立的基础,它主要由Beans模块,Core模块,Context模块,Context-support模块和SpEL(spring表达式语言)模块组成,具体介绍如下:
(1)Beans模块: 提供了BeanFactory,是工厂模式的经典实现,Spring将管理对象称为Bean
(2)Core核心模块: 提供了Spring框架的基本组成部分,包括IoC和DI功能
(3)Context上下文模块: 建立在Core和Beans模块的基础之上,它是访问定义和配置的任何对象的媒介。其中ApplicationContext接口上下文的焦点
(4)Context-support模块: 提供了对第三方库嵌入Spring应用的集成支持,比如缓存,邮件服务,任务调度和模板引擎(速率)
(5)SpEL(spring表达式语言)模块: 是运行时查询和操作对象图的强大的表达式语言
2.Data Access/Integration(数据访问/集成)
数据访问/集成层包括JDBC,ORM,OXM,JMS和Transactions模块,具体介绍如下:
(1)JDBC模块: 提供了一个JDBC的抽象层,大幅度地减少了在开发过程种对数据库操作的编码
(2)ORM模块: 对流行的对象关系映射API,包括JPA,JDO和Hibernate提供了集成层支持
(3)OXM模块: 提供了一个支持对象/XML映射的抽象层实现,如JAXB,Castor,XMLBeans,JiBX和XStream
(4)JMS模块: 指Java消息传递服务,包含使用和产生信息的特性,自4.1版本后支持与Spring-message模块的集成
(5)Transactions模块: 支持对实现特殊接口以及所有POJO类的编程和声明式的事物管理
3.Web
Spring的Web层包括WebSocket,Servlet,Web和Portlet模块,具体介绍如下:
(1)WebSocket模块: 它提供了WebSocket和SockJS的实现,以及对STOMP的支持
(2)Servlet模块: 也称为Spring-webmvc模块,包含了Spring的模型—视图—控制器(MVC)和REST Web Services实现的Web应用程序
(3)Web模块: 提供了基本的Web开发集成特性,例如:多文件上传功能,使用Servlet监听器来初始化IoC容器以及Web应用上下文
(4)Portlet模块: 提供了在Portlet环境中使用MVC实现,类似Servlet模块的功能
4.其他模块
Spring的其他模板还有AOP,Aspects,Instrumentation以及Test模块,具体介绍如下:
(1)AOP模块: 提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性
(2)Aspects模块: 提供了与AspectsJ的集成功能,AspectsJ是一个强大且成熟的面向切面编程(APO)框架
(3)Instrumentation模块: 提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用
(4)Test模块: 提供了对单元测试和集成测试的支持
1.2 Spring的核心容器
Spring框架的主要功能是通过其核心容器来实现的。Spring框架提供了两种核心容器,分别为BeanFactory和ApplicationContext具体介绍如下:
1.2.1 BeanFactory
BeanFactory: 是基础类型的IoC容器(控制反转),它提供了完整的IoC服务支持。BeanFactory是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法
1.2.2 ApplicationContext
ApplicationContext: 是BeanFactory的子接口,也被称为应用上下文,是另一种常用的Spring核心容器。不仅包含了BeanFactory的所有功能,还添加对国际化,资源访问,事件传播等方面的支持
创建ApplicationContext接口实例,通常采用两种方法,具体如下:
1.通过ClassPathXmlApplicationContext创建
2.通过FileSystemXmlApplicationContext创建
创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种方法:
Object getBeab(String name): 根据容器中Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换
<T>
T getBean(Class<T>
requiredType): 根据类的类型来获取Bean的实例。由此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换
提醒: BeanFactory和ApplicationContext两种容器都是通过XML配置文件加载Bean的
两者的主要区别:如果Bean的某一个属性 没有注入,使用BeanFactory加载后,在第一次调用getBean()方法时回抛出异常,而ApplicationContext则在初始化时自检,这样有利于检查所依赖属性是否注入。因此,在实际开发中,通常优先选择使用ApplicationContext,而只有在系统资源较少时,才考虑使用BeanFactory
1.4 依赖注入
依赖注入(简称DI): 与控制反转(IoC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。对于一个Spring初学者来说,这两种称呼很难理解,下面将通过简单的语言来描述这两个概念
当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖对象)时,在传统模式下,调用者通常会采用"new 被调用者"的代码方式来创建对象,这种方式回导致调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护
控制反转(IoC)角度: 在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是Spring的控制反转
依赖注入(DI)角度: 从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入
控制反转与依赖注入推荐文章:https://www.cnblogs.com/yanggb/p/10337600.html
1.4.2 依赖注入的实现方式
依赖注入的作用 就是在使用Spring框架创建对象时,动态地将其所依赖的对象注入Bean组件中,其实现方式通常由两种,一种是属性setter方法注入,另一种是构造方法注入,具体介绍如下:
(1)属性setter方法注入: 指Spring容器使用setter方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter方法的依赖注入
(2)构造方法注入: 指Spring容器使用构造方法注入被依赖的实例。基于构造方法的依赖注入通过调用带参数的构造法来实现,每个参数代表一个依赖
依赖注入推荐文章:
(1)https://www.cnblogs.com/chansblogs/p/8343930.html
(2)https://www.cnblogs.com/sylone/p/9479276.html