框架学习
文章平均质量分 56
micro_hz
Engineer
展开
-
MybatisPlus自增ID超大自动时间戳生成排查
问题数据库我预期是用自增ID,但是用MybatisPlus动态SQL框架写入,ID是非常大的一个值。分析调用insert是动态生成SQL,id为空。由于动态SQL主要sqlSession执行过程如下图,其中关键到了预编译参数的process方法,此时的id还是null。此时会根据entity去获取表的信息,其中就包含了ID生成规则的定义。其中默认在框架启动的时候定义为idType为ASSIGN_ID的策略。接着就去处理主键。这里用内部的方法填充ID可以看到才去类似雪花算法的生成逻原创 2021-06-02 14:32:40 · 781 阅读 · 0 评论 -
阿里云OSS请求文件跨域问题Access-Control-Allow-Origin
跨域问题网上很多解决方案提示到这里配置但是不生效,一定要勾选Vary:Origin这个选项,请求的时候浏览器记得请求在控制台要清理缓存。原创 2021-06-01 14:05:57 · 2395 阅读 · 0 评论 -
单元测试规范&Mybatis+SpringBoot+H2实战
背景介绍为了长期持续高质量、高效率的迭代,必须遵守一定的研发规范,其中主要包括静态代码的扫描和单元测试两个部分。风险认知行业的普遍共识,风险识别暴露的越晚,修复的成本越高。好代码不是一蹴而就的,是持续重构出来的目标技术选型最佳实践安装sonarLint本地IntelliJ IDEA安装sonarlint,根据提示重启IntelliJ IDEA即可有两个选项:根据本地修改扫描和全量扫描。可以根据实际情况开启。扫描结果如下:此处扫描出范型约束丢失的可能运行时异常,风险等级为M原创 2021-05-10 12:51:59 · 3833 阅读 · 0 评论 -
Dubbo部署导致上游调用报错问题排查
现象在部署的时候,总会有上游的部分调用请求出错。在流量小的时候这样的报错是能容忍的,但是库存作为核心服务,高并发的极小的流量,它占的绝对值的数量也不小,所以这个问题已经到了不得不解决的地步。开始抓取以下的日志进行分析。原因分析应用启动的日志:启动的时间点为:16:48分,但是准确的服务提供的时间其实并非这个时间点。因为我们在应用层用AOP去拦截了所有请求,看请求日志如下:也就是说27...原创 2019-10-16 19:41:43 · 781 阅读 · 0 评论 -
node.js脚手架搭建
我是主攻后端的开发人员,但是项目人手紧缺,我的经历刚好是做过node.js后端,所以我们前后端的分离工作就交到我的头上来了,这次我们采用node.js。前端的使用和后端果然还是很多不同的。node.js在系统中处的作用我的理解就是分离前后端,后端更多提供一个数据服务,传统的后端可能就是MVC,在我看来C就是控制器,主要的工作就是在参数的校验和数据与视图的整合。这个部分是可以交给前端去做的,让后端与视原创 2017-05-05 17:01:30 · 7685 阅读 · 0 评论 -
springMVC文件上传源码
springMVC是流行的web框架,它不仅轻量灵活还提供了一系列可扩展的功能,这次我们分析一个http上传请求在spring框架中的处理源码,其实本博客更多是博主自学总结使用,上篇spring源码的博文被推送到首页让博主手从若惊,一方面为自己的努力得到认可兴奋,另一方面则是担忧自己学识浅薄怕误人子弟,分析不一定面面俱到,因此我给自己的规定是尽量到自己不确定的细节不去猜测而更多客观描述,把一个生动具原创 2017-06-03 13:33:40 · 773 阅读 · 0 评论 -
spring中ApplicationListener源码分析
最近做一个功能,需要在整个服务器容器加载完成就触发执行,这个时候我只需要实现ApplicationListener即可。spring的这个接口就是给一个观察的入口,可以在各个阶段去触发相应的操作。不难看出这就是典型的设计模式之观察者模式。这次我们以观察者的观点去分析一下ApplicationListener。/** * Interface to be implemented by applicat原创 2017-05-06 21:30:47 · 2439 阅读 · 0 评论 -
springMVC容器加载源码分析
springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请求过程中,为了能够灵活定制各种需求,所以提供了一系列的组件完成整个请求的映射,响应等等处理。这里我们来分析下springMVC的源码。 首先,spring提供了一个处理所有请求的servlet,这个servlet实现了servlet的接口,就是DispatcherServlet。把它配置在web.xml中,并且处理我们原创 2017-05-24 15:54:29 · 2297 阅读 · 0 评论 -
AOP自定义校验功能模块
上一篇博客写了用AOP去完成参数校验的功能,但是作为一个比较通用的解决方案,如果要添加新的校验规则,最好是不需要修改原有的代码。前一篇博客在注解里把校验规则给写死了,这是不灵活的。拦截到了请求之后我们可以定制具体的校验方案。想想之前学的设计模式之策略模式不就是在一系列相同步骤当中封装了容易变化的部分么。因此这次我们采用策略模式来设计校验工具。 首先定义一个策略接口:最开始的思路是这样的,用一个拦截原创 2017-04-19 15:53:48 · 956 阅读 · 0 评论 -
BeanFactoryPostProcessor的使用
spring容器中Bean的加载包含一系列的过程,bean的启动过程主要是org.springframework.context.support.AbstractApplicationContext.refresh() 方法。主要阶段包含:// Prepare this context for refreshing. prepareRefresh();原创 2017-03-22 15:39:31 · 1877 阅读 · 0 评论 -
MySQL与Spring事务管理
数据库事务是保证在并发情况下能够正确执行的重要支撑,MySQL常见的数据库引擎中支持事务的是InnoDB,事务就是一系列操作,正确执行并提交,如果中途出现错误就回滚。事务要保证能够正常的执行,就必须要保持ACID特性,这在前面的文章当中有提到,本文也偏重spring的事务管理配置demo因此不做过多的概念介绍,网上的资料已经比较丰富。这是HeidiSQl截图查看不同引擎的特性: 数据库的事务的隔离原创 2017-03-02 20:08:21 · 4421 阅读 · 1 评论 -
Spring容器加载Bean源码分析
关于面向对象中接口的作用spring的核心就是控制反转与依赖注入容器,整个容器内对象的依赖关系被容器管理,而这种具体的依赖关系可以通过很多方式,面向对象设计的设计就是面向接口编程,因为接口是定义规范,接口的具体实现不关心,给调用方使用的只是一个黑盒,而这个黑盒的具体表现就是一个接口,就像我们平时使用的物理接口,我们并不关心接口内的电路构造,我只关心这是哪种接口,我的设备是否可以使用而已。关于spri原创 2017-06-11 12:29:00 · 562 阅读 · 0 评论 -
spring-boot使用mongoDB
spring-boot的高度自动化有利有弊,好处就是利用约定大于配置大大降低了很多常规配置,只需要配置关键的东西即可。但是缺点就是很多情况下如果报错,很难查找,加上国内的springboot的文档并不多,这次我在spring boot 中使用了mongoDB做存储。 首先添resources下面加配置文件: application.yamlspring : application :原创 2017-07-12 16:54:18 · 1553 阅读 · 0 评论 -
spring-boot使用profile环境切换
spring-boot是一个大大减少配置的环境,平时我们开发应用是要把开发环境和测试环境的配置给分开,我们可以在spring-boot中去使用profile轻松完成环境的切换。文件的命名规范application-{profile}.properties 其中profile就是环境的名称,application-dev.properties与application-pub.properties.原创 2017-07-05 19:22:40 · 5505 阅读 · 0 评论 -
Dubbo与spring-boot使用
背景介绍互联网公司与传统公司的信息化一个很大的不同就是架构更加偏向分布式,并非这个比较高级或则是某个人的偏好,而是由于业务基因所决定,因为传统公司往往需求是明确的,开发结束就能够长期稳定运行,互联网公司就不一样,大多都是从一个小的产品迭代而来,需求往往不明确,所以像传统公司按照需求来评估硬件资源变的不现实,分布式开发开辟了另一个横向扩展 scale out的思路用分布式集群达到提供强大服务的方式。原创 2017-07-19 12:08:20 · 1754 阅读 · 0 评论 -
spring boot 缓存@EnableCaching
很多时候系统的瓶颈都在一些比较复杂的IO操作,例如读取数据库,如果一些比较稳定的数据,一般的解决方案就是用缓存。spring boot提供了比较简单的缓存方案。只要使用 @EnableCaching即可完成简单的缓存功能。缓存的实现有多种实现,ConcurentHashMapCache , GuavaCache, EnCacheCache等多种实现,spring boot 有默认的实现。本文不深入源原创 2017-08-02 22:51:29 · 40080 阅读 · 9 评论 -
spring boot的ActiveMQ使用
消息队列能够有效的降低系统请求峰值,也能够达到解耦的效果。spring boot对MQ也有比较好的支持。本文演示spring activeMQ的使用,首先在linux安装ActiveMQ:wget https://archive.apache.org/dist/activemq/5.13.0/apache-activemq-5.13.0-bin.tar.gz然后解压找到 bin下面的脚本启动消息中间原创 2017-08-03 19:10:29 · 754 阅读 · 0 评论 -
spring boot启动过程
spring已经成为实时上的J2EE标准,spring boot并没有提供太多新的特性,而是发现了大部分的模板配置,没必要重复的配置,而且现在脚本语言大行其道,并且微服务的诞生让更多项目的构建和部署,spring这些大量的配置文件带来很多不必要的工作量。spring boot顾名思义能够自动化的启动一个应用。以spring-boot-starter-web为例,它其实就是引入了一个组合pom.xml原创 2017-08-22 17:25:58 · 534 阅读 · 0 评论 -
设计模式之模板方法
模板方法是一个十分常见的设计模式,它并不复杂但是它带来的好处就是定义流程框架,而不关注实现细节,前两天看到一句话又回味了一把之前很欣赏的面向对象设计思想,接口和抽象类的概念就是能够让外部依赖的东西尽量抽象,依赖抽象而不依赖细节,这样更容易开发出高内聚低耦合的系统。 模板方法具体如何实现这种流程编排,屏蔽细节的效果呢。 有几个角色模板类:它一般定义一套比较完整的流程,这些流程定义叫做模板方...原创 2018-05-11 11:28:26 · 302 阅读 · 0 评论 -
Druid SQL注入检测
今天遇到一个问题:### Error updating database. Cause: java.sql.SQLException: sql injection violation, comment not allow我的SQL 如下:update xxx <set> <if test="availCount != null"&...原创 2019-08-19 19:06:28 · 2012 阅读 · 0 评论 -
基于注解spring AOP实现
spring容器的三大特点:控制反转,切面编程(Aspect of Program)与事务管理这次写了个spring切面编程的demo,spring对切面编程的支持主要在对象的方法调用层次.用最简单的手段实现最多的功能,这是spring的设计哲学.因此spring支持最完善的也是对于方法的拦截.spring进行切面编程的主要手段是生成代理.在代理对象执行目标对象所拦截方法前后或者周围提供各种功能.切原创 2017-01-20 16:46:45 · 511 阅读 · 0 评论 -
SpringMVC @RequestBody使用
Spring mvc是一个非常轻量的mvc框架,注解可以大大减少配置,让请求的拦截变得比较简单。这次记录下@RequestBody 注解接收参数尤其是数组参数的用法。 关于容器的配置不再多说,这里写出spring-servlet.xml的sechme:<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://ww原创 2016-11-14 12:15:11 · 29632 阅读 · 1 评论 -
Spring注解方式使用与注册bean
这次使用注解来完成注入功能,首先我们先直接使用bean,仍然是在容器里定义Bean,然后我们使用装配,首先装配的是Resource注解,这个注解是java自带的,需要指定注解路径。<context:annotation-config /> <context:component-scan base-package="annotation"></context:component-scan>可原创 2015-09-18 13:19:39 · 1506 阅读 · 0 评论 -
Spring xml注入实例
spring是十分优秀的开源框架,大量的java web项目受益于spring,控制反转和切面编程是spring的两大特点,上次我有实践简单的注入实例,也结合了注解去完成了注解的装配和bean注册,这次我们以更多的方法去解决xml的注入问题,相信掌握好了xml的注入,注解使用起来会更加得心应手。 首先我们来创建工程目录: 最开始我创建了一个包将applicationContext.xml放到原创 2015-09-17 19:24:53 · 973 阅读 · 0 评论 -
SpringMVC介绍之约定优于配置
所谓的约定优于配置就是指在程序开发过程中我们约定好一些规则可以使我们更少的进行配置和代码编写。就这么简单的一句话可能你还不是很懂什么是约定优于配置,没关系,看完后面对SpringMVC的约定优于配置的介绍之后你就会明白了。SpringMVC对约定优于配置的支持主要表现在三个方面,Model、View和Controller。Model:SpringMVC对Model的约定优于配置的支持是基于Model转载 2015-11-05 11:54:32 · 2264 阅读 · 3 评论 -
多个字段排序业务处理
写业务当中感觉最开始就是新建实体类和表,然后看需求,然后分析怎么去CUID操作,然后就开始去写SQL语句,使用Mybatis可以比较灵活的去解决ORM。这次挑战是对小时粒度的处理,解决方案是采用了部分的重构,提取方法和清晰的数据结构定义。 - 首先看一张表的结构: describe [tableName]; 已经存在表中的数据如下: 按照两个粒度,分别是日和小时。 日原创 2015-09-10 09:53:29 · 784 阅读 · 0 评论 -
SpringMVC与mysql进行登录验证
SpringMVC可以基于Annotation去请求方法,这次我们来实现SpringMVC+mysql的验证与页面跳转。 创建web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.c原创 2015-08-16 15:01:07 · 5335 阅读 · 12 评论 -
SpringMVC的页面跳转
点击页面跳转至FirstSpringMVC并跳转到另一个页面:Spring mvc 的jar包拷贝到 WEB-INF/lib下文件目录结构: 首先建立web.xml:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http原创 2015-08-16 13:31:15 · 1070 阅读 · 0 评论 -
spring注解装配bean简单例子
由于刚开始学习注解的使用,所以就不介绍更多的注解了,这次演示只使用Controller与Autowired注解。分别表示注解为bean和装配bean。Controller可以添加bean的id。首先创建一个接口:package bean;public interface Animals { public void print();}创建两个实现接口的类:package bean;i原创 2015-08-14 10:11:43 · 684 阅读 · 0 评论 -
Spring中控制反转实例
定义一个抽象的类(接口):package springIOC;/**@author:micro_hz2015年8月12日 */public interface Animals { //定义方法 void eat(); void roar(); void run();}定义两个实现类:package springIOC;/**@author:micro原创 2015-08-12 11:06:01 · 582 阅读 · 0 评论 -
基于xml的springMVC请求与数据返回
首先我们构建一个请求和返回数据的一个实例。 工程目录如下: 需要的jar包为spring与mvc相关的,这里我们还用到EL表达式: springMVC好处就是请求发送给统一的一个DispatcherServlet控制器,然后再由这个转发器转发给各个小型的控制,然后返回对象,可以采用ModelAndView去返回。 web.xml:<?xml version="1.0" encoding=原创 2015-09-23 09:13:32 · 1852 阅读 · 0 评论 -
springMVC的视图层解析与服务层调用
这次项目用的平台是Zookeeper+Dubbo+SpringMVC+Mybatis,再次熟悉一下springMVC的搭建流程。 工程项目目录: 创建Web.xml:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="h原创 2015-10-13 10:06:48 · 1577 阅读 · 0 评论 -
注解驱动的springMVC与参数绑定
最近一直在学习spring MVC。真的很灵活,这次主要做个前台传入数据到控制器并调用服务层来完成数据验证工作并跳转页面。工程目录结构这次由于没有连接数据库,所以没有设置dao层。直接在service里面做了验证处理。 需求是从前台传入username和password两个参数到后台验证过完成页面跳转。 首先配置web容器的web.xml:<?xml version="1.0" encodi原创 2015-09-24 20:44:12 · 581 阅读 · 0 评论 -
利用mybatis-generator生成ORM
mybatis是非常流行的持久化框架,自动化虽然没有hibernate那么高,但是灵活性更高些,可以手动写一些执行效率较高的SQL语句。对于持久层dao还有sqlmap和entity(model)我们更希望关注在业务上也不是框架的书写规则上,因此,这次介绍这个generator工具就是提供了自动完成持久层的装配,我们只要定义好了表结构,利用xml文件配置一下,这个工具自动帮我们装配生成持久层相关的模原创 2016-05-12 11:21:22 · 1897 阅读 · 0 评论 -
内置Jetty HTTPS启动
上一章用内置的jetty搭建了web服务,主要是加载容器和选择通道,这次我们来搭建一个支持安全协议SSL的web服务,即https。 我们先来复习两种加密的方式,一种是对称加密,另一种是非对称加密。 对称加密就是解密和加密的秘钥是一样的,代表性的为AES算法。这种传输的效率要高一些,但是保密性较差,因为秘钥的保管十分重要。 非对称加密就是加密的秘钥和解密的秘钥不相等,也就是分为公钥和私钥。这样原创 2016-07-12 16:03:10 · 10733 阅读 · 3 评论 -
log4j不能打印日志到文件解决
最近自己做个项目,想把不同的日志打印到不同的文件,配置如下:log4j.rootCategory=DEBUG, stdoutlog4j.rootLogger=DEBUG, stdout, FILE#### stdout ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=原创 2016-06-29 13:31:48 · 14149 阅读 · 1 评论 -
spring使用log4j打印日志
日志是记录运行状态的重要监控工具,这次我们介绍使用强大的log4j。首先引入log4j的jar。我们可以设置不同的级别,分别有FATAL,ERROR,INFO,DEBUG,ALL级别,可以根据需要选择。也可以把打印内容输出到对应的文件,或则是输出到不同的文件,common-log是一系列接口,具体实现类由log4j实现,Web加载log4j的配置文件默认名字为:log4j.properties,可以原创 2016-06-28 10:45:06 · 3258 阅读 · 0 评论 -
springMVC@RequetMapping无法url映射方法问题
今天我搭建了一个新的项目,但是使用了springMVC框架来将对应的url请求对应的方法,在web.xml配置如下:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/jav原创 2016-05-20 17:57:40 · 4521 阅读 · 0 评论 -
设计模式之装饰模式
有很久没谈关于设计模式的内容了,这次我想来谈谈新的看法。 在这里我还想再次啰嗦两句设计的原则:开闭原则,依赖倒置,接口隔离,里氏替换原则,最小知识,单一职责。 还有几个规范:面向接口编程是稳定的架构,能使用组合尽量不使用继承来关联,重写破坏了对象的封装性破坏了开闭原则。 关于设计模式,没有特定的规范,这只是一种思想,同一种设计模式可能演变出很多类似的变种,这个时候死板硬套并不原创 2016-05-06 13:22:36 · 693 阅读 · 0 评论 -
ajax请求springmvc与mvc:annotation-driven
昨天遇到两个问题有必要在此做个记录。逻辑是在页面发送ajax请求到spring mvc controller里,该ajax如下:function buyHouse(houseId) { houseId = houseId.attr("value"); $.ajax({ type : 'post', url : "buyHouse.do",原创 2016-04-28 09:58:39 · 854 阅读 · 0 评论