Java开发框架Spring框架简介

开课吧开课吧锤锤2021-08-02 10:45

Spring是一个开源的轻量级的Java企业应用开发框架,其初衷是为了替代当时非常笨重的JavaEE(当时还称为J2EE)组件技术EJB(EnterpriceJavaBeans),让JavaEE开发更加简单灵活。  

Java开发框架Spring框架简介

Spring起源于RodJahnson2002年出版的著作《ExpertOne-on-OneJ2EEDesignandDevelopment》,书中分析了JavaEE的开发效率和实际性能等方面的问题,从实践和架构的角度探讨了简化开发的原则和方法。以此为基础,他实现了一个名为interface21的轻量级开发框架,成为Spring框架的前身。2004年,Spring正式发布1.0版本,同年RodJahnson推出了另一部影响深远的经典著作《Expertone-on-oneJ2EEDevelopmentwithoutEJB》,Spring开始逐步在Java领域流行。现在Spring框架的版本已经演化到了4.x,它已经成为Java开发框架的一种事实标准,对JavaEE规范本身也产生了重要影响。比如EJB规范就在发展中逐渐引入了众多Spring框架的优秀特征。  

Spring最重要的两个核心功能是依赖注入(DI,DependencyInjection)和面向切面编程(AOP,AspectOrientedProgramming)。其中DI用于管理Java对象之间的依赖关系,AOP用于解耦业务代码和公共服务代码(如日志,安全,事务等)。DI和AOP能够让代码更加简单,具有良好的松耦合特性和可测试性,极大地简化开发。理解这两者是使用Spring框架的基础。  

Spring框架本身具有模块化的分层架构,开发者可以根据需要使用其中的各个模块。Spring框架对Java企业应用开发中的各类通用问题都进行了良好的抽象,因此也能够把应用各个层次所涉及的特定开发框架(如MVC框架、ORM框架)方便得组合到一起。Spring是一个极其优秀的一站式的Full-Stack集成框架。  

Spring的基本思想  

Spring的目标是简化Java应用开发,那么它是通过什么方式来实现这一目标的呢?前面我们说过DI和AOP是Spring的核心功能,更准确地说,Spring通过为DI和AOP这两种编程技术提供支持,来让应用更方便的进行开发。此外,Spring提倡基于POJO(PlainOldJavaObject)的编程模型,提供了针对企业开发且屏蔽重复代码的工具类。在开始正式进入代码编写之前,我们先了解Spring简化开发的几个基本思想。  

DI  

面向对象的程序通过一组对象之间相互通信来实现特定功能,这里的通信具体来说就是一个对象对另一个对象的方法调用或者属性访问。比如有一个BlogRespositry类负责将博客内容存储到数据库,一个BlogController负责解析前端的Web请求。BlogController接受到新建博客的请求之后,需要调用BlogRespositry的方法来保存博客内容。这里BlogRespositry就是BlogController的一个依赖,具体体现在BlogController会包含一个BlogRespositry类型的成员变量。  

class BlogController {    
    private BlogRepository blogRepository;    

    public BlogController() {        
        this.blogRepository = new BlogRepository();
        ...
    }

    ...
}

在上面的代码中,BlogRespositry在构造函数中自己去创建BlogRepository类的实例。而使用依赖注入技术,则BlogRespositry的依赖(即BlogRepository类)是由外部实例化之后注入给它的。依赖注入也称为控制反转(IoC,InversionofControll)。当创建一个对象时,它所依赖的对象由外部传递给它,而非自己去创建所依赖的对象(向例子中这样通过new操作)。因此,也可以说在对象如何获取它的依赖对象这件事情上,控制权反转了。这便是控制反转和依赖注入这两个名字的由来了。  

DI可以让对象之间的关系更加松耦合,而且会促使你使用面向接口编程,同时也让测试更加方便。如果现在对这个概念还不是太理解没关系,下一节中我们将基于代码实例来深入了解DI的工作原理。  

AOP  

面向切面编程(AspectOrientedProgramming,AOP)是一种关注点分离的技术,通俗的说就是有机地将各部分代码进行分离,各司其职,互不干扰。软件开发中经常提一个词,叫做“业务逻辑”或者“业务功能”,我们的代码主要就是实现某种特定的业务逻辑。但是我们往往不能专注于业务逻辑,比如我们写业务逻辑代码的同时,还要关注事务管理、缓存、日志等一系列通用功能,如果每个业务功能都要和这些通用功能混在一起,是一件非常低效和痛苦的事情。所以,为了将业务功能的关注点和通用化功能的关注点分离开来,就需要AOP技术了。通用功能的代码实现,对应的就是我们说的切面(Aspect)。  

简而言之,AOP就是一种在开发时将业务相关代码和业务无关的通用功能代码有机分离,而运行时又能够整合到一起形成完整功能的一整套技术。Spring框架中一些模块本身就是基于AOP技术来实现的,例如事务处理和安全相关的模块。  

