原创SpringMvc+Mybatis+Redis框架

声明:

本人提供这个 SpringMVC + Mybatis + Redis 的Demo 本着学习的态度,如果有欠缺和不足的地方,给予指正,并且多多包涵.

PS:最近发现Spring Boot十分火但是了解了几次都觉得没意思,不知道大家对此有什么想法
源码地址

框架运行环境:

Maven:3.3.9

Eclipse:MARS.2

JDK:1.8

Tomcat:8.0.36

功能介绍:

声明:
	本人提供这个 SpringMVC + Mybatis + Redis 的Demo 本着学习的态度,如果有欠缺和不足的地方,给予指正,并且多多包涵.
	PS:最近发现Spring Boot十分火但是了解了几次都觉得没意思,大家能给我说说为什么么?
	
框架使用环境:

		Maven:3.3.9		Eclipse:MARS.2
		JDK:1.8				Tomcat:8.0.36
		
框架包含内容:

	一、权限控制
	
		权限曾一度打算采用Shiro来实现,确实了解之后也发现了Shiro的强大,但是强大之余也发现自己并用不了那么多东西,其实现在权限大都采用RBAC(Role-Based Access Control)这种模型来实现的访问控制,本项目也是采用这种模型
		来实现的访问控制。在这之前先介绍一下三个自定义注解
		@RequiresRoles:在本系统代表必须具备某角色才能访问该方法 如果满足角色要求将不会继续判断权限
		@RequiresPermission:在本系统代表必须具备某权限才能访问该方法 如果满足权限要求将不会继续判断操作
		@RequiresOperation:在本系统代表必须具备某操作权限才能访问该方法 这是目前权限控制的最小颗粒,至于跟业务相关的权限只能在业务逻辑中判断了
		而这些注解全作用于方法上
		至于实现思路很简单,利用拦截器接管所有请求,然后根据用户携带的token(登录时会返回一个token作为用户的合法令牌)从缓存中获取用户信息并从数据库加载出改用户的角色和权限数据然后根据反射获取访问该方法的注解的值
		比较是否满足 满足则继续执行 不满足则提示相关操作无权限之类的,这里我是把权限信息首次加载后放入缓存,系统内的高热点数据建议大家都放入缓存效率高得多,然后有地方修改对应用户的权限时清除改用户的权限缓存,具体
		的请参照Spring Cache这里完全把Redis和Spring Cache结合在一起了 完全不需要代码来操作redis(除了业务中需要特殊处理的东西)

		PS:关于RBAC附上一个博客地址,这里介绍得很好http://blog.csdn.net/painsonline/article/details/7183613/
		
	二、日志异常提醒
	
		日志采用的是slf4j,为啥配置文件就是log4j.xml大家可以百度一下这两个的关系,要求高一点的可以使用logback,基本的配置没啥技术难度,无非就是集成了网络上很多大咖的建议的综合体。
		日志我除了控制台打印的之外,其他对INFO、WARN、ERROR三种日志进行了分类操作 每种日志分类写入并按天分割
		然后对于错误级别及以上日志进行了特殊处理,发生错误及以上级别的日志都会进行邮件提醒,这里踩了很多坑,网络上也有教程 但是大多数都是同步发送邮件(SMTP其实超慢滴,同步你就死了)还有就是网络上的配置都是一个错误
		发送一封邮件(这要是错误率低的系统还好,要是不成熟的话,每天报个千儿八百的错那你就哭了),你去百度一定会百度到很多说啥配置BufferSize就可以控制了之类的问题,跟你们打包票的说,这都是胡乱转载人家的帖子,人家原文
		说的是写入日志的配置是这个意思(xml内我打了注释那几个)但是发送日志源码的意思是缓冲多少个Event事件(一个异常一个事件)然后超过这个BufferSize(默认512)设定的值之后覆盖之前的事件,就这个意思而已,人家判断发送邮件
		的条件是event的级别是否为error。
		所以这里我重写了他的SMTPAppender类,实现了ErrorSize参数,控制当多少个event事件发送一次,具体的请参考源码
		
	三、Spring+Redis整合
	
		这里就简单带过就是,重写了spring-data-redis里面的几个类,目的为了实现redis的访问自动延期,和为单用户登录提供了些方法
		
	四、单用户登录(同一个用户只能在一个地方登录)
	
		这里大家最好看源码,我登录里面调用了,自己跟踪去看看怎实现的(轮询缓存也可以实现,但是呵呵)
		
	五、RSA分段加密
	
		这个为啥要单独提出来呢!目前JDK中提供的最牛的加密算法了,虽然ECC比这更牛,可是JDK没整完,具体类在utils项目的rsa包内,类中提供了密钥对的生成、加密、解密、和转化为.Net格式的密钥等方法,并采用分段加密解密技术
		突破了加密内容的长度限制,但是内容越多加密越慢!视场景而使用。
		
	六、Spring Mail
	
		这个网络上都有配置,我只是包装了些实体类简化调用
		
	七、实体类校验
	
		采用的是Hibernate Validator校验,但是它使用都尼玛要在方法中每个都去判断,这对我这类懒得XX的人来说肯定受不了,于是就用拦截器统一处理了,具体参照org.system.intercept.ValidInterceptor.java
		
	八、自动分页
	
		org.system.intercept.PaginationInterceptor.java 不多说拦截的是mybatis,如果设置了page和rows这两个分页参数那么我就和先查询总数放入实体类的total属性中并对接下了的查询limit操作,就这样
		
	九、全局异常处理
	
		org.system.exception.ExceptionResolver.java拦截所以异常并封装成json格式,没做全局页面的配置,拦截器中是根据返回是否是json来判断的,不是json原来该怎么做就怎么做不影响
		
	十、多数据源配置
	
		系统还实现了多数据源配置,使用起来可能会让你觉得异常简单,自定义了一个注解@DataSource 里面只需要填数据源名称就能切换了,可作用于类、方法上,还有就是提供了DataSourceContextHolder类,里面有相应方法可以在
		业务逻辑中随时切换数据源 他们之前的优先级关系是DataSourceContextHolder>@DataSource(方法)>@DataSource(类)
		
	十一、其他
	
		好像没啥可以拿出来说的了,哦,对了,json解析器换成了fastjson,原因嘛百度fastjson和jackson就知道了,这里不是快了一点点,还有也配置了Spring Task 简单的定时任务,org.service.task.ServiceTask.java这里面有使用demo
		

