基于Maven的SSM总体架构设计(一)

1 概述

1.1 编写目的

        本文描述了基于SSM的总体架构设计和实现思路,包括约定开发框架、设计规范、开发规范。用于指导项目组在同一规范下进行程序设计和开发,从而降低项目组内沟通的成本,文档内容包括了项目中使用的主要技术方案及主要功能的实现思路,本文档作为项目设计与实现阶段的指导性文档,是项目设计与开发的重要参考。还可以作为项目组新进人员的学习资料,让新员工尽快融入到统一的规范下工作。

1.2 读者对象

本文档适用于系统架构师、软件设计工程师、软件开发工程师、测试工程师。

1.3 引用文件

  • [《Spring Framework开发参考手册》 文件编号:无] 
  • [《Java EE开发的颠覆者Spring Boot实战》 文件编号:无] 
  • [《精通Spring MVC4》 文件编号:无] 
  • [《MyBatis_3文档》 文件编号:无]

1.4 术语表

缩写解释
OOAObject Oriented Analysis,面向对象分析
OODObject Oriented Design,面向对形象设计
OOPObject Oriented Programming,面向对象编程
PDL伪代码
IOC控制反转
DI依赖注入
AOP面向切面编程
IDEIntegrated Development Environment,集成开发环境
DBMS数据库管理系统

2 相关技术介绍

2.1 Spring框架介绍

官方网站:https://spring.io

2.1.1 Spring简介

        Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为JAVAEE应用程序开发提供集成框架。
        Spring是应两个目标而出现的,第一是促进最佳编码实践。第二是让现有的框架更加易用。所以,Spring可以有效降低程序的耦合度,提高开发人员的生产效率,让开发人员能够编写更好、更小以及更干净的代码,使开发者可以只关注业务逻辑的开发。

2.1.2 Spring框架模块结构

图2-1 Spring框架模块结构图
        Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理bean的方式,如图2-1所示。
        组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
核心容器(Spring Core): 核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring上下文(Spring Context): Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
**Spring AOP:**通过配置管理特性,Spring AOP模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象支持AOP。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO: JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大的降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。
Spring ORM: Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和MyBatis。所有这些都遵从Spring的通用事务和DAO异常层次结构。
Spring Web模块:Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以,Spring框架支持与Struts的继承。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC框架: MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变为高度可配置的,MVC容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POI。
        Spring框架的功能可以用在任何JAVAEE服务器中,大多数功能也适用于不受管理的环境。Spring的核心要点是:支持不绑定到特定JAVAEE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同JAVAEE环境(Web或EJB)、独立应用程序、测试环境之间重用。

2.1.3 Spring相关概念

IOC(Inversion of Control控制反转)
控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在Spring框架中是IOC容器)负责将这些联系在一起。
DI(Dependency Injection依赖注入)
依赖注入是指强制把组件的定义和组件的使用分开。
AOP(Aspect-Oriented Programming面向方面编程)
将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中区。AOP的目的是将复杂逻辑进行分离,抽取共性,让各部分实现的功能更为专一。
Aspect(方面): 我们所关注的,可以被抽取的业务逻辑,如事务管理、日志、异常处理,泛指业务逻辑。
JoinPoint(连接点): 切面可以被织入到目标对象的位置,泛指属性链接点,方法连接点。程序在执行过程中明确的点,通常是某个业务方法。
Advice(通知): 在特定的连接点执行的动作,通知是指方面功能的实现代码,如日志代码。通知类型有前置通知、后置通知、环绕通知和异常处理通知。
PointCut(切入点): 一组规定,规定一个切面可以织入到哪个类的哪些方法。即一组JointPoint。
Advisor(通知者): 是一种特殊的通知,规定了哪个切面,要织入到哪个类的哪些方法。
TargetObject(目标对象): 包含连接点的对象,也称为被代理的对象,通常是具体的业务逻辑对象。
Proxy: aop代理对象。
Weaving: 织入。将Aspect加入到程序代码的过程,对于Spring AOP,由ProxyFactory或者ProxyFactoryBean负责织入动作。

