MCP(模型上下文协议:Model Context Protocol)为 AI 应用与外部工具、资源的交互提供了标准化方式。Spring 早期就作为核心贡献者加入 MCP 生态,参与开发并维护官方 MCP Java SDK,为基于 Java 的 MCP 实现奠定基础。在此贡献之上,Spring AI 通过专属的 Boot Starter 与 MCP Java 注解全面支持 MCP,让构建可无缝对接外部系…
分类目录归档:Java
Spring AI 智能体 2 : Anthropic 智能体 Skill
Spring AI 新增了对 Anthropic 智能体 Skill 的支持 — 这类模块化能力可让 Claude 直接生成实际文件,而非单纯的文本描述。启用该 Skill 后,Claude 能生成可直接下载使用的 Excel 电子表格、PowerPoint 演示文稿、Word 文档和 PDF 文件。
局限性说明
Anthropic Skill 的实现方案仅适用于其自研的 Claude 系列模型,存在以下局…
基于生成式注解为类添加toString方法
在组内讨论时,有同事提建议在把对象写到日志中时最好直接输出对象不要做任何加工,也就是尽量调用对象自己的toString()方法,不要用JsonKit.toJson(obj)这样先把对象转为json字符串再输出的写法。
这个建议不是没有道理的,jackson和fastjson这些json工具将对象序列化为字符串时会有一个自动检查推测的过程,在这个过程中做了如下事…
使用Spring AOP实现注解式的分布式锁
这里简单说一个springboot生态下基于redis实现的分布式锁方案。预期实现的效果是在要加锁的方法上添加一个注解,然后就能根据请求参数得到并加上锁,方法执行完后,也会自动释放锁。这样在实现方法时,开发者就可以只关注业务逻辑,不用考虑加锁解锁相关的事情。务求整个过程的丝滑程度类似Spring的 @Transactional 注解。
这个分布式锁暂时基于red…
MapStruct属性多转一实现
在项目里遇到了需要使用mapstruct将source对象的多个属性转为target对象的一个属性的场景。针对这个问题研究了一段时间,发现想要解决得好一些还是挺让人头疼的。
先说结论吧:MapStruct支持将多个对象转为一个对象,但是不支持将多个属性转为一个属性。对,mapstruct是不支持这么做的。
最终的解决方案也非常简单:在使用mapstruct完成对…
springboot入门16 – 包装Controller返回值2
之前有整理过一次怎样包装SpringBoot Controller的做法。
最近在原有方案的基础上又升级了下,可以通过引入 spring-boot-starter 的形式对接口返回值进行封装。
具体做法如下:
1. 引入 zhy-spring-boot-starter 依赖
|
1 2 3 4 5 |
  |
springboot入门15 – profile设置
配置方式
命令行方式
命令行方式是一种外部配置的方式,在执行java -jar命令时可以通过 --spring.profiles.active=test的方式进行激活指定的profiles列表。
使用方式如下所示:
|
1 |
java -jar order-service-v1.0.jar --spring.profiles.active=dev |
系统变量方式
需要添加一个名为…
基于redis实现分布式bloomfilter
如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit …
springboot入门14 – Kafka应用
简述
这几天优化了一下之前写的一个springboot kafka组件。比较起原生的spring-kafka来,我希望能够简化kafka的使用,可以更聚焦于具体的消息处理逻辑。
接下来的内容是这个组件的用法。
使用方法
添加依赖
这个组件已经提交到了maven中央仓库,可以直接通过依赖的形式引入:
|
1 2 3 4 5 |
<dependency> <group |
springboot入门13 – 多CacheManager应用
概述
之前有写过springboot缓存应用的说明(《springboot入门01 – 缓存的使用》)。不过实际的场景有时候会比较复杂一些,比如:需要同时使用redis和caffine来做多级缓存,或者需要在通用配置外应用一些个性化的配置。使用多个CacheManager来分别管理不同的缓存是应对这种问题的一个常规方案。
接下来介绍下如何实现多CacheManage…