框架结构:框架全采用maven管理 所以源码只有很小要是不会Maven就请自行补习

原创SpringMvc+Mybatis+Redis框架_第1张图片

core:主要是些顶层的封装

原创SpringMvc+Mybatis+Redis框架_第2张图片

annotation:自定义注解 

原创SpringMvc+Mybatis+Redis框架_第3张图片

这次主要包含两部分,第一是数据源相关的注解 第二是访问控制相关的权限注解

@DataSource:这是用来切换数据源的注解 作用于service层的实现类上或者方法上,这时改类或者该方法就使用该数据源进行操作,更详细的例子请参考项目源码里面的介绍。

package org.core.annotation.db;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/** 
* @author Liu.Gang.Qiang 
* @date 2017年7月14日 
* @version 1.0
* @description 多数据源注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface DataSource {
	/** 
	* @author Liu.Gang.Qiang
	* @return {@link String}
	* @date 2017年7月15日 
	* @version 1.0
	* @description 数据源名称,来源Spring配置
	*/
	String value();
}
@RequiresRoles
@RequiresPermission
@RequiresOperation

实现的类似于shiro的权限 但是比较简单不喜勿喷 没shiro强大,然后自己结合RBAC+Redis+ Intercept+Filter技术实现的,对于自己目前遇到的权限问题我用这个也完全够用了。至于为什么没用shiro并不是shiro不强大只是不太喜欢那么复杂的用法(虽然已经很简单了) 我是懒得出奇的人 不过还是建议大家多去学习shiro这个权限框架毕竟连Spring都推荐使用Shiro RBAC是一个数据库的设计模型简单理解为:用户-角色-权限-资源 这里不再多说有个网友帖子写得不错 点击打开链接 拦截器什么滴也不多说spring的核心之一

entity:实体类的父类很简单自己看源码就行

log4j:这里重写了log4j的SMTPAppender这个类 首先说说这个类是干嘛的 他是用来发送邮件的当报错时邮件通知管理员,具体的请参考我的另一篇博客,上面有详细介绍点击打开链接

mapper:所有mapper的父类 默认提供了几个常用的方法

message:提示语相关的东西 都不知道咋描述 就是为了代码中不允许有一个中文和硬编码的存在 当然自己也可以改改实现国际化

result:针对返回结果的格式的统一封装 题外话:这个框架完全是为了提供接口而生 所以很多什么页面跳转什么滴都没做只做了返回json这块 连异常都封装成JSON了所以有其他要求的只能自己修改修改了
servlet:主要封装了自定义的request请求,方便自己在处理业务之后修改参数

utils:看名字就知道一些常用的工具类 有什么身份证、经纬度、日期计算、DES和RSA加密、MD5之类的东西 具体请看代码类注解 我觉得我注解已经很多了

原创SpringMvc+Mybatis+Redis框架_第4张图片

jedis:这里重写了spring-data-redis里面的RedisCache、RedisCachemanager两个类和封装了一些其他的类目的就为了实现redis的自动续期和单用户登录功能(一个用户同时只能在一个地方登录)如果需要实现不同平台的单户登录需要自己小改一下 在缓存中多加个平台标识就行了

原创SpringMvc+Mybatis+Redis框架_第5张图片

platfoem:这是web项目 名字不必纠结 介绍下包的作用

原创SpringMvc+Mybatis+Redis框架_第6张图片

org.task:系统的一些服务类 这里只有定时任务(Spring Task)

org.tools:Spring Mail和多数据源处理类

org.system:这就是业务的相关处理部分了 具体就不详细介绍了


