翟高粤
摘 要:Spring是当今流行的Java Web开发框架,它能解决大部分企业应用开发的复杂性问题。对于Java开发人员来说,掌握Spring框架的基本使用,已是入职Java软件开发行业的必备技能之一。本文主要介绍Spring框架及其体系结构的基本内容及应用,并通过一个实例说明Spring框架的基本使用方法,理解Spring框架中IoC及DI的基本思想,对于Spring的入门学习有一定参考价值。
关键词:Spring框架;Java EE;IoC;DI
一、引言
Spring 是在2003年兴起的一个轻量级的Java应用开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。Spring 是可以在 Java SE/EE 中使用的轻量级开源框架。Spring通过使用基本的JavaBean来实现以前只能由EJB(企业JavaBean)完成的工作,一面世即迅速取代EJB臃肿、低效的开发模式,受到大批JAVA开发者的欢迎和支持。Spring致力于JavaEE应用各层的解决方案,在表现层它提供了SpringMVC以及与Struts框架的整合功能;在业务逻辑层可以管理事务、记录日志等;在持久层可以整合MyBatis、Hibernate、JdbcTemplate等技术。因此,Spring框架是企业应用开发很好的框架之一。
二、相关理论
(一)Spring框架的特点
Spring具有简单、可测试和松耦合等特点,Spring不仅可以用于服务器端的开发,也可以用于任何Java软件開发中。具体有如下特点:
(1)非侵入式设计
(2)方便解耦,简化开发
(3)支持AOP
(4)支持声明式事务处理
(5)方便程序测试
(6)方便集成各种框架
(7)降低Java EE API的使用难度
(二)Spring的体系结构
Spring框架采用的分层设计架构,它根据一系列的功能分成20个模块,具体如图1所示。接下来对主要核心模块进行简单介绍。
(1)Core Container(核心容器)
Spring的核心容器是其他模块建立的基础,它主要由Beans模块、Core模块、Context模块、Context-support模块和SpEL模块构成。Beans模块提供了工厂模式的经典实现;Core模块提供了Spring框架的基本组成部分,包括IcC和DI功能;Context模块建立在Core和Beans模块的基础上,它是访问定义和配置的任何对象的媒介;Context-support提供了对第三方库嵌入Spring应用的集成支持;SpEL模块提供了Spring Expression Language支持,是运行时查询和操作对象图的强大的表达式语言。
(2)Data Access/Integration(数据访问/集成)
数据访问集成包括JDBC、ORM、OXM、JMS和Transactions模块。JDBC模块提供了一个JDBC的抽象层,大幅度地减少了在开发过程中对数据库操作的编码;ORM提供了对流行的对象关系映射API,包括JPA、JDO和Hibernate提供了集成层支持;OXM模块提供了一个支持对象/OXM映射的抽象层实现;JMS模块指的是Java的消息传递服务;Transactions事务模块支持对实现特殊接口以及所有POJO类的编程和声明式的事务管理。
(3)Web
Spring的Web层包括WebSocket、Servlet、Web和Portlet模块。WebSocket模块提了WebSocket和SockJS的实现,以及对STOMP的支持;Servlet模块提供了Spring的模型-视图-控制器(MVC)和REST WebServices实现的Web应用程序;Web模块提供了基本的Web开发集成特性;Portlet模块提供了在Portlet环境中使用MVC实现,类似Servlet模块的功能。
(4)其他模块
Spring的其他模块有AOP、Aspects、Instrumentation以及Test模块。AOP模块提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性;Aspects模块提供了与AspectsJ的集成功能,AspectsJ是一个功能强大且成熟的面向切面编程(AOP)框架;Instrumentation模块提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用;Messaging模块提供了对消息传递体系结构和协议的支持;Test模块提供了对单元测试和集成测试的支持;
三、Spring核心容器
Spring框架的主要功能是通过其核心容器来实现的,Sping框架提供了两种核心容器,分别为BeanFactory和ApplicationContext。
(一)BeanFactory容器
BeanFactory是由org.springframework.beans.factory.BeanFactory接口定义,是基础类型的IoC容器,它提供了完整的IoC服务支持。BeanFactory是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法。
BeanFactory接口提供几个实现类,其中最常用的是XmlBeanFactory,该类会通过XML配置文件中的定义来装配Bean,语法实例如下:
BeanFactory beanFactory=new
XmlBeanFactory(new FileSystemResource(“c:/applicationContext.xml”);
(二)ApplicationContext
ApplicationContext是BeanFactory的子接口,也被称为应用上下文,是另一种Spring核心容器。它由org.springframework.context.ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。创建ApplicationContext接口实例,通常采用两种方法。
(1)通过ClassPathXmlApplicationContext创建
ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并加载ApplicationContext的实例化工作,其使用语法如下:
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(String configLocation)
(2)通过FileSystemXmlApplicationContext会从指定的文件系统路径中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作,其使用语法如下:
ApplicationContext applicationContext=new FileSystemXmlApplicationContext(String configLocation)
与ClassPathXmlApplicationContext有所不同的是,在读取Spring的配置文件时,FileSystemXmlApplicationContext不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,这种采用绝对路径的方式,会导致程序的灵活性变差,所以这种方法一般不推荐使用。
(三)Spring编程实现
以上是对Spring的核心容器的介绍,接下来通过一个实例说明Spring框架的编程步骤。
(1)在MyEclipse中,创建一个名为firstSpring的Web项目,将Spring的4个基础包以及commons-logging的JAR包复制到lib目录中,并发布到类路径下,如图2所示。
(2)在src目录下,创建一个com.szjm.ioc包,并在包中创建接口UserDao,然后在接口中定义一个say()方法,代码如下所示。
public interface UserDao{
public void say();}
(3)在com.szjm.ioc包下,创建UserDao接口的实现类UserDaoImpl,该类需要实现接口中的say()方法,并编写一条输出语句,代码如下所示。
public class UserDaoImpl implements UserDao {
public void say() {
System.out.println("userDao say hello World !");
}
}
(4)在src目录下,创建Spring的配置文件applicationContext.xml,并在配置文件中创建一个id为userDao的Bean,代码如下所示。
<!-- 将指定类配置给Spring,让Spring创建其对象的实例 -->
(5)在com.szjm.ioc包下,创建测试类TestIoC,并在类中编写main() 方法,该main()方法需要初始化Spring容器,并加载配置文件,然后通过Spring容器获取userDao实例,最后调用实例中的say()方法,代码如下所示。
public class TestIoC {
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.say();
}
}
执行上述程序后,在控制台的输出结果如下所示。
四、结论
本文主要介绍Spring框架的基础知识及一般应用。首先讲解了Spring框架的概念、作用、优点、体系结构,然后介绍了Spring的两种核心容器,接下来通过一个实例来说明如何使用Spring框架,并初步掌握Spring框架的使用方法。
參考文献:
[1]沃尔斯. Spring实战 [M]. 人民邮电出版社,2016.
[2]卡内尔. Spring开发三剑客[M],人民邮电出版社, 2020.
[3] 陈恒等. Spring Boot从入门到实战[M]. 清华大学出版社出版社,2020.