网易首页 > 网易号 > 正文 申请入驻

炸裂!Spring AI 1.0 正式发布,让 Java 再次伟大!

0
分享至

大家好,我是程序员鱼皮。

炸裂,炸裂,炸裂!从第一次提交代码到现在,经过 2 年的沉淀,Spring AI 框架的第一个正式版本 1.0 终于发布了。

有了这玩意,开发 AI 应用就是洒洒水的事,Java 开发者们是不是又爽了,反正我是很兴奋啊,让 Java 再次伟大!

但可能很多同学还不知道 Spring AI 能干什么,凭什么这玩意就让 Java 伟大了?

正好我最近刚带编程导航的同学做完一套 AI 超级智能体实战项目,毫不夸张地说,我已经把 Spring AI 玩得 “手拿把掐” 了。

下面我来给大家快速分享一下 Spring AI 的核心能力和魔法。看完之后,我相信你会点赞收藏三连,并且说一句:“伟的太大了”。

Spring AI 核心特性

1、大模型调用能力

大模型调用能力是 AI 应用开发的基础,允许应用程序与各种 AI 大模型进行交互,发送提示词并获取模型的响应。Spring AI 提供了统一的接口来支持各种主流大模型,包括 OpenAI GPT 系列、Claude、通义千问等。

Spring AI 通过配置 + 抽象接口简化了大模型的调用过程,我可以直接在配置中声明多个大模型:

spring:
ai:
# 阿里大模型
dashscope:
chat:
options:
model:qwen-max
# 本地大模型
ollama:
base-url:http://localhost:11434
chat:
model:gemma3:1b
# 谷歌大模型
vertex:
ai:
gemini:
chat:
options:
model:gemini-1.5-pro-001

然后使用支持链式调用的 ChatClient 灵活地调用各种不同的大模型:

// 使用 Spring AI 调用大模型
@Bean
publicChatClientchatClient(ChatModel chatModel){
returnChatClient.builder(chatModel).build();
}
publicStringdoChat(String message){
ChatResponse response = chatClient
.prompt(message)
.call()
.chatResponse();
returnresponse.getResult().getOutput().getText();
}

只用一行代码,就能支持 Stream 流式响应,实现打字机效果:

chatClient
.prompt(message)
.stream()

如果不使用 Spring AI,则需要为每个模型分别实现 API 调用,要自己编写请求、解析响应,很麻烦!

// 不使用 Spring AI 调用大模型
publicStringchatWithOpenAI(String message){
// 配置 OpenAI API
OkHttpClient client =newOkHttpClient();
MediaType JSON = MediaType.get("application/json; charset=utf-8");
// 构建请求体
JSONObject requestBody =newJSONObject();
requestBody.put("model","gpt-3.5-turbo");
JSONArray messages =newJSONArray();
JSONObject userMessage =newJSONObject();
userMessage.put("role","user");
userMessage.put("content", message);
messages.put(userMessage);
requestBody.put("messages", messages);
// 发送请求
RequestBody body = RequestBody.create(requestBody.toString(), JSON);
Request request =newRequest.Builder()
.url("https://api.openai.com/v1/chat/completions")
.header("Authorization","Bearer "+ OPENAI_API_KEY)
.post(body)
.build();
try(Response response = client.newCall(request).execute()) {
String responseBody = response.body().string();
JSONObject jsonResponse =newJSONObject(responseBody);
returnjsonResponse.getJSONArray("choices")
.getJSONObject(0)
.getJSONObject("message")
.getString("content");
}catch(Exception e) {
return"Error: "+ e.getMessage();
}
}

Spring AI 不仅提供了统一接口支持多种大模型,让我们可以轻松切换模型而无需修改业务代码。它还支持多模态大模型调用,使 AI 能够同时处理文本、图像、音频等多种输入类型。

我们只需要将图片等资源添加到消息对象中,一起发送给 AI 就可以了,使用 Spring AI 几行代码就能实现:

// 调用多模态模型
String response = ChatClient.create(chatModel).prompt()
.user(u -> u.text("描述这张图片中的内容")
.media(MimeTypeUtils.IMAGE_PNG,newClassPathResource("/yupi.png")))
.call()
.content();

