spring boot
文章平均质量分 91
天涯泪小武
开源贡献者,有代码洁癖。京东coder。
展开
-
Java中使用etcd,包括基本的set、get、超时设置,watch监听等
etcd的使用文章。etcd来zookeeper类似,常用的主要有set,get,getPrefix:获取指定前缀的所有数据,grant:key的超时设置,watch:监听回调事件,watchPrefix:监听某个前缀的事件,keepAlive:为某个key设置自动续约、自动刷新过期时间。zk的大部分功能,etcd都有。但有一个,譬如虚拟节点,zk可以做到当客户端断开时,立马监听到,etc...原创 2019-12-12 16:32:15 · 9303 阅读 · 2 评论 -
Springboot2.0中Hibernate默认创建的mysql表为myisam引擎问题
升级到Springboot2.0后,依然是使用jpa、Hibernate来操作mysql,发现Hibernate默认创建的表是myisam引擎,而不是innodb。添加下面的方言即可修改为innodbspring: jpa: database: mysql show-sql: true hibernate: ddl-auto: update na...原创 2018-03-07 11:06:25 · 12064 阅读 · 4 评论 -
开发中大家如何对 JPA 或者 MyBatis 进行技术选型
原文地址:http://www.spring4all.com/question/112lexburner 3天前首先表达个人观点,JPA必然是首选的。个人认为仅仅讨论两者使用起来有何区别,何者更加方便,不足以真正的比较这两个框架。要评判出更加优秀的方案,我觉得可以从软件设计的角度来评判。个人对 mybatis 并不熟悉,但 JPA 规范和 springdata 的实现,设计理念绝对是超前的。软件开转载 2017-12-19 11:48:20 · 9481 阅读 · 8 评论 -
SpringBoot2.0 jpa多数据源配置
随着Springboot升级到2.0,原来1.5.x的Jpa多数据源配置不能用了。现在总结一下Springboot2.0的jpa多数据源配置连接池还是用druid,但是不能用druid的starter了,譬如在1.5.x时用的是<dependency> <groupId>com.alibaba</groupId> <artifa...原创 2017-12-26 18:15:34 · 33438 阅读 · 20 评论 -
springboot根据不同的条件创建bean,动态创建bean,@Conditional注解使用
这个需求应该也比较常见,在不同的条件下创建不同的bean,具体场景很多,能看到这篇的肯定懂我的意思。倘若不了解spring4.X新加入的@Conditional注解的话,要实现不同条件创建不同的bean还是比较麻烦的,可能需要硬编码一些东西做if判断。那么现在有个@Conditional注解后,事情就简单多了。用法很简单,直接上代码。新建一个springboot项目,添加一个Configurati原创 2017-10-11 11:17:39 · 60750 阅读 · 4 评论 -
Springboot中对jpa动态查询条件的封装
jpa对于固定参数的条件查询比较简单,可以在Repository中直接用参数名来查询。但是对于不固定的参数查询就比较麻烦了,官方提供的是继承JpaSpecificationExecutor,然后自己拼接Specification。这一篇主要是对Specification进行封装,让写法更友好. 代码参考:http://lee1177.iteye.com/blog/1994295。感觉还不够完整,回原创 2017-06-06 11:51:55 · 21778 阅读 · 12 评论 -
JPA(hibernate)一对多根据多的一方某属性进行过滤查询
我们经常会碰上某个字段是集合元素(List,Set)的情况,并且我们要过滤出集合中包含某个或某些元素的数据。 譬如一个类User /** * 检索人 */ private Long userId; /** * 省、直辖市集合 */ @ElementCollection @CollectionTable pr原创 2017-11-22 12:24:46 · 14769 阅读 · 1 评论 -
使用idea根据数据库表生成java model类,基于hibernate
很多场景下我们需要根据已有的数据库表,生成对应的java bean,而且还希望生成的java类格式正确、命名规范。使用idea可以轻松的完成这个功能。举例,我新建一个springboot项目,勾选mysql、jpa即可,在idea找到Database界面,新建Data source——MySQL,填写数据连接信息后即可。此时就可以生成简单的pojo类了,注意,此时还没有使用hibernate呢,就原创 2017-10-11 15:43:52 · 11625 阅读 · 1 评论 -
1 Springboot SpringCloud集成OAuth2入门详细教程
springboot集成OAuth客户端、服务端,springboot OAuth详细教程,springboot集成OAuth入门教程原创 2017-10-19 10:29:32 · 42617 阅读 · 18 评论 -
Springboot中Hibernate根据表名获取model类
需求是:知道表名,需要获取到该表对应的实体类。为毛有这么奇怪的需求呢,是这样的,在别的文件里,存放了数据表名,和一条数据的json串。我需要根据这些信息,将这条数据通过Hibernate插入到库里。我知道了json串,但不知道把它转成什么样的实体类,所以我需要表名对应的class信息。有了class,就可以使用json工具类将字符串转成对象了。就是这么个功能,方法很简单:@Bean pub...原创 2018-03-02 17:38:02 · 3772 阅读 · 1 评论 -
Springboot集成sqlite数据库,并使用jpa、Hibernate操作sqlite
之前举例使用jpa、Hibernate多是以mysql为例,这次因为需要使用一个内嵌式数据库,选择了sqlite,网上多是讲一些sqlite的api封装的框架。这里我们还是使用jpa、Hibernate来操作sqlite。新建一个Springboot项目,pom如下:<?xml version="1.0" encoding="UTF-8"?><project xmlns="ht...原创 2018-03-05 14:55:00 · 23992 阅读 · 2 评论 -
SpringBoot2集成redis,使用lettuce客户端
Springboot集成redis大家都会用,主要就是使用RedisTemplate类来进行各种操作。可能很多人并没有注意,在Springboot2以后,底层访问redis已经不再是jedis了,而是lettuce。至于jedis和lettuce有什么区别呢,对我们的使用有什么影响呢?jedis采用的是直连redis server,在多个线程之间共用一个jedis实例时,是线程不安全的。如...原创 2019-05-05 16:12:19 · 25024 阅读 · 9 评论 -
部署在docker里的java程序获取真实的用户ip地址
目前我们的服务都是全部docker化,网关zuul和各微服务都部署在docker里,构成了集群。用户请求全部到HaProxy,由HaProxy转发到zuul,再由zuul分发给各微服务。那么我们在做黑名单,或者对ip进行限流时,需要获取用户的真实ip。见代码:/** * 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了...原创 2019-07-04 17:34:35 · 13642 阅读 · 6 评论 -
InnoDB一棵B+树可以存放多少行数据?
转载自:https://mp.weixin.qq.com/s/xUJp62fFXC3_AJvAqQ0jZw一个问题?InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位...转载 2019-07-03 10:20:40 · 2705 阅读 · 1 评论 -
Springboot使用Sentinel限流,集成zookeeper完成规则的持久化
上一篇简单介绍了sentinel限流的基本配置和使用,这一篇我们来稍微深入一点,看看如何将zookeeper继承进来,用以保存添加的流控规则。上一篇中我们启动了dashboard.jar,然后在客户端中指定了dashboard的地址。之后启动项目,随便访问个接口,之后就能在dashboard的界面上看到相应的请求了,并且能在控制台上添加一些规则,保存后客户端就能生效了。基于内存的推...原创 2019-07-02 16:25:58 · 6791 阅读 · 7 评论 -
详解Jpa动态复杂条件查询,查询指定字段、并包括sum、count、avg等数学运算,包括groupBy分组
Jpa是我一直推荐在Springboot及微服务项目中使用的数据库框架,并由于官方的并不是十分友好和易用的api,导致很多人使用起来并不方便,下面就来展示一下我对api进行了封装后的代码。大大减轻了使用难度。效果展示首先我们直接来看最终的结果:譬如有个entity叫PtActivity,它有一个Repository。public interface PtActivityRepos...原创 2019-05-31 18:39:50 · 28168 阅读 · 18 评论 -
axios和Springboot项目交互时跨域处理
跨域本身是个很简单的问题,到处都能找到相关的后台配置教程。多数都是如下,定义个filter,再把filter注册一下就好了。public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest httpRequest, ServletResponse res, Fi...原创 2019-05-27 20:40:31 · 2025 阅读 · 0 评论 -
Springboot分别使用乐观锁和分布式锁(基于redisson)完成高并发防超卖
在电商中经常会有防超卖的需求,本质上是对一条数据的多线程并发情况下的数据安全性进行控制。譬如一个商品goods,库存是100,在多线程都去读取修改的情况下,会产生数据错乱。不加锁的情况我们来看一个简单的例子,有个goods表,里面有个int型字段amount。我们用多线程来频繁修改amount的值,看看结果。 @Transactional(rollbackFor = Except...原创 2019-05-10 15:11:17 · 17292 阅读 · 35 评论 -
SpringBoot 实现JPA的save方法不更新null属性
转载自:https://www.jianshu.com/p/4931fbc52ea1直接调用原生Save方法会导致null属性覆盖到数据库,使用起来十分不方便。本文提供便捷方法解决此问题。核心思路如果现在保存某User对象,首先根据主键查询这个User的最新对象,然后将此User对象的非空属性覆盖到最新对象。核心代码直接修改通用JpaRepository的实现类,然后在启动类标...转载 2019-05-07 18:23:33 · 10255 阅读 · 4 评论 -
Springboot集成sentinel实现接口限流入门
Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制单位时间内接口访问次数;或者按照某种规则进行限流,如限制ip的单位时间访问次数等。之前我们已经讲过接口限流的工具类ratelimter可以实现令牌桶的限流,很明显sentinel的功能更为全面和完善。来看一下sentinel的简介:https://...原创 2019-05-07 11:40:44 · 34449 阅读 · 15 评论 -
Jpa配置实体类创建时间更新时间自动赋值,@CreateDate,@LastModifiedDate
操作数据库映射实体类时,通常需要记录createTime和updateTime,如果每个对象新增或修改去都去手工操作创建时间、更新时间,会显得比较繁琐。Springboot jpa提供了自动填充这两个字段的功能,简单配置一下即可。@CreatedDate、@LastModifiedDate、@CreatedBy、@LastModifiedBy前两个注解就是起这个作用的,后两个是设置修改人和创建人的原创 2017-09-11 13:14:33 · 23936 阅读 · 2 评论 -
zuul网关Filter处理流程及异常处理
上一篇介绍了java网关Zuul的简单使用,进行请求路由转发和过滤器的基本操作。这一篇主要看一下它的过滤器Filter的工作流程及异常处理。首先看到Filter的四个方法,FilterType,filterOrder,shouldFilter,run。filterType代表过滤类型PRE: 该类型的filters在Request routing到源web-service之前执行。用来实现Auth原创 2017-09-08 14:25:30 · 50648 阅读 · 7 评论 -
独立使用zuul网关分发不同服务的请求、权限控制,非SpringCloud
网关api Gateway的重要性不言而喻,网关负责统一接收所有请求,然后根据不同的规则进行转发到不同的服务。使用网关能够统一的管理请求日志、进行权限控制、过滤等,这样就能避免在每个单体应用中做重复的工作。这一篇主要是讲zuul的独立使用,就是只作为一个独立的项目进行请求转发,而不关联SpringCloud的那一堆Eureka、Ribbon等,因为很多时候我们的项目并不都是基于springclou原创 2017-09-08 10:44:49 · 42594 阅读 · 37 评论 -
SpringBoot中logback日志保存到mongoDB
前面提到过logback输出日志的多种方式,这一篇看一下自定义Appender,将logback输出的日志保存到mongo中。自定义Appender非常简单,继承一下AppenderBase类即可。可以看到有个AppenderBase,有个UnsynchronizedAppenderBase,还有个AsyncAppenderBase继承了UnsynchronizedAppender原创 2017-06-16 15:47:47 · 8922 阅读 · 15 评论 -
Spring boot中使用aop详解
aop是spring的两大功能模块之一,功能非常强大,为解耦提供了非常优秀的解决方案。现在就以springboot中aop的使用来了解一下aop。一:使用aop来完成全局请求日志处理创建一个springboot的web项目,勾选aop,pom如下:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt原创 2017-04-27 17:38:12 · 22569 阅读 · 6 评论 -
SpringMVC参数校验,包括JavaBean和基本类型的校验
该示例项目使用SpringBoot,添加web和aop依赖。 SpringMVC最常用的校验是对一个javaBean的校验,默认使用hibernate-validator校验框架。而网上对校验单个参数,譬如String,int之类的资料极少,这一篇就是讲这个的。校验JavaBeanpackage com.example.bean;import org.hibernate.validator.con原创 2017-05-04 18:31:16 · 17428 阅读 · 10 评论 -
3 Springboot中使用redis,redis自动缓存异常处理
在上一篇中,提到了使用配置文件来定义连接信息,由于前面讲的都是框架自动使用redis缓存数据,那么如果出现了异常又该怎么处理?这里我们修改一下配置信息,让redis故意连接不上,看看异常信息。修改一下yml里port端口,然后再执行一下add或者query操作,看控制台报错信息。打开AbstractCacheInvoker类,看到里面有put,get,evict等方法,就是对应原创 2017-04-25 10:08:28 · 11723 阅读 · 1 评论 -
2 Springboot中使用redis,配置redis的key value生成策略
redis在springboot中的应用,springboot整合redis,redis存储集合原创 2017-04-24 14:20:06 · 39125 阅读 · 4 评论 -
1 Springboot中使用redis,自动缓存、更新、删除
springboot整合redis,如何用redis做分页查询,redis条件查询原创 2017-04-21 15:53:14 · 68327 阅读 · 15 评论 -
SpringMVC源码解析,看SpringMVC的工作流程
SpringMVC在使用过程中,大多是使用注解,对它的实现接口之类的关系理解变得模糊, 通过对XML配置的理解,可以理清各个类的关系,譬如控制器类要实现Controller接口。接触SpringMVC,对它的xml文件配置一直比较模模糊糊,最近花了一点时间稍微看了下源代码,再加上调试,开始逐渐理解它,网上的类似的内容有很多,写本文主要是自己加深一下理解。本文适合用过SpringMVC的开发转载 2017-05-03 10:44:53 · 2504 阅读 · 0 评论 -
1 SpringBoot 使用sharding jdbc进行分库分表
分库分表在数据量大的系统中比较常用,解决方案有Cobar,TDDL等,这次主要是拿当当网开源的Sharding-JDBC来做个小例子。 它的github地址为:https://github.com/dangdangdotcom/sharding-jdbc 简介: Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零: 可适用于任何基于ja原创 2017-04-19 17:17:39 · 66728 阅读 · 23 评论 -
Logback各Appender详解及配置
转载自:http://blog.csdn.net/doraemon_wu/article/details/51972261Logback将执行日志事件输出的组件称为Appender,实现的Appender必须继承 ch.qos.logback.core.Appender 接口接口如下:package ch.qos.logback.core;import ch转载 2017-06-16 12:07:43 · 49580 阅读 · 2 评论 -
springboot中使用logback
Springboot默认集成的就是logback,logback相对来说是优秀于log4j的,log4j2也是参考了logback的设计。本篇就是来看看如何使用logback。新建一个Springboot项目,勾选web就OK了,项目会自动集成logback。控制台日志写一个controller测试一下:import org.slf4j.Logger;import org.slf原创 2017-06-16 12:03:39 · 23774 阅读 · 1 评论 -
SpringBoot中Mongo查询条件是集合中的字段的处理
MongoRepositoryMongoRepository和普通的Repository一样,继承PagingAndSortingRepository,支持分页和普通的CRUD。之前已经提过Jpa的一些基本操作,下面讲几个 稍微特殊点的。List<Person> findByAddressZipCode(ZipCode zipCode);List<Person> findByEmailAddres原创 2017-06-15 13:24:21 · 11353 阅读 · 0 评论 -
SpringBoot拦截全局异常并发送邮件给指定邮箱
主要是看一下Springboot中发送邮件的方法,至于拦截Springboot全局异常之前的文章中有。一 发送邮件在Springboot中发送邮件非常简单。pom.xml引入maven依赖 org.springframework.boot spring-boot-starter-mail 在application.yml里设置发信人的账号、密码spring: mail:原创 2017-09-06 16:50:37 · 5991 阅读 · 5 评论 -
Springboot项目搭配ELK日志平台
Springboot整合ELK日志平台,logback日志输出到logstash原创 2017-08-03 15:46:19 · 8753 阅读 · 0 评论 -
Springboot项目使用aop切面保存详细日志到ELK日志平台
上一篇讲过了将Springboot项目中logback日志插入到ELK日志平台,它只是个示例。这一篇来看一下实际使用中,我们应该怎样通过aop切面,拦截所有请求日志插入到ELK日志系统。同时,由于往往我们有很多个服务,都需要记录日志,为每个服务都搭建一个ELK并不现实,所以我们采用集中化管理日志,将所有日志都插到同一个ELK中。这样又会遇到另一个问题,就是ES中的Index如果只有一个,那么所有日原创 2017-08-08 17:20:21 · 10488 阅读 · 3 评论 -
Springboot yml获取系统环境变量的值
注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取。我们经常使用一些docker管理平台,如DaoCloud、rancher之类的,里面都可以配置环境变量,目的当然也就是供程序获取。使用环境变量的话,可以避免在application.yml里直接明文编写数据库密码、appkey之类的。用法很简单譬如我...原创 2017-07-24 14:00:02 · 61012 阅读 · 8 评论 -
SpringBoot事务管理:声明式事务和编程式事务。将Service层的事务执行结果传递出去
在SpringBoot中使用事务很简单,这一篇不是为了讲事务,主要是讲一下一个工具类,将需要加入事务的Service层代码作为参数传递出去并返回事务的执行结果(成功和回滚)。声明式事务在SpringBoot中声明式事务最常见,就是把需要事务的方法用@Transactional标注一下就行了,这个一般用在Service层。标注后该方法就具备了事务的能力,出错了会自动回滚。在大部分场景下,原创 2017-06-12 16:50:45 · 26607 阅读 · 6 评论 -
Springboot使用定时任务,Spring Schedule
定时任务的实现方式有多种,例如JDK自带的Timer+TimerTask方式,spring 3.0以后的调度任务(Scheduled Task),Quartz等。Timer+TimerTask是最基本的解决方案,但是比较远古了,这里不再讨论。Spring自带的Scheduled Task是一个轻量级的定时任务调度器,支持固定时间(支持cron表达式)和固定时间间隔调度任务,支持线程池管转载 2017-06-23 14:53:41 · 6160 阅读 · 2 评论