2.2 MyBatis框架介绍

最新网址:https://github.com/mybatis
相关网址:http://www.mybatis.org

2.2.1 MyBatis的来源

        MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
        iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。与Hibernate等重量级ORM框架相比,MyBatis由开发人员手动写SQL,相对灵活性更大,更容易保证DB访问的性能,非常适合熟悉SQL编写的团队。

2.2.2 MyBatis应用简介

        MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
        每个MyBatis应用程序主要都是使用SqlSessionFactory实例,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
        用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其他位置加载资源。

2.2.3 MyBatis的使用流程

图2-2 MyBatis使用流程示意图

  1. 加载配置并初始化
    触发条件:加载配置文件。
    将SQL的配置信息加载成为一个个MappedStatement对性爱那个(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
  2. 接收调用请求
    触发条件:调用MyBatis提供的API。
    传入参数:为SQL的ID和传入参数对象。
    处理过程:将请求传递给下层的请求处理层进行处理。
  3. 处理操作请求
    触发条件:API接口层传递请求过来
    传入参数:为SQL的ID和传入参数对象
    处理过程:
    1) 根据SQL的ID查找对应的MappedStatement对象。
    2) 根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
    3) 获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
    4)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
    5) 释放连接资源。
  4. 返回处理结果将最终的处理结果返回。

2.2.4 MyBatis功能架构

图2-3 MyBatis功能架构图
MyBatis的功能架构分为三层:
1. API接口层: 提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会用数据处理层来完成具体的数据处理。
2. 数据处理层: 负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3. 基础支撑层: 负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

2.2.5 MyBatis框架架构

图2-4 MyBatis框架架构图
1. 加载配置: 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
2. SQL解析: 当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
3. SQL执行: 将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
4. 结果映射: 将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

2.3 Apache Shiro框架介绍

官方网站:http://shiro.apache.org

2.3.1 Shiro简介

        Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂,所以使用小而简单的Shiro就足够了。
        Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。而且Shiro的API也是非常简单。
图2-5 Shiro功能结构图
Authentication: 身份认证/登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否有执行某个操作的权限。常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
SessionManager: 会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都会在会话中;会话可以是普通JavaSE环境的,也可以是Web环境的;
Cryptography: 加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
Web Support: Web支持,可以非常容易的集成到Web环境;
Caching: 缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
Concurrency: Shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
Testing: 提供测试支持;
Run As: 允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me: 记住我,这个非常常见的功能,即一次登录后,下次再来的话就不用登录了。

2.3.2 Shiro的应用流程

        对于一个好的框架,从外部来看应该具有非常简单易于使用的API,且API契约明确;从内部来看的话,其应该有一个可扩展的架构,即非常容易插入用户自定义实现,因为任何框架都不能满足所有需求。
        首先,我们从外部来看Shiro,即从应用程序角度来观察如何使用Shiro完成工作。如下图:
图2-6 Shiro应用流程示意图
        可以看到:应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject;其每个API的含义如下:
Subject: 主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念,所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager。可以把Subject认为是一个门面,SecurityManager才是实际的执行者;
SecurityManager: 安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject。可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,可以把它看成DispatcherServlet前端控制器;
Realm: 域,Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法。也需要从Realm得到用户相应的角色/权限进行验证用户是否进行操作,可以把Realm看成DataSource,即安全数据源。
也就是说对于我们而言,最简单的一个Shiro应用:
1、 应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;
2、 我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及权限进行判断。
        Shiro不会去维护用户、维护权限,这些需要我们自己去设计/提供,然后通过相应的接口注入给Shiro即可。

2.3.3 Shiro架构