如果不使用 Spring AI,多模态处理将变得复杂得多:

// 不使用 Spring AI 的多模态实现
publicStringanalyzeImage(String textPrompt, File imageFile){
// 读取图像文件并编码为 Base64
String base64Image ="";
try{
byte[] fileContent = Files.readAllBytes(imageFile.toPath());
base64Image = Base64.getEncoder().encodeToString(fileContent);
}catch(IOException e) {
return"Error reading image file: "+ e.getMessage();
}
// 构建请求体,不同模型的格式差异很大
JSONObject requestBody =newJSONObject();
requestBody.put("model","gpt-4-vision-preview");
JSONArray messages =newJSONArray();
JSONObject userMessage =newJSONObject();
userMessage.put("role","user");
// 构建复杂的内容数组
JSONArray contentArray =newJSONArray();
// 添加文本部分
JSONObject textContent =newJSONObject();
textContent.put("type","text");
textContent.put("text", textPrompt);
contentArray.put(textContent);
// 添加图像部分
JSONObject imageContent =newJSONObject();
imageContent.put("type","image_url");
JSONObject imageUrl =newJSONObject();
imageUrl.put("url","data:image/png;base64,"+ base64Image);
imageContent.put("image_url", imageUrl);
contentArray.put(imageContent);
userMessage.put("content", contentArray);
messages.put(userMessage);
requestBody.put("messages", messages);
// 发送请求并解析响应...
// 代码略
}

此外,Spring AI 提供了强大的 Advisors 机制,有点类似面向切面编程,可以在模型调用前后添加额外的逻辑,增强 AI 的能力。

举个例子,使用 Spring AI 内置的日志 Advisor,一行代码就能在调用 AI 前后记录日志:

// 使用 Advisors 增强 ChatClient
publicStringdoChatWithAdvisors(String message, String chatId){
ChatResponse response = chatClient
.prompt()
.user(message)
// 添加日志 Advisor
.advisors(newLoggingAdvisor())
.call()
.chatResponse();
returnresponse.getResult().getOutput().getText();
}

Advisor 的应用场景还有很多,比如调用 AI 前检查提示词是否安全、得到 AI 响应后保存到数据库中等等。

2、提示工程

提示工程(Prompt Engineering)是一门复杂的学问,指通过精心设计提示词,让 AI 更准确地理解用户意图,生成更符合预期的回答,减少幻觉(生成虚假信息)的概率,同时优化 AI 模型的性能表现并节省成本。

Spring AI 通过 Prompt 和 PromptTemplate 类实现提示工程。

Prompt 类可以统一封装多种不同类型的提示词,便于发送给大模型:

// 用户提示词
Message userMessage =newUserMessage(userText);
// 系统提示词
Message systemMessage =newSystemMessage(systemText);
Prompt prompt =newPrompt(List.of(userMessage, systemMessage));

利用 PromptTemplate 可以创建支持替换变量的提示词模板,便于提示词的维护和复用:

// 使用 Spring AI 的提示模板
PromptTemplate promptTemplate =newPromptTemplate("你好,我是{name},我擅长{skill}");
Prompt prompt = promptTemplate.create(Map.of(
"name","鱼皮",
"skill","编程"
));
ChatResponse response = chatClient.call(prompt);

如果不使用 Spring AI,你就需要手动 / 或者利用工具类来拼接提示词字符串,会更麻烦:

// 不使用 Spring AI 需要手动字符串拼接
String name ="AI 恋爱顾问";
String skill ="解决恋爱问题";
String promptText ="你好,我是"+ name +",我擅长"+ skill;
// 还需自行实现条件逻辑、变量转义等
if(hasCondition) {
promptText +=",我注意到你可能遇到了"+ conditionType +"问题";
}
// 调用 API 需自行封装请求
Response response = apiClient.sendPrompt(promptText);

3、会话记忆

会话记忆(Chat Memory)使 AI 能够保存多轮对话历史,理解上下文,实现连贯对话体验,防止 AI 断片儿。

