摘 要:Spring是当今流行的企业级应用开发框架,它能解决大部分企业应用开发的复杂性问题。对于Java开发人员来说,掌握Spring框架的基本使用,已是入职Java软件开发行业的必备技能之一。本文主要介绍Spring框架及其体系结构的基本内容及应用,并通过实例说明Spring框架中IoC和AOP的基本使用方法。
关键词:Spring框架;IoC;AOP;企业级应用开发
Spring的出现是为了更好服务于企业级应用开发。企业级应用是指为商业组织、大型企业创建并部署的解决方案及应用。这些大型企业级应用的结构复杂,涉及的外部资源众多,事务密集、数据规模大、用户数量多,有较强的安全性考虑和较高的性能要求。企业级应用绝不可能是一个个的独立系统。在企业中,一般都会部署多个交互的应用,同时这些应用又有可能与其他企业的相关应用连接,从而构成一个结构复杂的、跨越网络的分布式企业应用集群。此外,作为企业级应用,不但要有强大的功能,还要能够满足未来业务需求的发展变化,易于扩展和维护。而传统的Java EE在解决企业级应用问题时技术烦琐,属于“重量级”架构体系,使它的开发效率、开发难度和实际性能都令人失望。而Spring作为一个新兴的“轻量级”企业级应用开发框架,致力于Java EE应用的各种解决方案,而不仅仅专注于某一层的方案。可以说,Spring是企业应用开发的最优选择,它贯穿表现层、业务层和持久层,可以和现有的各种技术框架无缝结合。
一、Spring整体架构简介
Spring是一个轻量级框架,它大大简化了Java企业级开发,提供强大、稳定功能的同时并没有带来额外的负担。它主要有两个作用:一是让现有技术更易于使用;二是养成良好的编程习惯。作为一个全面的解决方案,Spring坚持一个原则:简单易用,无需重新实现。例如,对持久化和ORM,Spring只是对现有的JDBC、MyBatis、Hibernate等技术提供支持,使之更易用,而不是重新实现。
Spring框架由大约20个功能模块组成。这些模块被分为六个部分,分别是Core Container,Data Access/Integration,Web、AOP、Instrumentation及Test,如图1所示。Spring Core是框架的最基础部分,提供了IoC特性。Spring Context为企业级开发提供了便利的集成工具。Spring AOP是基于Spring Core的符合规范的面向切面编程的实现。Spring JDBC提供了JDBC的抽象层,简化了JDBC编码,同时使代码更健壮。Spring ORM对市面上流行的ORM框架提供了支持。Spring Web为Spring在Web应用程序中的使用提供了支持。Spring IoC和AOP是Spring技術中的核心,下面介绍这两种核心技术的情况。
二、Spring IoC核心技术介绍
控制反转(Inversion of IoC)也称之为依赖注入(Dependency Injection,DI),是面向对象编程中的一种设计理念,用来降低程序代码之间的耦合度。依赖一般指通过局部变量、方法参数、返回值等建立的对于其他对象的调用关系。例如,在A类的方法中,实例化了B类的对象并调用其方法来完成特定的功能,也就是A类依赖于B类。几乎所有的应用都由两个或更多的类通过合作来实现完整的功能。类与类之间的依赖关系增加了程序开发的复杂程度。例如,常见的业务层调用数据访问层以实现持久化操作代码如下。
public interface UserDao{ //用户DAO接口,定义了所需的持久化方法
public void save(User user);}
public class UserDaoImpl implements UserDao{// 用户DAO实现类,实现User类的持久化操作
public void save(User user){
System.out.println(“保存用户信息到数据库”);}
public class UserServiceImpl implements UserService{//实例化所依赖的UserDao对象
private UserDao dao=new UserDaoImpl();
public void addNewUser(User user){
dao.save(user);}
如上三段代码中,UserServiceImpl对UserDaoImpl存在依赖关系。这样的代码很常见,但是存在一个严重的问题,就是UserServiceImpl和UserDaoImpl高度耦合,如果因为需求变化需要替换UserDao的实现类,将导致UserServiceImpl中的代码随之发生修改。程序将不具备优良的可扩展性和可维护性,甚至在开发中难以测试。下面我们使用IoC编程方式进行改进。
public class UserDaoFactory{//增加DAO工厂类,负责用户DAO实例的创建工作
public static UserDao getInstance(){
......
}}
pubic class UserService Implements UserService{//通过工厂类获取所依赖的用户DAO对象
private UserDao dao=UserDaoFactory.getInstance();
public void addNewUser(User user){
dao.save(user);}}
上例中的用户DAO工厂类UserDaoFactory体现了“控制反转”的思想:UserServiceImpl不再依靠自身的代码去获得所依赖的具体DAO对象,而是把这一工作转交给了“第三方”UserDaoFactory,从而避免了和具体UserDao实现类之间的耦合。由此可见,在如何获取所依赖的对象上,“控制权”发生了“反转”,即从UserServiceImpl转移到了UserDaoFactory,这就是“控制反转”IoC思想。
三、Spring AOP核心技术介绍
面向切面编程(Aspect Oriented Programming,AOP)是软件编程思想发展到一定阶段的产物,是对面向对象编程的有益补充。AOP一般适用于具有横切逻辑的场合,如访问控制、事务管理、性能检测等。在软件系统中,日志、异常处理、事务控制等都是一个健壮的业务系统所必需的。但为了保证系统的健壮性,就要在众多的业务方法中反复编写功能类似的代码,使得原本就很复杂的业务处理代码变得更加复杂。业务功能的开发者还需要关注这些额外的代码是否处理正确,是否有遗漏。如果需要修改日志信息的格式或者安全验证的规则,或者再增加新的辅助功能,都会导致业务代码频繁而大量的修改。对于软件开发人员来说,他们最希望的是无须编写显式的调用,在需要的时候,系统能够“自动”调用所需的功能,这正是AOP存在的必要。也就是说,面向切面编程就是在不改变原有程序的基础上通过代理对象为代码段增加新的功能,对其进行增强处理,这样在调用原有代码的时候会自动执行增加的新的功能。下面通过一个例子说明AOP编程的方法和步骤。
四、AOP实现思路及关键代码
(1)在项目中添加Spring AOP相关的jar文件
(2)编写前置增强和后置增强功能代码
(3)编写Spring配置文件,对业务方法进行增强处理
(4)编写测试代码,获取带有增强处理的业务对象并运行结果,部分关键代码如下所示。
public class UserServiceLogger{//定义包含增强方法的JavaBean
public void before(JoinPoint jp){
.... //此处为前置增强代码
}
public void afterReturning(JoinPoint jp){
.... //此处为后置增强代码
}}
UserServiceLogger类中定义了before()和afterReturning()两个方法。其中before方法作为前置增强使用,即将该方法添加到目标方法之前执行;把afterReturning方法作为后置增强使用,即将该方法添加到目标方法正常返回之后执行。同时为了能够在增强方法中获得當前连接点的信息,以便实施相关的判断和处理,在增强方法中声明一个JoinPoint类型的参数,Spring会自动注入实例。通过实例的getTarget方法得到被代理的目标对象,通过getSignature方法返回被代理的目标方法,再通过getArgs方法返回传递给目标方法的参数数组。对于后置增强的afterReturning方法,还可以定义一个参数用于接收目标方法的返回值。部分AOP切入点配置代码如下所示。
五、结论
本文主要介绍Spring框架核心技术的基础知识及一般应用。首先讲解了Spring框架的概念、作用、优点、体系结构,然后介绍了Spring的两种核心技术IoC和AOP,接下来通过实例来说明如何使用Spring框架的两种核心技术,并初步掌握Spring框架两种核心技术的编程方法。
参考文献:
[1]沃尔斯. Spring实战 [M]. 人民邮电出版社,2016.
[2]卡内尔. Spring开发三剑客[M],人民邮电出版社, 2020.
[3] 陈恒等. Spring Boot从入门到实战[M]. 清华大学出版社,2020.
作者简介:翟高粤(1975—),男,汉族,广西钦州人,硕士,研究方向:软件理论、人工智能。