死牛胖子
在技术的路上渐行渐远
展开
-
Spring源码分析 | BeanFactoryPostProcessor的用法与源码分析
接口只提供了一个回调方法,通过该方法可以调整容器的属性。 还有一个子接口 ,该接口也提供了一个回调方法,通过该方法可以向容器注册 。 方法的回调时间在 方法之前,也就是说优先注册 。BeanFactoryPostProcessor 在容器启动过程中的执行时机Spring 应用通过 方法启动容器,在 中会对所有的 执行回调, 的执行时间是在完成 加载之后,执行 实例化之前。所以在 中可以修改容器属性,可以注册 ,但最好不要手动做 Bean 实例化,不然可能导致不可预知的错误。如何注册 B原创 2022-06-20 21:30:40 · 295 阅读 · 0 评论 -
Spring源码分析 | FactoryBean的使用及实现原理
Spring是目前使用最广泛的J2EE框架,主要包括IOC及AOP两部分功能,IOC即依赖注入,原创 2022-06-21 16:34:19 · 168 阅读 · 0 评论 -
Spring源码分析 | 设置自定义PropertyEditor
自定义一个对象,为 address 属性通过 注解设置一个默认值,该值是一个字符串,而属性类型是一个对象,正常来说肯定会报错,通过自定义 进行类型转换才可以正常注入。编码自定义 PropertyEditor创建类型转换器 类继承自 类,并重写 方法。自定义 PropertyEditorRegistrar创建类型转换器登记器 ,实现接口 ,在 方法实现对 类型转换器的注册。注册 CustomEditorConfigurer 是一个 ,在 Spring 启动时,会回调 方法实现对原创 2022-06-08 15:01:18 · 202 阅读 · 0 评论 -
Spring源码学习 | Environment环境
什么是多环境?任何一个应用级框架都会存在多环境问题,何谓多环境?正常来说,我们在项目开发过程中会经历开发环境、测试环境、灰度环境、生产环境等,以数据库配置为例,不同环境的数据库连接配置是不一样的,程序启动时需要根据当前环境获取相应的配置,这就是多环境,同一个资源,在不同的环境下拥有不同的版本,需要程序根据当前环境获取到相应的版本资源。@Profile 的用法@Profile 注解可以声明当前 Bean 的适用环境,为一个接口的两个实现分别声明不同的 Profile。public class Conf原创 2021-12-09 17:30:25 · 359 阅读 · 0 评论 -
Spring源码学习 | ResourceLoader资源加载
Spring 将所有的资源统一成了 Resource,不同的资源对应 Resource 的一个实现类,众多的实现类共同组成 Resource 家族,需要加载什么资源,只需要实现 Resource 接口,就可以成为 Resource 家族的一员,统一使用 Resource 接口进行资源加载。但是,在使用时,需要使用者清楚知道不同的资源对应哪一个实现类,以及实现类该如何构建、如何使用,说到底就还是面向实现编程而不是面向接口编程。为了进一步简化资源加载过程,Spring 又封装了 ResourceLoader原创 2022-05-28 11:57:23 · 311 阅读 · 0 评论 -
Spring源码学习 | PropertySource配置源
所有的应用都存在配置,比较常见就是以配置文件的形式出现,比如:SpringBoot 应用中的 application.properties 或者 application.yaml。配置有一个明显的特点就是键值对,配置并不局限于配置文件,只要是键值对形式的都可以作为配置使用,比如:启动命令中可以通过 -D 携带配置,甚至内存中的 Map 也可以作为配置。每一个出现配置的地方,可以认为是一个配置源,一个应用中可以出现多个配置源。不同配置源中的配置可能存在重复的现象,所以多个配置源之间需要有一个优先级。索引原创 2021-12-05 17:10:12 · 397 阅读 · 0 评论 -
Spring源码学习 | Resource资源
目录什么是资源?Resource - 对资源的封装ClassPathResourceFileSystemResourceUrlResourceByteArrayResourceInputStreamResource总结什么是资源?所有的数据都是资源,一个文件、URL、流甚至一个字节数组都可以当作资源,资源需要加载到内存才可以使用,不同的资源加载的方式各不一样。比如:加载本地文件可以使用 JDK 提供的 File 或者 Path 进行加载,加载项目内文件使用 Class.getResourceAsStre原创 2021-11-02 21:02:02 · 152 阅读 · 0 评论 -
SpringBoot整合MybatisPlus实现自定义类型处理
数据持久层框架最核心的功能,就是将数据库中的表与 Java 的对象形成映射,可以以 Java 对象的形式向查询语句传递入参,也可以将查询结果转换为 Java 对象,但是 Java 中的数据类型与数据库中的数据类型并不是一一对应的,这中间就需要进行一次类型处理。Mybatis 提供了 TypeHandler 接口用于字段类型处理,也许有人会说平常使用 Mybatis 也没有用到 TypeHandler,一样可以正常运行啊。这是因为我们平常使用的都是一些常用数据类型,比如:String、Integer、Lon原创 2022-04-03 12:19:50 · 1341 阅读 · 0 评论 -
Spring 报 NoUniqueBeanDefinitionException 异常如何处理
目录@Qualifier 指定 Bean 的名称@Primary 声明主次@Bean 属性 autowireCandidate 声明不依赖注入当 IOC 容器中某种类型的 Bean 存在多个的时候,程序启动时就会报 NoUniqueBeanDefinitionException 异常。创建一个接口 A,A 有两个实现类 A1 及 A2,创建 B,该类拥有一个类型为 A 的属性。public class AutowireBean { public static interface A {原创 2021-08-24 15:34:34 · 628 阅读 · 0 评论 -
SpringBoot 配置线程池
Spring通过任务执行器TaskExecutor来实现多线程和并发编程,使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。而实际开发中,多线程一般都是使用异步编程,所以我们需要在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。>一、编写任务执行方法,并通过@Asy原创 2017-02-23 14:51:01 · 1149 阅读 · 0 评论 -
SpringBoot 整合 Jasypt 实现配置文件敏感信息加密
SpringBoot整合Jasypt,实现对配置文件加密,防止数据库密码等敏感信息泄漏,增加配置文件的安全性原创 2021-07-28 10:23:30 · 273 阅读 · 0 评论 -
SpringBoot 整合 Actuator 实现服务监控
目录开始整合添加依赖验证端点介绍开启端点暴露端点SpringBoot 提供了 actuator 获取程序实时运行数据,实时监控应用运行情况,开发人员可以使用 HTTP 或 JMX 通过访问执行器(actuator)中的端点(EndPints)来管理监控应用,包括应用程序的健康状态、应用信息和内存使用状况等。开始整合添加依赖<dependency> <groupId>org.springframework.boot</groupId> <art原创 2021-07-27 17:38:38 · 266 阅读 · 0 评论 -
SpringBoot 整合 P6spy 分析打印 SQL 语句
目录开始整合添加依赖修改数据库配置配置编写自定义日志打印类spy.properties 配置详细说明开始整合添加依赖<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.9.1</version></dependency>修改数据库配置Mysql 的配置如下:sprin原创 2021-07-26 22:43:22 · 385 阅读 · 0 评论 -
SpringBoot 日期格式输入输出
目录常用的日期类型准备工作使用 `@JsonFormat` 声明日期格式全局声明常用的日期类型java.util.Calendarjava.util.Datejava.sql.Timestampjava.time.LocalDateTimejava.time.LocalDate其中,LocalDateTime、LocalDate 是 JDK1.8 提供的日期处理类,提供了非常方便的日期计算方法,在做日期格式化时不再使用 SimpleDateFormat,避免了线程同步问题。总之,Local原创 2021-05-19 15:26:19 · 403 阅读 · 0 评论 -
SpringBoot 整合 RabbitMQ 实现延迟队列
相关知识什么是延迟队列队列中的消息在等待指定时间后,消费者才能够进行消费。应用场景商城系统,下单后半个小时未付款,自动取消订单实现方式RabbitMQ 本身没有直接支持延迟队列功能,但是通过控制消息的生存时间及死信队列,可以模拟出延迟队列的效果。RabbitMQ 控制消息的生存时间有两种方法:设置队列属性(x-message-ttl),队列中所有消息都有相同的过期时间设置消...原创 2020-01-09 20:12:26 · 821 阅读 · 0 评论 -
SpringBoot 整合 RabbitMQ 实现死信队列
相关知识什么是死信队列“死信”是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况:消息被否定确认,使用 channel.basicNack 或 channel.basicReject ,并且此时requeue 属性被设置为false。消息在队列的存活时间超过设置的TTL时间。消息队列的消息数量已经超过最大队列长度。那么该消息将成为“死信”,“死信”消...原创 2020-01-09 18:14:33 · 1667 阅读 · 0 评论 -
SpringBoot 整合 RabbitMQ
相关知识交换器direct:一对一fanout:一对多topic:一对多匹配目标整合 Spring boot 提供的 spring-boot-starter-amqp,实现消息发送、消息消费、确认准备工作安装RabbitMQ介绍使用 Docker 方式安装,Docker 安装可以参考 https://blog.csdn.net/gongm24/article/details/...原创 2020-01-09 18:12:24 · 705 阅读 · 0 评论 -
SpringBoot 配置 Filter 实现 JSON 出入参打印
本章目标学会在 SpringBoot 项目中配置 Filter,实现对请求出入参的日志打印。操作步骤添加依赖引入 Spring Boot Starter 父工程<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte...原创 2019-05-16 16:48:00 · 1727 阅读 · 0 评论 -
SpringBoot | 单元测试
SpringBoot整合Junit实现单元测试原创 2019-05-15 16:59:31 · 736 阅读 · 1 评论 -
SpringBoot 整合 MapStruct 优雅复制属性
在之前章节的例子中,我们在接收参数的时候都是使用的 User 类对象,这是一个 DO 对象,是用于与数据库进行交互的,而不是用于与前端业务进行交互的,所以需要创建一个 BO 业务对象用来与前端业务进行交互,保证数据隔离性及安全性。接收参数换成了 BO 对象,但数据入库使用的是 DO 对象,这中间就需要将 BO 对象的属性复制到 DO 对象,然后代码里就会出现大量的 do.set(bo.get()...原创 2019-11-29 16:26:13 · 1072 阅读 · 1 评论 -
SpringBoot 整合 Swagger2 自动生成API文档
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。相关知识Swagger官网:https://swagger.io常用注解:@Api 用于类,表示标识这个类是swagger的资源@ApiOperation 用于方法,表示一个http请求的操作@ApiParam 用于方法,参数,字段说明,表示对参数的添加元数据(说明或是否必填等...原创 2019-12-11 15:07:27 · 181 阅读 · 0 评论 -
SpringBoot 整合 Druid 实现应用监控
`Druid` 是 `Java` 语言中最好的数据库连接池。`Druid` 能够提供强大的监控和扩展功能。wiki:<https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98>原创 2018-04-09 20:45:32 · 1605 阅读 · 0 评论 -
SpringBoot 整合 SpringCache 缓存
@CacheConfig 在类上设置当前缓存的一些公共设置,比如缓存名称。@Cacheable 作用在方法上,表明该方法的结果可以缓存,如果缓存存在,则目标方法不会被调用,直接从缓存中获取,如果缓存不存在,则执行方法体,并将结果存入缓存。@CacheEvice 作用在方法上,删除缓存项或者清空缓存。@CachePut 作用在方法上,不管缓存是否存在,都会执行方法体,并将结果存入缓存。@Caching 作用在方法上,以上的注解如果需要同时注解多个,可以包在 @Caching 内原创 2018-01-03 02:51:43 · 666 阅读 · 0 评论 -
SpringBoot整合MybatisPlus支持枚举类型
SpringBoot 集成 MybatisPlus 系列SpringBoot 版本:2.6.4MybatisPlus 版本:3.5.1SpringBoot整合MybatisPlusSpringBoot整合MybatisPlus数据自动填充SpringBoot整合MybatisPlus实现逻辑删除SpringBoot整合MybatisPlus实现分页查询SpringBoot整合MybatisPlus支持枚举类型未完待续…在实际的项目开发中,通常会使用一些枚举,比如:是否、有无,这样原创 2022-03-12 11:24:58 · 2400 阅读 · 0 评论 -
SpringBoot整合MybatisPlus实现分页查询
SpringBoot 集成 MybatisPlus 系列SpringBoot 版本:2.6.4MybatisPlus 版本:3.5.1SpringBoot整合MybatisPlusSpringBoot整合MybatisPlus数据自动填充SpringBoot整合MybatisPlus实现逻辑删除SpringBoot整合MybatisPlus实现分页查询SpringBoot整合MybatisPlus支持枚举类型未完待续…分页查询是持久化框架的基础功能,Mybatis 本身也提供了分原创 2022-03-12 11:15:15 · 4060 阅读 · 0 评论 -
SpringBoot整合MybatisPlus数据自动填充
SpringBoot 集成 MybatisPlus 系列SpringBoot 版本:2.6.4MybatisPlus 版本:3.5.1SpringBoot整合MybatisPlusSpringBoot整合MybatisPlus数据自动填充SpringBoot整合MybatisPlus实现逻辑删除SpringBoot整合MybatisPlus实现分页查询SpringBoot整合MybatisPlus支持枚举类型未完待续…在真实的项目里,表结构中一般会存在一些公司内部约定的公共字段,原创 2022-03-12 11:10:31 · 1331 阅读 · 0 评论 -
SpringBoot整合MybatisPlus实现逻辑删除
SpringBoot 集成 MybatisPlus 系列SpringBoot 版本:2.6.4MybatisPlus 版本:3.5.1SpringBoot整合MybatisPlusSpringBoot整合MybatisPlus数据自动填充SpringBoot整合MybatisPlus实现逻辑删除SpringBoot整合MybatisPlus实现分页查询SpringBoot整合MybatisPlus支持枚举类型未完待续…向数据库删除一条记录通常会使用 DELETE 语句,其实在真实原创 2021-07-28 16:32:07 · 1335 阅读 · 0 评论 -
SpringBoot整合MybatisPlus
SpringBoot 集成 MybatisPlus 系列SpringBoot 版本:2.6.4MybatisPlus 版本:3.5.1SpringBoot整合MybatisPlusSpringBoot整合MybatisPlus数据自动填充SpringBoot整合MybatisPlus实现逻辑删除SpringBoot整合MybatisPlus实现分页查询SpringBoot整合MybatisPlus支持枚举类型未完待续…MybatisPlus 简介官网地址:https://ba原创 2019-12-13 14:53:23 · 584 阅读 · 0 评论 -
SpringBoot 整合 Mybatis
准备工作安装 Mysql初始化数据库整合 Mybatis添加依赖配置编码实现原创 2018-10-19 17:32:55 · 277 阅读 · 0 评论 -
SpringBoot 整合 JPA 实现增删查改功能
准备工作安装 Mysql初始化数据库整合 JPA添加依赖配置编码实现原创 2019-05-15 15:53:02 · 560 阅读 · 1 评论 -
SpringBoot 整合 ElasticJob
ElasticJob 是当当网开源的一个分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。Elastic-Job-Lite 定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务;Elastic-Job-Cloud 采用自研 Mesos Framework 的解决方案,额外提供资源治理、应用分发以及进程隔离等功能。原创 2020-04-13 16:12:14 · 216 阅读 · 0 评论 -
SpringBoot 配置 AOP 记录操作日志
相关知识AOP 即面对切面编程,是 Spring 框架的两大核心特性之一。相关概念切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式或者基于@Aspect注解的方式来实现。连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的...原创 2019-12-31 14:31:49 · 302 阅读 · 1 评论 -
SpringBoot 整合 hibernate-validator 优雅表单校验
spring-boot-starter-web 项目中默认已经集成了 hibernate-validator相关知识@AssertTrue // 用于 boolean 字段,该字段只能为 true@AssertFalse // 用于 boolean 字段,该字段只能为 false@DecimalMax // 用于 Number 字段,只能小于或等于该值@Decim...原创 2019-11-25 17:03:14 · 413 阅读 · 0 评论 -
SpringBoot | 整合Lombok,让项目更简洁
整合Lombok原创 2018-01-03 01:33:59 · 417 阅读 · 1 评论 -
SpringBoot 配置定时任务
定时任务的几种实现方式:Timer:Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。Quartz:使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。Spring Task:...原创 2020-03-27 11:43:29 · 174 阅读 · 0 评论 -
SpringBoot 基于 Redis 实现分布式锁
基于spring-boot-data-redis的分布式锁实现public class DistributedLock { private static final TimeUnit DEFAULT_UNIT = TimeUnit.SECONDS; private static final long DEFAULT_EXPIRE = 5L; private static...原创 2019-03-14 23:35:19 · 1168 阅读 · 0 评论 -
SpringBoot 整合 Redis
相关知识Redis 简介Redis 是一个开源的,基于内存中的,高性能的数据存储系统,它可以用作数据库、缓存和消息中间件。Redis 支持多种类型的数据结构,如:string、hashes、lists、sets、sortedSets等。Redis 内置了复制(replication)、LUA脚本(Lua scripting)、事务(transactions)、磁盘持久化(persisten...原创 2020-01-11 09:05:36 · 331 阅读 · 0 评论 -
SpringBoot 整合邮件发送
Spring boot 本身提供了 spring-boot-starter-mail 的 starter,用于集成邮件发送功能原创 2020-01-05 15:32:10 · 501 阅读 · 0 评论 -
SpringBoot 配置全局异常处理实现统一输出格式
后端应用统一输出格式在实际生产中是非常有必要的,统一了输出格式,前端或者其它数据接收端才好做统一的处理,比如,前端在接收到后端处理异常时,可以在框架层面进行错误信息提示,只有当处理成功时,才执行当前页面逻辑,这样可以省去很多不必要的编码。什么叫统一输出格式?首先是业务正常处理时的返回格式,对 `SpringBoot` 来说就是 `Controller` 中接口的返回格式,其次是业务处理异常时的返回格式,当业务处理过程中,出现运行时异常,`SpringBoot` 提供了一个默认的格式进行输出。统一输出格式原创 2019-11-25 17:11:48 · 395 阅读 · 0 评论 -
SpringBoot 配置 Interceptor 拦截器
第四章:SpringBoot配置拦截器关于拦截器的相关知识可参考:https://jinnianshilongnian.iteye.com/blog/1670856本章目标学会在 SpringBoot 的项目中怎么配置拦截器操作步骤添加依赖引入 Spring Boot Starter 父工程<parent> <groupId>org.springfra...原创 2019-05-15 17:01:33 · 355 阅读 · 0 评论