利用 Spring AI 的 Advisor 机制,一行代码就能轻松开启对话记忆:

// 使用 Spring AI 的会话记忆
publicStringdoChatWithMemory(String message, String chatId){
ChatResponse response = chatClient
.prompt()
.user(message)
.advisors(
// 将对话记忆保存到内存中
newMessageChatMemoryAdvisor(newInMemoryChatMemory())
)
.call()
.chatResponse();
returnresponse.getResult().getOutput().getText();
}

还可以设置会话 id 实现隔离、设置上下文大小限制等参数:

// 使用 Spring AI 的会话记忆
publicStringdoChatWithMemory(String message, String chatId){
ChatResponse response = chatClient
.prompt()
.user(message)
.advisors(
// 将对话记忆保存到内存中
newMessageChatMemoryAdvisor(newInMemoryChatMemory())
)
.advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY,10))
.call()
.chatResponse();
returnresponse.getResult().getOutput().getText();
}

Spring AI 会自动处理上下文窗口大小限制,避免超出模型最大 token 限制。

如果不使用 Spring AI,需要手动管理对话历史,代码量一下子就上来了:

// 不使用 Spring AI 的会话记忆实现
MapnewHashMap<>();
publicStringchat(String message, String userId){
// 获取用户历史记录
ListnewArrayList<>());
// 添加用户新消息
Message userMessage =newMessage("user", message);
history.add(userMessage);
// 构建完整历史上下文
StringBuilder contextBuilder =newStringBuilder();
for(Message msg : history) {
contextBuilder.append(msg.getRole()).append(": ").append(msg.getContent()).append("\n");
}
// 调用 AI API
String response = callAiApi(contextBuilder.toString());
// 保存 AI 回复到历史
Message aiMessage =newMessage("assistant", response);
history.add(aiMessage);
conversationHistory.put(userId, history);
returnresponse;
}

> conversationHistory =

history = conversationHistory.getOrDefault(userId,

Spring AI 的实现非常优秀,将会话存储和保存机制分离,我们可以自己定义 ChatMemory,将对话历史保存到数据库等持久存储中。

4、RAG 检索增强生成

RAG(Retrieval-Augmented Generation)是指利用外部知识来增强 AI 生成结果的技术。通过从知识库检索相关信息并注入到提示词中,让 AI 能够利用这些信息生成更准确的回答。

比如我带大家做了一个 AI 恋爱大师应用,给 AI 准备了一套专注于恋爱问答的知识库文档:

利用 RAG 技术,AI 就能从我自己定义的知识库中获取到特定领域的、最新的信息,不仅能减少大模型的幻觉(防止瞎编内容),还能趁机推荐一波自己的课程,岂不美哉?

所以 AI 的回复也不能完全相信哦~

RAG 的完整工作流程包括文档收集和切割、向量转换和存储、文档过滤和检索、查询增强和关联 4 大步骤。

Spring AI 给 RAG 全流程的实现都提供了支持:

1)文档读取。直接利用 Spring AI 提供的文档加载器,各种类型的文档都能轻松读取:

publicListloadDocuments(){
ListnewArrayList<>();
// 加载 Markdown 文档
Resource resource = resourceLoader.getResource("classpath:documents/knowledge.md");
MarkdownDocumentReaderConfig config = MarkdownDocumentReaderConfig.builder()
.withHorizontalRuleCreateDocument(true)
.withIncludeCodeBlock(true)
.withAdditionalMetadata("source","knowledge-base")
.build();
MarkdownDocumentReader reader =newMarkdownDocumentReader(resource, config);
documents.addAll(reader.get());
returndocuments;
}

documents =

2)向量存储。利用 Spring AI 提供的 VectorStore 轻松将文档转换为向量并保存到向量数据库中:

// 创建简单向量存储
SimpleVectorStore vectorStore = SimpleVectorStore.builder(embeddingModel)
.build();
// 加载文档并存储
List
vectorStore.add(documents);

documents = documentLoader.loadDocuments();

3)文档过滤检索 + 查询增强关联。直接使用 QuestionAnswerAdvisor,一行代码就可以让 Spring AI 自动从知识库中检索文档,并将检索到的文档提供给 AI 来增强输出结果。

