- 博客(53)
- 资源 (1)
- 收藏
- 关注
原创 SpringAI+TanStack AI实现AI Agent
TanStack AI是TanStack团队推出的AI应用开发框架,是它的React绑定。它与后端通信的标准线协议是AG-UI(Agent-User Interaction Protocol),一个事件驱动的流式协议:一轮对话(run)由一组带类型的JSON事件描述,默认通过SSE传输。data:{"type":"TEXT_MESSAGE_CONTENT","messageId":"...","delta":"你"}
2026-11-07 09:37:58
220
原创 轻量、快速、零依赖的 Windows 文本与代码编辑器
ETON是一款轻量、快速、零依赖的Windows文本与代码编辑器,基于Win32 API与Scintilla内核,安装包仅2MB,双击即用。支持多标签、会话自动恢复、亮/暗主题切换,内置Markdown预览(含LaTeX与Mermaid图表)、JSON格式化/压缩、语法高亮(10种语言)及草稿自动保存。无广告、不联网、免费使用,专注高效写作与开发。
2026-09-15 16:30:54
181
原创 SpringAI+DeepSeek+HTMX实现AI Agent
htmx是一个通过HTML属性完成ajax请求和局部HTML交换的轻量库,htmx 4基于fetch重写,自带的sse扩展可以直接消费普通请求返回的响应,把每条SSE消息当作一次局部HTML交换,这个特性正好契合大模型的流式输出。Alpine.js是一个声明式的轻量前端库,负责输入框、按钮状态这类纯客户端的交互逻辑。整个项目的职责划分非常清晰:htmx负责数据通道,Alpine.js负责客户端状态,Thymeleaf负责HTML片段渲染,Spring AI负责模型调用与会话记忆,四个关注点互不耦合。
2026-09-11 20:19:15
404
原创 30+ 个能直接跑的 Spring Boot 实战示例,代码+中文讲解配套
如果说上面那些模块解决的是”某个特性怎么用”,那Java 程序能不能像 Go 一样,编译成一个不需要 JRE、秒级启动、镜像超小的可执行文件?答案是能。这就是 GraalVM Native Image + Spring Boot 3 的 AOT(Ahead-of-Time,提前编译)技术。而这个模块,就是把这个听起来很玄的技术,做成了一个你 clone 下来就能编译、就能跑的最小示例。
2026-09-01 13:58:17
222
原创 Spring AI实现MCP Serve
MCP协议定义了server和client两种角色,server负责提供具体的能力,比如查询天气、操作数据库,client负责连接server并把工具暴露给大模型使用,常见的MCP客户端有Claude Desktop、Cursor等。协议底层基于JSON-RPC,对传输方式做了抽象,常用的有STDIO和SSE两种,本示例基于webmvc使用SSE传输,server启动后通过端点接入。
2026-08-29 13:59:23
331
原创 Spring Authorization Server统一认证集成微信登录和微信小程序
无法重定向:授权码流程要求客户端引导用户浏览器跳转到授权服务器,而小程序运行在微信的容器里,没有标准的浏览器环境(web-view内嵌页面体验差且限制多)。无法保密:小程序代码包随安装分发,可以被反编译,任何写死在代码里的 secret 都会泄露,所以小程序只能作为公开客户端(public client)。微信登录不等于接口防护wx.login()只解决"微信身份"问题,自己的后端接口的访问控制、令牌生命周期管理、多端统一认证,仍然需要一套标准的 OAuth2 令牌体系。本文的方案是:用微信官方的。
2026-08-23 11:25:17
345
原创 Spring AI集成DeepSeek大模型
本文介绍了如何使用Spring AI框架集成DeepSeek大模型,实现多种AI功能。主要内容包括: Spring AI通过统一接口封装大模型调用,简化开发流程 项目配置只需引入starter和设置API key 实现了四种核心功能: 基础同步对话 流式响应(SSE) 推理模型的思维链输出 Function Calling(工具调用) 特别展示了如何通过@Tool注解实现模型自主调用Java方法 提供了完整的示例项目代码参考 该方案使开发者能够快速集成DeepSeek模型,同时保持代码简洁和可维护性。
2026-08-01 21:49:17
257
原创 通过Spring Authorization Server对vue应用进行授权防护
vue对接oauth进行认证防护的介绍已经很多了,但是跟Spring Authrization Server集成的示例比较少,并且很多还都是vue2的代码,本文主要是介绍vue3跟Spring Authrization Server集成的方法和示例。
2025-12-31 15:03:18
1183
原创 SpringSecurity高级用法
在项目实际开发过程中,SpringSecurity默认的认证和权限校验逻辑不能实现很高的业务复杂度,这种情况下我们需要自定义这些逻辑,包括自定义loginUrl携带参数,自定义认证校验逻辑,自定义权限校验逻辑。SpringSecurity在跳转login页面时,虽然可以指定login的url,但是无法让url中携带动态参数,不如跳转到login?
2025-02-09 11:09:39
1295
原创 Spring统一修改Controller的RequestBody
在spring中可以使用RequestBodyAdviceAdapter修改RestController的请求参数。以下代码为自定义 ModifyBodyAdvice 实现 RequestBodyAdviceAdapter@Autowired@Override@NonNull) {if (field!
2025-02-09 11:07:31
524
原创 Spring RestTemplate配置DNS解析超时
在spring中使用RestTemplate调用远程接口时往往需要设置超时时间,否则当对方接口过慢时,很容易把自己系统堵死。连接超时、发送请求超时、接收响应超时都有直接的方法可以进行调用设置,设置DNS解析超时需要通过相对复杂的方法进行处理。首先RestTemplate配置使用apache httpclient进行http接口调用,apache httpclient内部通过默认的DnsResolver进行DNS解析,我们可以通过自己实现DnsResolver方法来设置DNS解析超时时间。
2024-06-16 18:51:53
1153
2
原创 spring动态控制定时任务
在spring框架中,对于简单的定时任务,可以使用 @Scheduled 注解实现,在实际项目中,经常需要动态的控制定时任务,比如通过接口增加、启动、停止、删除定时任务,动态的改变定时任务的执行时间等。
2024-01-07 21:39:57
2284
3
原创 Spring Data 动态查询的三种方式
SpringDataJpa提供了三种灵活查询的方式,分别是:1、通过@Query注解编写查询语句;2、Example查询;3、Specification查询。下面分别介绍这三种方式的使用方法。
2023-12-27 22:27:07
976
原创 Spring Boot 3.2 新特性之 HTTP Interface
HTTP Interface 是一个类似于 openfeign 的同步接口调用方法,采用 Java interfaces 声明远程接口调用的方法,理念上类似于SpringDataRepository,可以很大程度精简代码。要使远程调用的接口可以执行,还需要通过 HttpServiceProxyFactory 指定底层的http接口调用库,支持 RestTemplate、WebClient、RestClient三种。
2023-12-24 17:22:42
3817
原创 Spring Boot 3.2 新特性之 RestClient
RestClient 是一个类似于 RestTemplate 的的同步接口调用工具。相比于 RestTemplate 采用的是 template 设计模式,RestClient 采用了 fluent API 风格,简单灵活,易于阅读和维护。
2023-12-03 22:18:23
7060
原创 Spring Boot 3.2 新特性之 JdbcClient
JdbcClient是一个轻量的数据库操作框架,采用 fluent API 风格,简单灵活,易于阅读和维护,支持编写复杂的SQL。通过上述的示例,可以看到基本的数据库操作都可以用 JdbcClient 实现,避免了复杂的ORM框架的使用,切操作要比ORM框架简单灵活的多。fluent API 的风格也更容易编写和阅读。
2023-11-26 17:43:17
2716
原创 Spring Data Envers 支持有条件变动纪录的保存和查询
可以通过 spring-data-envers 很容易的实现变动纪录的保存和查询,只需要增加几个注解就可以。但是要实现有条件的变动纪录的保存和查询就需要进行一些复杂的处理。每个监听事件都对应着特定的 Listener ,在本文实例中,我们期望当 author 的值被更新为空时,不保存变动纪录,我们可以通过自定义 PRE_UPDATE 和 POST_UPDATE 的Listener来实现。
2023-10-15 12:23:55
1058
原创 Spring RestTempate 打印请求和响应内容日志
RestTemplate使用前需要先定义bean,在定义bean时可以通过指定来打印日志。RestTemplate的bean的定义在RestTemplateConfig类中实现。其中方法用来指定我们自己实现的日志打印 interceptors。
2023-05-03 17:58:39
7264
1
原创 Spring Boot集成简易规则引擎 easy-rules
通过将业务规则配置的配置文件中,可以精简代码,同时已于维护,当规则修改时,只需要修改配置文件即可。easy-rules是一个小巧的规则引擎,支持spring的SPEL表达式,同时还支持 Apache JEXL 表达式和 MVL 表达式。
2023-03-26 13:06:55
6497
原创 Spring Boot 3的AOT(GraalVM Native Image)应用开发
Spring Boot 3的AOT(GraalVM Native Image)应用开发
2022-11-26 21:58:01
9251
原创 ElasticSearch新版JavaClient使用简介
ElasticSearch在7.17版本之前使用的java客户端是Java REST Client,但是从7.17版本开始,官方将Java REST Client标记为弃用(deprecated),推荐使用新版Java Client。本文介绍新版ElasticSearch Java Client的基本用法。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/elasticsearch-javaclient一、概述Elasti
2022-04-17 19:34:44
16029
2
原创 spring-rest接口LocalDateTime转时间戳
本文介绍spring-rest接口中的LocalDateTime日期类型转时间戳的方法。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-localdatetime-epoch一、概述java程序中一般将日期类型定义为LocalDateTime,数据库中保存的时间是0时区的时间(UTC时间)。对于接口来说,为了支持全球化多时区,接口中的日期类型通常会返回UTC时间戳,简称Epoch,数据类型为long,前端程序
2022-04-04 19:07:51
1631
原创 spring缓存自定义resolver
本文介绍spring中自定义缓存resolver,通过自定义resolver,可以在spring的cache注解中增加附加处理。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-redis-resolver一、概述cache-aside模式是常用的缓存使用模式。使用流程如下图:[外链图片转存失败,源站可能有当更新数据库中的数据后,对缓存做失效处理,后续就能读取到数据库中最新的数据,使得缓存数据与数据库数据保
2022-03-13 23:00:50
3086
原创 spring使用kafka的三种方式(listener、container、stream)
spring使用kafka的三种方式(listener、container、stream)@TOC本文介绍spring中使用Kafka的三种方式,其中container方式最灵活,但是开发相对较负责,stream方式使用最简便,listener方式由于提供的最早,使用的较普遍。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-kafka一、概述在实际项目中,用到kafka的场景非常普遍,特别是事件驱动的编程模
2021-10-31 17:15:42
10548
原创 springboot集成groovy脚本
在我们的应用中引入脚本能力,可以很好的提升灵活性,我们的核心开发工作可以集中在核心平台能力的开发上,具体场景的功能可以通过脚本来实现,例如jenkins就可以通过groovy脚本来编写pipeline,可以很灵活的定制构建过程。spring本身提供了groovy集成的机制,分为两种方式,一种是用groovy开发程序,跟用java开发类似,需要经过编译。一种是将groovy作为脚本来执行,不需要编译。在此我们介绍的是第二种方式,将groovy作为脚本来使用。具体的代码参照 示例项目 https://git
2021-05-05 19:28:52
2596
3
原创 springboot单元测试技术
整个软件交付过程中,单元测试阶段是一个能够最早发现问题,并且可以重复回归问题的阶段,在单元测试阶段做的测试越充分,软件质量就越能得到保证。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-unit-test一、概述一个功能的全链路测试,往往要依赖于很多外部组件,如数据库、redis、kafka、第三方接口等,单元测试的执行环境有可能受网络限制没有办法访问这些外部服务。因此,我们希望通过一些技术手段,能够用单元测
2021-04-18 18:24:12
1114
原创 spring ThreadPoolTaskExecutor使用不当导致的死锁问题
Spring自带线程池使用很方便,不过在相对复杂的并发编程场景中,使用时还是需要根据使用场景仔细考虑配置,否则可能会遇到本文中提及的坑。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-taskexecutor-block一、概述spring自带线程池有2个核心配置,一个是线程池的大小,一个是队列的大小。ThredPoolTaskExcutor的处理流程:新建线程并处理请求,直到线程数大小等于corePoo
2021-01-10 21:54:20
2987
原创 spring打印http接口请求和响应
在程序日志中打印出接口请求和响应的内容是一个基本的技术需求。如果在每个接口中实现请求响应的日志打印,程序编写会很繁琐,我们可以利用spring提供的机制,集中处理接口请求响应的日志打印。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-rest-log-request-response一、概述基于spring提供的机制,有3种方法可以实现接口请求响应日志的打印,分别是CommonsRequestLoggingF
2020-11-22 18:42:00
9098
1
原创 spring动态数据源
在实际的业务场景中,我们经常会遇到需要动态配置数据源的情况,只需要修改配置,就能增加新的数据源的接入,而不需要修改程序代码,通过动态数据源技术可以实现这个目标。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-dynamic-datasource一、概述通常在用springboot开发数据库应用时,我们会在配置文件中配置好数据源,程序中指定数据源进行数据库操作。当需要新增数据源时,就需要修改程序。通过动态数据源
2020-09-16 16:34:32
386
原创 java并发编程进阶
常用的java并发编程技术。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-currency一、概述传统的java并发能力依靠的是多线程,相比于现代的方法是Reactive编程,本文介绍多线程的实现,Reactive编程方法的介绍可参见Reactive编程。多线程并发编程有2个核心概念,原子性和可...
2020-04-25 23:54:40
437
翻译 软件定义交付宣言
原文 https://github.com/sdd-manifesto/manifesto交付是每个软件团队和组织的基础和战略能力,只有在交付时,代码才有它的价值,才能精准地塑造精彩的世界。交付是如此重要,现在是时候定义交付,并将其应用到开发工作中。宣言中表示交付工作本质上是独一无二的,应用程序、组织、部署环境和团队的每个组合都有自己的上下文,每个团队都需要理解这种独特的交付和自动化。持续交...
2018-11-25 13:16:36
841
翻译 Reactive编程(三):一个简单的HTTP服务
书接上文 Reactive编程 ,我们已经了解了基础的API,现在我们开始编写实际的应用。Reactive对并发编程进行了很好的抽象,也有很多底层的特性需要我们去关注。当使用这些特性时,我们可以对之前隐藏在容器、平台、框架中的细节进行控制。Spring MVC由阻塞转向ReactiveReactive要求我们以不同的思路来看待问题。区别于传统的request->response模...
2018-03-25 21:54:55
2397
翻译 Reactive编程(二):代码演示
书接上文 Reactive编程 ,我们继续用真实的代码来解释一些概念。我们会更进一步理解Reactive的与众不同以及它的功能。这些例子很抽象,但能够让我们更进一步理解用到的API和编程风格,真实的感受它的与众不同。我们将会看到Reactive的核心元素,学习如何控制数据流,如果需要的话还会用到后台线程进行处理。建立项目我们用Reactor库来进行演示。当然也可以用其它的工具。如果不想拷...
2018-03-18 23:42:18
2793
翻译 Reactive编程(一):Reactive编程的背景
Reactive编程很有趣,现在也有各种各样的讨论,概念上不是很容易理解。本文会以具体的形式介绍相关的概念。Reactive编程跟并发和高性能在概念上有一些重合,但在原理上完全不同。Reactive编程跟函数式编程是非常类似的。一些人认为Reactive编程并不是什么新概念,他们在日常工作中经常使用(例如javascript)。另一些人认为这是微软做出的新发明(Reactive这个名字最早来源于C...
2018-03-04 17:24:05
12528
原创 SpringBoot项目中使用AOP
1.概述将通用的逻辑用AOP技术实现可以极大的简化程序的编写,例如验签、鉴权等。Spring的声明式事务也是通过AOP技术实现的。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-aopSpring的AOP技术主要有4个核心概念:Pointcut: 切点,用于定义哪个方法会被拦截,例如 e...
2018-02-18 23:12:18
4277
原创 如何避免java程序内存泄漏
虽然jvm有垃圾回收机制,如果程序编写不注意某些特定规则,仍然会导致java程序内存泄漏,最终可能出现OutOfMemory异常。1.Java内存泄漏的原因java中的对象从使用上分为2种类型,被引用(referenced)的和不被引用(unreferenced)的。垃圾回收只会回收不被引用的对象。被引用的对象,即使已经不再使用了,也不会被回收。因此如果程序中有大量的被引用的无用对象时
2018-01-27 13:29:01
1400
原创 SpringBoot项目中使用redis缓存
1.概述在应用中有效的利用redis缓存可以很好的提升系统性能,特别是对于查询操作,可以有效的减少数据库压力。具体的代码参照该 示例项目2.添加引用在build.gradle加入compile('org.springframework.boot:spring-boot-starter-data-redis')SpringBoot会自动引入redis相关的jar包。加入该引用后,需要在本地安装redi
2017-12-03 20:32:57
7743
1
原创 SpringBoot项目中的多数据源支持
1.概述项目中经常会遇到一个应用需要访问多个数据源的情况,本文介绍在SpringBoot项目中利用SpringDataJpa技术如何支持多个数据库的数据源。具体的代码参照该 示例项目2.建立实体类(Entity)首先,我们创建两个简单的实体类,分别属于两个不同的数据源,用于演示多数据源数据的保存和查询。Test实体类:package com.example.demo.test.data;import
2017-10-20 11:08:36
18868
原创 用docker搭建elasticsearch集群
概述用docker进行elasticsearch的部署非常简单,如果要实现集群配置,需要进行一些特殊的处理,本文介绍如何利用docker进行elasticsearch集群的搭建。具体的配置可以参照该 示例主节点配置docker-compose.yml配置文件es: image: elasticsearch volumes: - ./es:/usr/share/elasticsearc
2017-09-08 11:28:19
7184
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