基于POJO的编程模型  

Java开发领域的一大特色就是有大量开源框架可供我们选择和使用。通常情况下,使用一种开发框架,我们编写的业务类都需要去继承框架提供的类或者接口,如此方能使用框架提供的基础功能。而对于Spring框架,只需POJO就能使用其强大的功能。Spring不强制我们依赖于其特定的API,这称之为“非侵入式”开发,能够让代码更加简单并且更容易复用。  

POJO是PlainOldJavaObject的缩写,是软件开发大师MartinFowler提出的一个概念,指的是一个普通Java类。也就说,你随便编写一个Java类,就可以称之为POJO。之所以要提出这样一个专门的术语,是为了与基于重量级开发框架的代码相区分,比如EJB,我们编写的类一般都要求符合特定编码规范,实现特定接口、继承特定基类,而POJO则可以说是百无禁忌,灵活方便。  

大家在学习过程中会经常遇到另外两个概念:JavaBeans和SpringBean。这两者和POJO这个概念经常联系在一起,这里简单介绍一下。  

JavaBeans是一种Java规范定义的一种组件模型,它包含了一些类编码的约定。简单来说,一个类如果拥有一个默认构造函数,由国有访问内部属性且符合命名规范的setter和getter方法,同时实现了io.Serializable接口,就是一个JavaBean。那么为什么要这些约定呢?因为大家都遵守这些约定,在编写或者修改一个类的时候,就能很容易在可视化的开发环境中进行操作,也更方便地分发给他人。  

SpringBean是被Spring维护和管理的POJO。最早Spring只能管理符合JavaBeans规范的对象,这也是为什么称之为SpringBean的原因。但是现在只要是POJO就能被Spring容器管理起来,而且这也是最为常见的情况。  

模板代码  

在开发过程中,很多的功能的实现,都会涉及到完全相同的代码,最典型的例子就是JDBC的使用。  

public Employee getEmployeeById(long id) {
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;    try {
        conn = dataSource.getConnection();
        stmt = conn.prepareStatement("select id, name from employee where id=?");
        stmt.setLong(1, id);
        rs = stmt.executeQuery();
        Employee employee = null;        
        if (rs.next()) {
            employee = new Employee();
            employee.setId(rs.getLong("id"));
            employee.setName(rs.getString("name"));
        }        return employee;
    } catch (SQLException e) {
    } finally {       
        if (rs != null) {            
            try {
                rs.close();
            } catch (SQLException e) {
            }
        } 
        if (stmt != null) {           
            try {
                stmt.close();
            } catch (SQLException e) {
            }
        }       
        if (conn != null) {            
            try {
                conn.close();
            } catch (SQLException e) {
            }
        }
    }    
    
    return null;
}

而Spring通过Template这样一种设计模式来解决这样的问题。Template模式,就是把固定的逻辑放到一个模板类中,变化的部分放到自己实现的类中,通过继承或者回调的方式把固定逻辑和变化部分结合到一起。比如在面的代码中,数据库连接和数据库异常处理的大量代码都是一模一样的,不同的数据库访问操作只有数据查询部分的逻辑是不一样的。Spring将这些代码被放在了JdbcTemplate这个模板类中,大大简化了数据访问的开发工作。  

public Employee getEmployeeById(long id) {    
  
    return jdbcTemplate.queryForObject(            
  
        "select id, name from employee where id=?",           
         new RowMapper<Employee>() {               
               public Employee mapRow(ResultSet resultSet, int i) throws SQLException {
                    Employee employee = new Employee();
                    employee.setId(resultSet.getLong("id"));
                    employee.setName(resultSet.getString("name"));                    
  
                    return employee;
                }
            });
}

Spring框架中的模块  

使用Spring框架之前,我们简单了解一下这个框架由哪些模块构成。Spring本身具有非常好的模块化架构,包含了20多个模块。这些模块划分为六大部分,可以单独使用,也可以组合使用。下面这张图是Spring官方文档给出的Spring概览图。  

Java开发框架Spring框架简介

简单地说,这六部份实现的功能功能分别为:  

核心容器:核心模块,提供了IoC/DI容器  

AOP:AOP的实现和AspectJ的支持  

消息:提供对基于消息应用的支持,提供与SpringIntegration的集成  

数据访问与集成:JDBC访问的简化、事务的支持,ORM(ObjectRelationMapping)框架(如JPA、Hibernate和Mybatis等)与OXM(ObjectXMLMapping)框架的集成  

Web:SpringMVC的实现,能集成众多模板引擎技术(如Thymeleaf、JSP与Velocity等)  

测试:提供大量Mock对象,支持单元测试;提供SpringContext的测试支持,支持集成测试  

以上就是开课吧广场小编为大家整理发布的“Java开发框架Spring框架简介”一文,更多Java教程相关内容尽在开课吧广场Java教程频道!

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
高并发编程训练营