ChatResponse response = chatClient.prompt()
.user(question)
.advisors(newQuestionAnswerAdvisor(vectorStore))
.call()
.chatResponse();

如果不使用 Spring AI,上述过程的实现可就太复杂了,要自己检索文档、构建提示词等等:

// 不使用 Spring AI 的 RAG 实现
publicStringgenerateAnswerWithKnowledge(String query){
// 1. 将查询转换为向量
float[] queryVector = embeddingService.embedText(query);
// 2. 在向量数据库中搜索相似内容
ListnewArrayList<>();
for(Document doc : vectorDatabase.getAllDocuments()) {
floatsimilarity = calculateCosineSimilarity(queryVector, doc.getVector());
if(similarity >0.5) {
relevantDocs.add(doc);
}
}
relevantDocs.sort((a, b) -> Float.compare(
calculateCosineSimilarity(queryVector, b.getVector()),
calculateCosineSimilarity(queryVector, a.getVector())
));
// 3. 截取前三个最相关文档
relevantDocs = relevantDocs.subList(0, Math.min(3, relevantDocs.size()));
// 4. 构建提示词,包含检索到的知识
StringBuilder prompt =newStringBuilder();
prompt.append("使用以下信息回答问题:\n\n");
for(Document doc : relevantDocs) {
prompt.append("---\n").append(doc.getContent()).append("\n---\n\n");
}
prompt.append("问题: ").append(query);
// 5. 调用 AI 生成回答
returnaiService.generateResponse(prompt.toString());
}

relevantDocs =

除了实现基础的 RAG 能力外,Spring AI 还提供了更多高级能力来优化 RAG 的效果。比如提供了完整的 ETL流程的支持,能够快速抽取文档、切分处理文档、并加载到向量存储中。

提供了多查询扩展器,可以为原始提示词生成多个查询变体,提高召回文档的几率:

MultiQueryExpander queryExpander = MultiQueryExpander.builder()
.chatClientBuilder(chatClientBuilder)
.numberOfQueries(3)
.build();
ListnewQuery("谁是程序员鱼皮?"));