接下来我们从Shiro内部来看下Shiro的架构,如下图所示:
图2-7 Shiro架构图
Subject: 主体,可以看到主体可以是任何可以与应用交互的“用户”;
SecurityManager: 相当于SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher,是Shiro的心脏。所有具体的交互都通过SecurityManager进行控制,它管理着所有Subject、且负责进行认证和授权、及会话、缓存的管理;
Authenticator: 认证器,负责主体认证,这是一个扩展点,如果用户觉得Shiro默认的不好,可以自定义实现。其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了;
Authrizer: 授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作,即控制着用户能访问应用中的那些功能;
Realm: 可以有1个或多了个Realm,可以认为是安全实体数据源,即用于获取安全实体的,可以是JDBC实现,也可以是LDAP实现,或者内存实现等等,由用户提供。注意:Shiro不知道你的用户/权限存储在哪及以何种格式存储,所以我们一般在应用中都需要实现自己的Realm;
SessionManager: 如果写过Servlet就应该指导Session的概念,Session需要有人管理它的生命周期,这个组件就是SessionManager。而Shiro并不仅仅可以用在Web环境,也可以用在如普通的JavaSE环境、EJB等环境。所以,Shiro就抽象了一个自己的Session来管理主体与应用之间交互的数据。比如我们在Web环境中,刚开始是一台Web服务器,接着又上了台EJB服务器,这时想把两台服务器的会话数据放到一个地方,就可以实现自己的分布式会话(如把数据放到Memcached服务器);
SessionDAO: DAO(数据访问对象)大家都用过,SessionDAO用于会话的CRUD,比如我们想把Session保存到数据库,那么可以实现自己的SessionDAO,通过JDBC写到数据库。或者把Session放到Memcached中,可以实现自己的Memcached SessionDAO。另外,SessionDAO中可以使用Cache进行缓存,以提高性能;
CacheManager: 缓存控制器,管理用户、角色、权限等的缓存,因为这些数据基本上很少改变,放到缓存中可以提高访问性能;
Cryptography: 密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密。

2.4 Apache Maven简介

官方万展:http://maven.apache.org

        Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。

2.4.1 Maven是什么

        Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。
        在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
Maven提供了开发人员的方式来管理:

  • Builds 
  • Documentation 
  • Reporting 
  • Dependencies 
  • SCMs 
  • Releases
  • Distribution 
  • Mailing list
            概括地说,Maven简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。Maven增加可重用性并负责建立相关的任务。

2.4.2 Maven目标

Maven最初设计,是以简化Jakarta Turbine项目的建设。在几个项目中,每个项目包含了不同的Ant构建文件。JAR检查到CVS。
Apache组织开发Maven可以建立多个项目,发布项目信息,项目部署,在几个项目中对JAR文件进行管理,并提供团队合作和帮助。
Maven主要目标是提供给开发人员:

  • 可重复使用,易维护,更容易理解的一个综合模型。 
  • 插件或交互的工具,声明性的模式。
    Maven项目的结构和内容在一个XML文件中生命,pom.xml项目对象模型(POM),这是整个Maven系统的基本单元。

2.4.3 Maven资源库

有些术语需要在Maven使用前理解。
Maven本地资源库
Maven的本地资源库是用来存储项目的依赖库,默认的文件夹是“.m2”目录,可能需要将其更改为另一个文件夹。
Maven中央存储库
Maven中央存储库是Maven用来下载所有项目的依赖库的默认位置。
如何从Maven远程存储库下载?如何添加远程库?
并非所有的库都存储在Maven的中央存储库,很多时候需要从其他位置添加一些远程仓库,而不是默认的中央存储库下载。
Maven依赖机制
这里的文章是关于传统方式和Maven方式的依赖库的不同,并说明Maven会从哪里搜索这些库。
定制库到Maven本地资源库
很多库仍然不支持Maven的pom.xml的概念,可以参考Maven指南掌握如何包括“非Maven支持”库到Maven本地资源库中。

(未完待续…)
完整资料下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值