自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 问答 (2)
  • 收藏
  • 关注

原创 解析配置文件自动装配 DataSource + AbstractRoutingDataSource + AOP 实现动态数据源 - 补充:兼顾事务回滚以及分布式事务的情况

前两篇文章已经介绍了动态数据源的具体实现过程,在经过一段时间的使用后,发现了两个比较严重的问题,在这里进行补充说明。事务执行失败时没有切回默认数据源@Transactional 注解的方法意味着使用数据库事务执行方法中的 sql 操作,默认情况下当方法抛出不受检查异常时,事务会进行回滚,我所实现的动态数据源方案通过 AOP 和注解的方式切换数据源, @Transactional 方法执行前切换...

2018-11-28 17:55:17 415

原创 MyBatis 缓存 - 上:一级缓存

在实际项目中,有些情况下相同的查询语句可能被重复执行,MyBatis 提供了一级缓存来优化这种情况,相同的查询 Sql 会命中一级缓存,直接返回,减少不必要的数据库查询提高性能。实现原理Mybatis 提供了 SqlSession 来方便使用者操作数据库,而正真执行数据库操作的是 Executor,一个 SqlSession 中有一个 Executor,每个 Executor 中有一个 Cac...

2018-11-19 11:46:28 205

原创 单体应用和服务化应用的一些思考

单体应用单体应用整个项目代码都在同一个应用工程中,这种方式在早期可以有效提高开发效率,测试、部署和运维也比较方便。少量的开发人员就可以完成所有工作。然而随着业务规模、数据量的不断扩大,单体应用就会出现问题,部署测试效率低下:每次修改了代码需要进行测试验证时必须将整个应用进行编译、打包以及部署,耗费大量时间;后期维护和迭代时开发难度大:单体应用的所有代码都在同一应用中,进行迭代时新需求涉及的...

2018-11-19 10:35:00 444

原创 Spring MVC 根据 controller 层方法入参和返回值动态生成日志 - 下 :借助 SpEL 或自定义的方式解析日志表达式

上一篇文章已经就如何获取到 controller 层方法的参数和返回值进行了详细分析,并且封装了 HandlerMethodPostProcessor 接口以便使用,接下来就实现业务需求:根据 controller 层方法的入参和返回值动态生成日志。实现日志解析实现思路是这样的:定义一个注解,注解的 value 为日志表达式,HandlerMethodPostProcessor#postPro...

2018-11-16 16:55:13 930

原创 Spring MVC 根据 controller 层方法入参和返回值动态生成日志 - 上 :寻找扩展点并进行封装

背景需求是这样的:对网关层指定接口(url)的调用情况做日志记录,日志需要根据 controller 层方法的入参和返回值动态生成。如果只是记录 url 的调用情况可以直接使用 HandlerInterceptor 实现,但需求中需要能够访问入参和返回值,虽然通过拦截器提供的接口也可以解析到请求参数以及返回值,但都需要对这些参数进行一定的处理,因此直接在 Controller 层方法上处理是最...

2018-11-16 16:02:17 1702

原创 Docker 二:IDEA + Docker 插件创建镜像并运行 spring boot 项目

IDEA 上提供了 Docker integration 插件,可以很方便的管理镜像和容器,当然这些操作通过命令行也能完成,使用 IDEA 插件方式的另一个便利在于 IDEA 提供了 Docker 配套的 Configuration,可以一次性定义好操作序列,修改代码或资源后只需 Run/Debug Configuration 即可。接下来直接通过示例项目介绍这些操作。项目结构网关项目:g...

2018-11-16 10:20:26 915

原创 Docker 一:入门

Docker 可以用来打包应用、依赖以及环境到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。docker 两个关键的部分为容器和镜像,这两者的关系可以理解为 OOP 中类和对象的关系,容器作为对象,镜像作为类。Docker 镜像是用于创建 Docker 容器的模板,容器可以独立运行一个或一组应用。参考 这里常用命令从镜像仓库(类似于代码仓库)拉取已有镜像:docker p...

2018-11-14 16:15:36 210

原创 解析配置文件自动装配 DataSource + AbstractRoutingDataSource + AOP 实现动态数据源 上:原理解析,解析数据源

spring boot 自动装配会通过 spring.datasource.*为我们自动装配数据源,所以想要动态的切换数据源,第一件事是配置数据源,其次是怎么切换?最后何时切换?原理解析(使用 AbstractRoutingDataSource 实现)spring-jdbc 提供了 AbstractRoutingDataSource 在 getConnection() 时通过 lookup k...

2018-11-13 17:16:22 836 1

原创 解析配置文件自动装配 DataSource + AbstractRoutingDataSource + AOP 实现动态数据源 下:配置动态数据源,AOP 进行使用

上篇文章中已经借助 DynamicDataSourceBuilder 类从配置文件中解析得到了默认数据源和动态数据源,接下来需要配置动态数据源的“本体”,并借助 AOP 动态的切换数据源。配置动态数据源AbstractRoutingDataSource 实现了 InitializingBean 接口,在 afterPropertiesSet方法中通过处理 targetDataSources 和...

2018-11-13 17:14:39 674

原创 fastjson 始终将 null 对象以 "null " 的形式返回到前端引发的源码解析 - 上:从 DispatcherServlet 出发

背景项目中使用 fastjson 将 spring MVC 返回结果输出为 json 格式数据,有个需求是 null 对象不输出,即前端不会接收到 "obj": null 形式的 json 数据,然而在进行如下的配置后, null 对象始终输出,因此以阅读源码的方式解决该问题。源码分析DispatcherServletDispatcherServlet 是 spring MVC 的入口 ...

2018-11-07 13:21:54 600

原创 fastjson 始终将 null 对象以 "null " 的形式返回到前端引发的源码解析 - 下:来到 fasjson 内部,消除疑惑

接上篇:fastjson 始终将 null 对象以 "null " 的形式返回到前端引发的源码解析 - 上:从 DispatcherServlet 出发终于来到了 fastjson 内部。FastJsonHttpMessageConverter内部又调用了一系列的方法,最终定位到了 JavaBeanSerializer#write 的 216 行。在这里 fastjson 与 sprin...

2018-11-07 13:20:02 505

原创 从 HTTPServletRequest 中根据 User-Agent 获取访问设备信息

背景:根据 HttpServletRequest获取访问设备信息。Http 协议请求头中的 User-Agent属性会将客户端设备的信息传递给服务器,这些信息包括客户端操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。参考: 用户代理(User-Agent)然而客户端设备种类、操作系统及其版本繁多,使得 User-Agent 参数的值也有很多种可能。庆幸的...

2018-11-01 18:45:35 15751 2

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除