queries = queryExpander.expand(

提供了查询重写器,可以把原始提示词变得更精确和专业:

publicStringdoQueryRewrite(String prompt){
QueryTransformer queryTransformer = RewriteQueryTransformer.builder()
.chatClientBuilder(builder)
.build();
Query query =newQuery(prompt);
// 执行查询重写
Query transformedQuery = queryTransformer.transform(query);
// 输出重写后的查询
returntransformedQuery.text();
}

效果如图:

还支持自定义文档检索器,能够更灵活地定义查询规则,比如按照文档的元信息精确查询、只查询相似度最高的 N 条数据等:

DocumentRetriever retriever = VectorStoreDocumentRetriever.builder()
.vectorStore(vectorStore)
.similarityThreshold(0.73)
.topK(5)
.filterExpression(newFilterExpressionBuilder()
.eq("name","鱼皮")
.build())
.build();

5、工具调用

工具调用(Tool Calling)允许 AI 借助外部工具完成自身无法直接完成的任务,比如网络搜索、文件操作、数据查询等。它扩展了 AI 的能力范围,使 AI 能够获取实时信息、执行实际操作。

工具调用实现的本质是拼接提示词,让 AI 选择要调用哪些工具,然后由程序调用工具并将返回结果交给 AI 进行后续输出。

利用 Spring AI,只需要通过注解就能快速定义工具:

// 使用 Spring AI 定义工具
publicclassWebSearchTool{
@Tool(description ="Search for information from Baidu Search Engine")
publicStringsearchWeb(
@ToolParam(description ="Search query keyword")String query){
// 网络搜索实现
return"搜索结果: "+ query +" 的相关信息...";
}
}

然后一行代码就能使用工具,Spring AI 会控制程序和大模型进行交互并自动调用工具,非常方便:

ChatResponse response = chatClient
.prompt()
.user(message)
.tools(newWebSearchTool())
.call()
.chatResponse();

如果不使用 Spring AI,可就太复杂了!

// 不使用 Spring AI 的工具调用实现
publicStringhandleUserRequest(String userMessage){
// 1. 构建含工具定义的提示词
String toolDefinition ="""
{
"tools": [
{
"name": "searchWeb",
"description": "Searchforinformation from Baidu Search Engine",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search query keyword"
}
},
"required": ["query"]
}
}
]
}
""";
// 2. 调用 AI 判断是否需要工具
JsonObject aiResponse = callAiWithTools(userMessage, toolDefinition);
// 3. 解析 AI 响应判断是否需调用工具
if(aiResponse.has("tool_calls")) {
JsonArray toolCalls = aiResponse.getAsJsonArray("tool_calls");
// 4. 依次执行每个工具
ListnewArrayList<>();
for(JsonElement toolCall : toolCalls) {
String toolName = toolCall.getAsJsonObject().get("name").getAsString();
JsonObject args = toolCall.getAsJsonObject().get("arguments").getAsJsonObject();
// 5. 根据工具名执行对应工具
if("searchWeb".equals(toolName)) {
String query = args.get("query").getAsString();
String result = searchWeb(query);// 实际执行搜索
toolResults.add(result);
}
}
// 6. 将工具结果发回给 AI 生成最终回答
returncallAiWithToolResults(userMessage, toolCalls, toolResults);
}
returnaiResponse.get("content").getAsString();
}

toolResults =

此外,Spring AI 提供了工具上下文 ToolContext,可以让程序给工具传递额外参数,实现用户身份认证等功能。还支持直接返回模式(returnDirect),可以绕过大模型直接返回工具结果。

6、MCP 模型上下文协议

MCP(Model Context Protocol 模型上下文协议)是一种开放标准,目的是增强 AI 与外部系统的交互能力。MCP 为 AI 提供了与外部工具、资源和服务交互的标准化方式,让 AI 能够访问最新数据、执行复杂操作,并与现有系统集成。

可以将 MCP 想象成 AI 应用的 USB 接口,就像 USB 为设备连接各种外设和配件提供了标准化方式一样,MCP 为 AI 模型连接不同的数据源和工具提供了标准化的方法。从而轻松增强 AI 的能力,有效降低开发者的理解成本,并且打造出 MCP 服务生态。

利用 Spring AI,我们可以快速接入别人的 MCP 服务,只需要定义 MCP 服务配置,然后直接通过 Bean 注入 MCP 服务提供的工具即可:

// 使用 Spring AI 的 MCP 客户端
// 1. 在配置文件中定义 MCP 服务
// mcp-servers.json
{
"mcpServers": {
"amap-maps": {
"command":"npx",
"args": ["-y","@amap/amap-maps-mcp-server"],
"env": {"AMAP_MAPS_API_KEY":"你的API密钥"}
}
}
}
// 2. 在应用程序中使用 MCP 服务
@Resource
privateToolCallbackProvider toolCallbackProvider;
publicStringdoChatWithMcp(String message){
ChatResponse response = chatClient
.prompt()
.user(message)
.tools(toolCallbackProvider)// MCP 服务提供的所有工具
.call()
.chatResponse();
returnresponse.getResult().getOutput().getText();
}

当然,开发 MCP 服务也很简单。先利用注解定义工具,然后将工具注册到 MCP 服务中:

// 定义工具
publicclassImageSearchTool{
@Tool(description ="search image from web")
publicStringsearchImage(@ToolParam(description ="Search query keyword")String query){
// 搜索图片,返回结果
return"https://www.codefather.cn";
}
}
// 注册 MCP 服务
@Bean
publicToolCallbackProviderimageSearchTools(){
returnMethodToolCallbackProvider.builder()
.toolObjects(newImageSearchTool())
.build();
}

如果不使用 Spring AI,你就需要引入 MCP 官方的 SDK 进行开发,或者自主实现,太麻烦了!

// 不使用 Spring AI 的 MCP 实现
publicStringchatWithExternalTools(String userMessage){
// 1. 启动外部 MCP 服务进程
Process mcpProcess = startMcpProcess("npx","-y","@amap/amap-maps-mcp-server");
// 2. 建立与 MCP 服务的通信通道
InputStream inputStream = mcpProcess.getInputStream();
OutputStream outputStream = mcpProcess.getOutputStream();
// 3. 发送初始化握手消息
JsonObject initMessage =newJsonObject();
initMessage.addProperty("jsonrpc","2.0");
initMessage.addProperty("method","initialize");
// ... 添加更多初始化参数
sendMessage(outputStream, initMessage);
// 4. 接收并解析服务提供的工具定义
JsonObject response = readResponse(inputStream);
JsonArray toolDefinitions = extractToolDefinitions(response);
// 5. 调用 AI 模型,将工具定义传递给模型
JsonObject aiResponse = callAiWithTools(userMessage, toolDefinitions);
// 6. 解析 AI 响应,如果需要调用工具则发送给 MCP 服务
if(aiResponse.has("tool_calls")) {
JsonArray toolCalls = aiResponse.getAsJsonArray("tool_calls");
ListnewArrayList<>();
for(JsonElement toolCall : toolCalls) {
// 7. 将工具调用请求发送给 MCP 服务
JsonObject toolRequest =newJsonObject();
toolRequest.addProperty("jsonrpc","2.0");
toolRequest.addProperty("method","executeFunction");
// ... 添加工具调用参数
sendMessage(outputStream, toolRequest);
// 8. 接收 MCP 服务的执行结果
JsonObject toolResponse = readResponse(inputStream);
toolResults.add(toolResponse.toString());
}
// 9. 将工具结果发回给 AI 生成最终回答
returncallAiWithToolResults(userMessage, toolCalls, toolResults);
}
// 10. 最后关闭 MCP 服务
mcpProcess.destroy();
returnaiResponse.get("content").getAsString();
}

toolResults =

结尾

以上就是 Spring AI 的核心特性解析,相信大家也感受到使用 Spring AI 开发 AI 应用有多爽了吧!

除了前面提到的之外,Spring AI 还提供了大模型评估测试能力,比如评估 AI 回答与用户输入和上下文的相关性;还提供了全面的可观测性功能,帮助开发者监控 AI 应用的运行状态。

不过目前这些特性还不够成熟,Spring AI 也还有很长一段路要走,后续应该也会推出智能体工作流编排框架吧~

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
美国人发问:中国为何“畏惧”战争?海外神回复让老美集体沉默!

美国人发问:中国为何“畏惧”战争?海外神回复让老美集体沉默!

解锁世界风云
2026-06-20 20:24:41
高速限速80公里被质疑,四川交通部门披露调整进展

高速限速80公里被质疑,四川交通部门披露调整进展

像素与芯片
2026-06-21 01:30:16
廉价版M9亮相:鸿蒙系为何自己山寨自己

廉价版M9亮相:鸿蒙系为何自己山寨自己

小怪吃美食
2026-06-21 03:28:02
月销286台免死!比亚迪砸碎20年大锅饭,逼各品牌单干

月销286台免死!比亚迪砸碎20年大锅饭,逼各品牌单干

刘哥谈体育
2026-06-22 06:36:38
2026.6.22【A股早报】:多家公司同时发布风险警示!

2026.6.22【A股早报】:多家公司同时发布风险警示!

旌阳财经视角
2026-06-22 06:30:03
太阳报:堪萨斯一位老太太将珍藏20年台球桌卖给英格兰队

太阳报:堪萨斯一位老太太将珍藏20年台球桌卖给英格兰队

懂球帝
2026-06-21 11:48:10
特朗普:伊朗必须立即停止在黎巴嫩的“代理人”行动,否则美国将会再次对伊朗发起猛烈打击,“就像上周那样,而且会更猛烈”

特朗普:伊朗必须立即停止在黎巴嫩的“代理人”行动,否则美国将会再次对伊朗发起猛烈打击,“就像上周那样,而且会更猛烈”

大风新闻
2026-06-21 22:23:11
泽连斯基刚炸莫斯科,普京反手甩出巨型航弹砸向乌军指挥部

泽连斯基刚炸莫斯科,普京反手甩出巨型航弹砸向乌军指挥部

徐竦解说
2026-06-22 05:27:18
四川饭店回收剩蘸料,铁证面前还狡辩,当地人爆猛料,市监局介入

四川饭店回收剩蘸料,铁证面前还狡辩,当地人爆猛料,市监局介入

青梅侃史啊
2026-06-21 19:30:11
“陈小春边哭边改”登上热搜,应采儿发文回应陈小春哭了

“陈小春边哭边改”登上热搜,应采儿发文回应陈小春哭了

韩小娱
2026-06-22 06:52:30
97年我娶了离过婚的女教师,洞房夜她把灯关了:我有件事要告诉你

97年我娶了离过婚的女教师,洞房夜她把灯关了:我有件事要告诉你

千秋文化
2026-06-18 20:19:03
中国要做好最充足的打算:一旦俄罗斯打赢了,我们可能要做3件事

中国要做好最充足的打算:一旦俄罗斯打赢了,我们可能要做3件事

离离言几许
2026-06-22 00:55:51
上班穿着超40斤的裤子!男子怪异着装引发老板怀疑,报警一查所有人都惊呆了……

上班穿着超40斤的裤子!男子怪异着装引发老板怀疑,报警一查所有人都惊呆了……

环球网资讯
2026-06-21 11:58:17
离婚真相曝光仅6个月,前妻高调曝光追求者,撕碎猴哥仅剩体面

离婚真相曝光仅6个月,前妻高调曝光追求者,撕碎猴哥仅剩体面

挂肚逍遥心
2026-06-08 08:17:28
王鹤棣端午节晒北京大平层,亲妈出镜朴素还戴玉镯,王传君也来了

王鹤棣端午节晒北京大平层,亲妈出镜朴素还戴玉镯,王传君也来了

椰黄娱乐
2026-06-20 11:50:31
复旦大学研究:86%的人彻底绝嗣,能留后代的从来都是少数人

复旦大学研究:86%的人彻底绝嗣,能留后代的从来都是少数人

舒山有鹿
2026-06-20 11:32:21
切尔西挖皇马左后卫遭拒

切尔西挖皇马左后卫遭拒

体坛周报
2026-06-21 11:16:18
客流暴跌59%,一年亏损2000亿!昔日城市出行主力正“断臂求生”

客流暴跌59%,一年亏损2000亿!昔日城市出行主力正“断臂求生”

墨兰史书
2026-06-22 04:20:05
科学家发现:世界最深的马里亚纳海沟,每年偷偷吞掉30亿吨海水!

科学家发现:世界最深的马里亚纳海沟,每年偷偷吞掉30亿吨海水!

观察宇宙
2026-06-18 22:02:34
老板娘你穿成这个样子,存心不让顾客好好吃饭吗,看都看饱了!

老板娘你穿成这个样子,存心不让顾客好好吃饭吗,看都看饱了!

那年秋天
2026-06-20 09:00:17
2026-06-22 08:08:49
程序员鱼皮 incentive-icons
程序员鱼皮
一手科技资讯和编程干货
158文章数 136关注度
往期回顾 全部

科技要闻

马斯克拿下7800亿元天价薪酬 2028年可兑现

头条要闻

渐冻症女子被男护工猥亵案宣判 多次被对方亲吻、摸胸

头条要闻

渐冻症女子被男护工猥亵案宣判 多次被对方亲吻、摸胸

体育要闻

德国的超级替补,10年前还在工厂上班

娱乐要闻

原来她就是张颂文老婆

财经要闻

“床垫界的特斯拉”破产了

汽车要闻

惊出冷汗!重庆实测奥迪A5L,华为智驾这波操作绝了…

态度原创

家居
房产
数码
艺术
公开课

家居要闻

绿意盎然 自然之境

房产要闻

商业清零式退潮,大量住宅登场!三亚又要大规模调规!

数码要闻

存储价格暴涨超300%!手机电脑又要涨价了 涨幅预计还是千元起

艺术要闻

310米!欧盟第一高楼,坐落于波兰

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版