框架的大致结构就介绍到这里 下面说一下配置的xml 有人说多 其实还还好,不喜欢多的可以合一下,两个就能解决了,我分开是为了更明显的区分

web.xml



	platform
	
	
		contextConfigLocation
		
				classpath*:applicationContext.xml,
				classpath*:spring/*.xml
			
	

	
	
		org.springframework.web.util.IntrospectorCleanupListener
	
	
	
		org.springframework.web.context.ContextLoaderListener
	

	
	
		CharacterEncoding
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
	
	
		CharacterEncoding
		/*
	
	
	
		BaseSecurityFilter
		org.system.intercept.BaseSecurityFilter
	
	
		BaseSecurityFilter
		/*
	
	
	
		spring
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			classpath*:spring-mvc.xml
		
		1
	

	
		spring
		/*
	


接下来是Spring的配置文件目录结构如下


applicationContext.xml




	
	

	
	

	
	

	
	
	
	

	
	
db.xml主要是数据源和事务相关配置



	
	
		
		
			
				
				
			
		
		
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
	

	
	
		
		
		
		
		
		
	

	
	

	
	
		
	

	
	
		
			
			
			
			
		
	

	

	
	
		
		
		
		
		
			
			
			
		
	
mail.xml邮件配置




	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
			
				
				${mail.smtp.auth}
				
				${mail.smtp.timeout}
				
				javax.net.ssl.SSLSocketFactory
				
				${mail.smtp.starttls}
			
		
	
mybatis.xml MyBatis配置




	
	

	
	
		
	

	
	
		
		
	
redis.xml Redis相关配置 JDK8发不出去邮件的原因和解决方案请看点击打开链接




	
	
		
		
		
		
		
		
		
		
		
		
	

	
	
		
		
		
		
		
	

	
	
		
	

	
	
		
		
		
		
		
			
				
				
			
		
	

	
	


接下来是spring-mvc.xml




	
	

	
	
		
		
		
		
	

	
	
		
		
	

	
	

	
	
		
		
		
		
	

	
	
		
			
				
				
					
						WriteMapNullValue
						WriteNullStringAsEmpty
						WriteDateUseDateFormat
					
				
			
		
	

	
	
		
		
		
	
	
	
	
		
		
		
		
	
	
	
	
		
		
			
			
		
	


接下来的是log4j.xml:也可以使用properties因为我使用的是异步发送邮件 我知道的只能用XML来配置 如果大家有properties配置能实现的麻烦通知下我 我其实比较喜欢properties




	
		
	
	
		
			
		
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
			
		
		
		
			
			
			
			
		
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
			
		
		
		
			
			
			
			
		
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
			
		
		
		
			
			
			
			
		
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
			
		
	

	
	
		
	

	
	
		
	
	
		
	

	
	
		
		
		
		
		
		
	

最后是conf.properties

如果对应的没变化就不需要改 后面提供的框架源码这块都会是错的请谅解

###数据库连接配置 包括多数据源
#驱动路径
db1.driverClassName=com.mysql.cj.jdbc.Driver
#URL连接地址
db1.url=jdbc:mysql://localhost:3306/temp?useUnicode=true&characterEncoding=utf8&mysqlEncoding=utf8&autoReconnect=true
#数据库用户名
db1.user=yxt
#数据库用户密码
db1.password=yxt315
#数据库连接池初始化大小
db1.initialSize=5
#数据库连接池最小连接数
db1.minIdle=2
#数据库连接池最大连接数
db1.maxActive=50
#数据库连接池连接等待超时时间
db1.maxWait=6000

#驱动路径
db2.driverClassName=com.mysql.cj.jdbc.Driver
#URL连接地址
db2.url=jdbc:mysql://localhost:3306/develop?useUnicode=true&characterEncoding=utf8&mysqlEncoding=utf8&autoReconnect=true
#数据库用户名
db2.user=yxt
#数据库用户密码
db2.password=123456
#数据库连接池初始化大小
db2.initialSize=5
#数据库连接池最小连接数
db2.minIdle=2
#数据库连接池最大连接数
db2.maxActive=50
#数据库连接池连接等待超时时间
db2.maxWait=6000


###邮件服务器设置
#协议类型
mail.smtp.type=smtps
#服务器地址
mail.smtp.host=smtp.qq.com
#服务器端口
mail.smtp.port=465
#是否验证账号密码
mail.smtp.auth=true
#是否启用TLS
mail.smtp.starttls=false
#连接超时时间
mail.smtp.timeout=25000
#用户名
mail.username=自己填
#用户密码<现在很多采用的是授权码>
mail.password=不告诉你

###Redis缓存配置
#缓存池最小空闲数
redis.minIdle=5
#缓存池最大空闲数
redis.maxIdle=100
#缓存池最大连接数
redis.maxTotal=300
#最大等待时间
redis.maxWaitMillis=3000
#使用连接时是否测试可用
redis.testOnBorrow=true
#主机地址
redis.host=不会告诉你IP
#主机端口
redis.port=6379
#主机密码
redis.password=123456
#数据库下标
redis.database=4








你可能感兴趣的:(Spring)