【WEB系列】自定义请求匹配条件RequestCondition

在spring mvc中,我们知道用户发起的请求可以通过url匹配到我们通过@RequestMapping定义的服务端点上;不知道有几个问题大家是否有过思考

一个项目中,能否存在完全相同的url?

有了解http协议的同学可能很快就能给出答案,当然可以,url相同,请求方法不同即可;那么能否出现url相同且请求方法l也相同的呢?

本文将介绍一下如何使用RequestCondition结合RequestMappingHandlerMapping,来实现url匹配规则的扩展,从而支持上面提出的case

查看更多

分享到

【DB系列】JPA 错误姿势之环境配置问题

又回到jpa的教程上了,这一篇源于某个简单的项目需要读写db,本想着直接使用jpa会比较简单,然而悲催的是实际开发过程中,发现了不少的坑;本文为错误姿势第一篇,Repository接口无法注入问题

查看更多

分享到

【基础系列】自动配置选择生效

写了这么久的Spring系列博文,发现了一个问题,之前所有的文章都是围绕的让一个东西生效;那么有没有反其道而行之的呢?

我们知道可以通过@ConditionOnXxx来决定一个配置类是否可以加载,那么假设有这么个应用场景

  • 有一个Print的抽象接口,有多个实现,如输出到控制台的ConsolePrint, 输出到文件的 FilePrint, 输出到db的 DbPrint
  • 我们在实际使用的时候,根据用户的选择,使用其中的一个具体实现

针对上面的case,当然也可以使用@ConditionOnExpression来实现,除此之外推荐一种更优雅的选择注入方式ImportSelector

查看更多

分享到

【基础系列】从0到1实现一个自定义Bean注册器(应用篇)

我们知道在spring中可以通过@Component@Service, @Repository 装饰一个类,通过自动扫描注册为bean;也可以通过在配置类中,借助@Bean来注册bean;那么除了这几种方式之外,还有什么其他的方式来声明一个类为bean么?

我们是否可以自定义一个注解,然后将这个注解装饰的类主动声明为bean注册到spring容器,从而实现类似@Component的效果呢?

接下来本文将介绍,如果通过ImportBeanDefinitionRegistrar结合自定义注解来实现bean注册,主要用到的知识点如下:

  • ImportBeanDefinitionRegistrar bean注册的核心类
  • @Import 导入配置
  • ClassPathBeanDefinitionScanner

查看更多

分享到

【DB系列】SpringBoot+Mysql 无法保存emoj表情

尤记得很久以前,想存emoj表情到mysql中,需要额外的将emoj表情转码之后保存,每次读取时,再解码还原成一下;每次这种sb的操作,真心感觉心塞,那么有没有办法直接存呢?

mysql本身可以通过选择编码集(如utfbmb4)来支持emoj表情,然而今天遇到了一个相当鬼畜的问题,表中可以直接写入emoj表情,但是通过spring boot代码塞入的emoj时,却抛出异常:

1
2
3
4
5
6
7
8
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x9D\xE6\xB1...' for column 'nick' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1084) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838) ~[mysql-connector-java-5.1.30.jar:na]
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082) ~[mysql-connector-java-5.1.30.jar:na]

接下来演示一下正确的使用姿势,以及导致上面问题的错误case,避免大家重复采坑

查看更多

分享到

【WEB系列】Listener四种注册姿势

javaw web三要素Filter, Servlet前面分别进行了介绍,接下来我们看一下Listener的相关知识点,本篇博文主要内容为SpringBoot环境下,如何自定义Listener并注册到spring容器

查看更多

分享到

【WEB系列】Servlet 注册的四种姿势

前面介绍了java web三要素中filter的使用指南与常见的易错事项,接下来我们来看一下Servlet的使用姿势,本篇主要带来在SpringBoot环境下,注册自定义的Servelt的四种姿势

  • @WebServlet 注解
  • ServletRegistrationBean bean定义
  • ServletContext 动态添加
  • 普通的spring bean模式

查看更多

分享到

【WEB系列】开启GZIP数据压缩

本篇可以归纳在性能调优篇,虽然内容非常简单,但效果可能出乎预料的好;

分享一个真实案例,我们的服务部署在海外,国内访问时访问服务时,响应有点夸张;某些返回数据比较大的接口,耗时在600ms+上,然而我们的服务rt却是在20ms以下,绝大部分的开销都花在了网络传输上

针对这样的场景,除了买云服务商的网络通道之外,另外一个直观的想法就是减少数据包的大小,直接在nginx层配置gzip压缩是一个方案,本文主要介绍下,SpringBoot如何开启gzip压缩

查看更多

分享到

【DB系列】JPA之指定id保存

前几天有位小伙伴问了一个很有意思的问题,使用JPA保存数据时,即便我指定了主键id,但是新插入的数据主键却是mysql自增的id;那么是什么原因导致的呢?又可以如何解决呢?

本文将介绍一下如何使用JPA的AUTO保存策略来指定数据库主键id

查看更多

分享到

【基础系列】指定Bean初始化顺序的若干姿势

上一篇博文介绍了@Order注解的常见错误理解,它并不能指定bean的加载顺序,那么问题来了,如果我需要指定bean的加载顺序,那应该怎么办呢?

本文将介绍几种可行的方式来控制bean之间的加载顺序

  • 构造方法依赖
  • @DependOn 注解
  • BeanPostProcessor 扩展

查看更多

分享到

【配置系列】Bean加载顺序之错误使用姿势辟谣

在网上查询Bean的加载顺序时,看到了大量的文章中使用@Order注解的方式来控制bean的加载顺序,不知道写这些的博文的同学自己有没有实际的验证过,本文希望通过指出这些错误的使用姿势,让观文的小伙伴可以知道@Order的具体的应用场景

查看更多

分享到

【WEB系列】过滤器Filter使用指南扩展篇

前面一篇博文介绍了在SpringBoot中使用Filter的两种使用方式,这里介绍另外一种直接将Filter当做Spring的Bean来使用的方式,并且在这种使用方式下,Filter的优先级可以直接通过@Order注解来指定;最后将从源码的角度分析一下两种不同的使用方式下,为什么@Order注解一个生效,一个不生效

本篇博文强烈推荐与上一篇关联阅读,可以get到更多的知识点: 191016-SpringBoot系列教程web篇之过滤器Filter使用指南

查看更多

分享到