国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

滿屏 Service 注入混亂?用Lambda封裝個(gè)統(tǒng)一調(diào)用組件,直接起飛!

0
分享至

Java精選面試題(微信小程序):5000+道面試題和選擇題,包含Java基礎(chǔ)、并發(fā)、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計(jì)、大廠真題等,在線隨時(shí)刷題!

兄弟們,咱做 Spring 項(xiàng)目的時(shí)候,是不是總遇到這些破事:

  • 每個(gè)Controller 里都要寫(xiě)@Autowired UserService userService,注入一大堆 Service,代碼又亂又冗余;

  • 想統(tǒng)一加個(gè)日志/異常處理,得在每個(gè) Service 方法里寫(xiě)一遍,改起來(lái)要瘋;

  • 偶爾還會(huì)手滑把Service類(lèi)名/方法名寫(xiě)錯(cuò),編譯不報(bào)錯(cuò),跑起來(lái)才出問(wèn)題,排查半天。

今天給大家分享個(gè)我自己寫(xiě)的ServiceManager組件,用Lambda搞定這些破事 —— 不用手動(dòng)注入Service,調(diào)用方法像寫(xiě)公式一樣簡(jiǎn)單,還能自動(dòng)緩存、統(tǒng)一處理異常,新手也能秒懂秒用!

先說(shuō)說(shuō)這組件能解決啥實(shí)際問(wèn)題?

舉個(gè)栗子:以前咱調(diào)用用戶查詢接口,得這么寫(xiě):

// 1. 先注入Service
@Autowired
private UserService userService;
// 2. 再調(diào)用方法
public SerResult getUser(Long userId) {
try {
log.info("開(kāi)始查用戶,ID:{}", userId);
UserDTO user = userService.queryUser(userId);
log.info("查詢成功,結(jié)果:{}", user);
return SerResult.success(user);
} catch (Exception e) {
log.error("查詢失敗", e);
return SerResult.fail("查用戶出錯(cuò)了");
}
}

又是注入又是日志又是try-catch,重復(fù)代碼一堆。

用了ServiceManager之后,直接寫(xiě)成這樣:

public SerResult 

   
getUser(Long userId) {
// 一行搞定:傳方法+參數(shù),其他全幫你做
return ServiceManager.call(UserService::queryUser, userId);
}

注入?沒(méi)了。日志?組件自動(dòng)打。異常?組件自動(dòng)處理。爽不爽?

組件核心邏輯:大白話拆解

其實(shí)這組件就干了 3 件事:

  • 你傳個(gè) Lambda(比如UserService::queryUser),它幫你找到對(duì)應(yīng)的 Service 實(shí)例;

  • 把找到的實(shí)例和方法緩存起來(lái),下次調(diào)用更快;

  • 統(tǒng)一執(zhí)行方法,順便把日志、異常處理都包了。

下面咱一步步來(lái),代碼都給你貼好,復(fù)制過(guò)去改改就能用。

第一步:先搭基礎(chǔ) —— 需要的依賴和工具類(lèi)

首先得有幾個(gè)小工具,不用自己寫(xiě),直接復(fù)制:

1. 統(tǒng)一返回結(jié)果類(lèi)(SerResult)

不管調(diào)用成功還是失敗,都返回同一個(gè)格式,前端好處理:

package org.pro.wwcx.ledger.common.dto;
import lombok.Data;
// 服務(wù)調(diào)用的統(tǒng)一返回結(jié)果,前端拿到就知道是成功還是失敗
@Data
publicclass SerResult {
privateint code; // 200=成功,500=失敗,前端一看就懂
private String msg; // 提示信息,比如“操作成功”“查不到用戶”
private T data; // 成功時(shí)返回的數(shù)據(jù),比如用戶信息
// 成功的時(shí)候調(diào)用這個(gè)方法,把數(shù)據(jù)傳進(jìn)去
publicstatic SerResult success(T data) {
SerResult result = new SerResult<>();
result.setCode(200);
result.setMsg("操作成功");
result.setData(data);
return result;
}
// 失敗的時(shí)候調(diào)用這個(gè)方法,傳錯(cuò)誤信息
publicstatic SerResult fail(String msg) {
SerResult result = new SerResult<>();
result.setCode(500);
result.setMsg(msg);
result.setData(null);
return result;
}
}
2. Lambda 解析工具(LambdaUtil)

這工具是核心,幫咱從 Lambda 里 “扣” 出 Service 類(lèi)名和方法名(不用懂原理,復(fù)制用就行):

package org.pro.wwcx.ledger.common.util;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.lang.invoke.SerializedLambda;
// 從Lambda表達(dá)式里拿Service信息的工具
publicclass LambdaUtil {
// 傳個(gè)Lambda進(jìn)來(lái),返回它對(duì)應(yīng)的“元數(shù)據(jù)”(比如哪個(gè)Service,哪個(gè)方法)
public static SerializedLambda valueOf(Serializable lambda) {
if (lambda == null) {
thrownew IllegalArgumentException("Lambda不能傳空!");
}
try {
// 反射拿到Lambda里的隱藏方法,不用管這行是咋回事
Method writeReplaceMethod = lambda.getClass().getDeclaredMethod("writeReplace");
writeReplaceMethod.setAccessible(true);
return (SerializedLambda) writeReplaceMethod.invoke(lambda);
} catch (Exception e) {
thrownew RuntimeException("解析Lambda出錯(cuò)了", e);
}
}
}
3. Spring 工具類(lèi)(SpringUtil)

幫咱從 Spring 里拿 Service 實(shí)例(不用手動(dòng)@Autowired就是靠它):

package org.pro.wwcx.ledger.common.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
// 從Spring里拿Bean的工具,不用自己注入Service
@Component
publicclass SpringUtil implements ApplicationContextAware {
// Spring的上下文,相當(dāng)于“Bean倉(cāng)庫(kù)”
privatestatic ApplicationContext applicationContext;
// 從倉(cāng)庫(kù)里按類(lèi)型拿Bean,比如拿UserService類(lèi)型的實(shí)例
publicstatic T getBean(Class requiredType) {
if (applicationContext == null) {
thrownew RuntimeException("Spring還沒(méi)初始化好呢!");
}
return applicationContext.getBean(requiredType);
}
// 下面這行是Spring自動(dòng)調(diào)用的,不用管
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtil.applicationContext = applicationContext;
}
}
4. 函數(shù)接口(SerialBiFunction)

這個(gè)是 Lambda 的 “規(guī)矩”,規(guī)定傳參和返回值的格式(復(fù)制就行):

package org.pro.wwcx.ledger.common.resolver.anno;
import java.io.Serializable;
// 支持序列化的雙參數(shù)函數(shù)接口,Lambda要符合這個(gè)格式
public interface SerialBiFunction extends Serializable {
// 方法格式:傳入T(Service實(shí)例)和U(參數(shù)),返回R(結(jié)果)
R apply(T t, U u);
}
5. 實(shí)例構(gòu)建器(InstBuilder)

幫咱快速創(chuàng)建對(duì)象的小工具,不用寫(xiě)一堆set方法:

package org.pro.wwcx.ledger.common.resolver;
// 快速創(chuàng)建對(duì)象的工具,比如new ServiceExecutor后不用一個(gè)個(gè)set值
publicclass InstBuilder {
privatefinal T target;
// 初始化要?jiǎng)?chuàng)建的對(duì)象
private InstBuilder(Class clazz) {
try {
this.target = clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
thrownew RuntimeException("創(chuàng)建對(duì)象失敗", e);
}
}
// 靜態(tài)方法,入口:InstBuilder.of(ServiceExecutor.class)
publicstatic InstBuilder of(Class clazz) {
returnnew InstBuilder<>(clazz);
}
// 鏈?zhǔn)絪et值:比如.set(ServiceExecutor::setParam, param)
public InstBuilder set(Setter setter, V value) {
setter.set(target, value);
returnthis;
}
// 最后調(diào)用build()拿到對(duì)象
public T build() {
return target;
}
// 定義setter的格式
@FunctionalInterface
publicinterface Setter {
void set(T target, V value);
}
}
第二步:核心組件 ——ServiceManager

這是咱的主角,所有邏輯都在這,我一行行給你講明白:

package org.pro.wwcx.ledger.common.servicer;
import lombok.extern.slf4j.Slf4j;
import org.pro.wwcx.ledger.common.dto.SerResult;
import org.pro.wwcx.ledger.common.resolver.InstBuilder;
import org.pro.wwcx.ledger.common.resolver.anno.SerialBiFunction;
import org.pro.wwcx.ledger.common.util.LambdaUtil;
import org.pro.wwcx.ledger.common.util.SpringUtil;
import java.lang.invoke.SerializedLambda;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
// 日志注解,能打日志
@Slf4j
publicclass ServiceManager {
// 緩存初始化大小,6666夠咱用了,不夠再改
privatestaticfinalint INIT_COUNT = 6666;
// 緩存Lambda對(duì)應(yīng)的Service信息,key是Lambda,value是Service元數(shù)據(jù)
privatestaticfinal Map , LambdaMeta > CACHE_LAMBDA;
// 靜態(tài)代碼塊,項(xiàng)目啟動(dòng)時(shí)就初始化緩存
static {
CACHE_LAMBDA = new ConcurrentHashMap<>(INIT_COUNT);
}
// 對(duì)外提供的調(diào)用方法:傳Lambda(比如UserService::queryUser)和參數(shù),返回結(jié)果
@SuppressWarnings("unchecked")
publicstatic SerResult call(SerialBiFunction fn, U param) {
// 先檢查:Lambda不能傳空
if (fn == null) {
return SerResult.fail("服務(wù)函數(shù)不能為空!");
}
// 1. 從緩存拿Service信息:有就直接用,沒(méi)有就解析并緩存
LambdaMeta lambdaMeta = (LambdaMeta ) CACHE_LAMBDA.computeIfAbsent(fn, k-> {
// 解析Lambda,拿到Service實(shí)例、類(lèi)名這些信息
LambdaMeta meta = parseSerialFunction(fn);
log.debug("緩存Service信息:{}", meta.getServiceName());
return meta;
});
// 2. 創(chuàng)建執(zhí)行器,把Lambda、參數(shù)、Service信息傳進(jìn)去
ServiceExecutor executor = InstBuilder.of(ServiceExecutor .class)
.set(ServiceExecutor::setServiceFn, fn) // 傳Lambda方法
.set(ServiceExecutor::setParam, param) // 傳參數(shù)
.set(ServiceExecutor::setLambdaMeta, lambdaMeta) // 傳Service信息
.build(); // 構(gòu)建執(zhí)行器
// 3. 執(zhí)行方法,返回結(jié)果
return executor.callService();
}
// 解析Lambda:從Lambda里拿到Service類(lèi)名、實(shí)例、方法名
@SuppressWarnings("unchecked")
privatestatic LambdaMeta parseSerialFunction(SerialBiFunction fn) {
// 用LambdaUtil拿到Lambda的元數(shù)據(jù)
SerializedLambda lambda = LambdaUtil.valueOf(fn);
// 封裝Service信息的對(duì)象
LambdaMeta lambdaMeta = new LambdaMeta<>();
// 1. 解析Service類(lèi)名:Lambda里的類(lèi)名是“com/example/UserService”,要改成“com.example.UserService”
String tClassName = lambda.getImplClass().replaceAll("/", ".");
try {
// 2. 拿到Service的Class對(duì)象(比如UserService.class)
Class aClass = (Class ) Class.forName(tClassName);
// 3. 從Spring里拿Service實(shí)例(不用@Autowired就是靠這行)
T inst = SpringUtil.getBean(aClass);
// 4. 把信息存到lambdaMeta里
lambdaMeta.setClazz(aClass); // 存Service的Class
lambdaMeta.setInst(inst); // 存Service實(shí)例
lambdaMeta.setServiceName(lambda.getImplMethodName()); // 存方法名(比如queryUser)
} catch (ClassNotFoundException e) {
// 找不到類(lèi)就拋異常
thrownew RuntimeException("沒(méi)找到Service類(lèi):" + tClassName, e);
}
return lambdaMeta;
}
// 封裝Service信息的內(nèi)部類(lèi):存Class、實(shí)例、方法名
@lombok.Data
privatestaticclass LambdaMeta {
private Class clazz; // Service的Class(比如UserService.class)
private T inst; // Service實(shí)例(Spring里的Bean)
private String serviceName; // 方法名(比如queryUser)
}
}
第三步:執(zhí)行器 ——ServiceExecutor

這是幫咱統(tǒng)一執(zhí)行方法、打日志、處理異常的 “打工人”:

package org.pro.wwcx.ledger.common.servicer;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.pro.wwcx.ledger.common.dto.SerResult;
import org.pro.wwcx.ledger.common.resolver.anno.SerialBiFunction;
// 執(zhí)行Service方法的類(lèi),統(tǒng)一打日志、處理異常
@Slf4j
@Setter
publicclass ServiceExecutor {
private SerialBiFunction serviceFn; // 要執(zhí)行的Lambda方法
private U param; // 方法參數(shù)
private ServiceManager.LambdaMeta lambdaMeta; // Service信息
// 執(zhí)行方法的核心邏輯
public SerResult callService() {
// 記錄開(kāi)始時(shí)間,方便算耗時(shí)
long startTime = System.currentTimeMillis();
String serviceName = lambdaMeta.getClazz().getSimpleName(); // 比如UserService
String methodName = lambdaMeta.getServiceName(); // 比如queryUser
log.info("開(kāi)始調(diào)用:{}的{}方法,參數(shù):{}", serviceName, methodName, param);
try {
// 真正執(zhí)行方法:用Service實(shí)例調(diào)用Lambda方法
R result = serviceFn.apply(lambdaMeta.getInst(), param);
// 算耗時(shí),打成功日志
long costTime = System.currentTimeMillis() - startTime;
log.info("調(diào)用成功:{}的{}方法,耗時(shí){}ms,結(jié)果:{}",
serviceName, methodName, costTime, result);
// 返回成功結(jié)果
return SerResult.success(result);
} catch (Exception e) {
// 出錯(cuò)了就打錯(cuò)誤日志,返回失敗結(jié)果
long costTime = System.currentTimeMillis() - startTime;
log.error("調(diào)用失。簕}的{}方法,耗時(shí){}ms",
serviceName, methodName, costTime, e);
return SerResult.fail("調(diào)用" + serviceName + "的" + methodName + "方法失。" + e.getMessage());
}
}
}
第四步:怎么用?舉個(gè)實(shí)際例子

咱以用戶查詢和更新為例,看 Controller 里怎么寫(xiě):

1. 先寫(xiě)個(gè) Service(正常寫(xiě),不用改)

package org.pro.wwcx.ledger.service;
import org.pro.wwcx.ledger.dto.UserDTO;
import org.pro.wwcx.ledger.dto.UserUpdateDTO;
import org.springframework.stereotype.Service;
// 正常的Service,該咋寫(xiě)咋寫(xiě)
@Service
publicclass UserService {
// 查用戶:根據(jù)ID查
public UserDTO queryUser(Long userId) {
// 這里模擬查數(shù)據(jù)庫(kù),實(shí)際項(xiàng)目里換JDBC/MyBatis
UserDTO user = new UserDTO();
user.setUserId(userId);
user.setUserName("張三");
user.setAge(25);
return user;
}
// 更新用戶:傳ID和更新參數(shù)
public Boolean updateUser(Long userId, UserUpdateDTO updateDTO) {
// 這里模擬更新數(shù)據(jù)庫(kù)
log.info("更新用戶{}的信息:{}", userId, updateDTO);
returntrue; // 返回更新成功
}
}
2. Controller 里調(diào)用(重點(diǎn)看變化)

package org.pro.wwcx.ledger.controller;
import org.pro.wwcx.ledger.common.dto.SerResult;
import org.pro.wwcx.ledger.common.servicer.ServiceManager;
import org.pro.wwcx.ledger.dto.UserDTO;
import org.pro.wwcx.ledger.dto.UserUpdateDTO;
import org.pro.wwcx.ledger.service.UserService;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
publicclass UserController {
// 查用戶:不用注入U(xiǎn)serService!一行搞定
@GetMapping("/{userId}")
public SerResult getUser(@PathVariable Long userId) {
// 直接傳Lambda(UserService::queryUser)和參數(shù)(userId)
return ServiceManager.call(UserService::queryUser, userId);
}
// 更新用戶:同樣不用注入
@PutMapping("/{userId}")
public SerResult updateUser(
@PathVariable Long userId,
@RequestBody UserUpdateDTO updateDTO) {
// 這里要注意:因?yàn)閡pdateUser有兩個(gè)參數(shù),所以要顯式指定Lambda類(lèi)型
return ServiceManager.call(
(UserService service, UserUpdateDTO dto) -> service.updateUser(userId, dto),
updateDTO
);
}
}
3. 跑起來(lái)看看效果

查用戶的時(shí)候,日志會(huì)自動(dòng)打:

開(kāi)始調(diào)用:UserService的queryUser方法,參數(shù):1001
調(diào)用成功:UserService的queryUser方法,耗時(shí)5ms,結(jié)果:UserDTO(userId=1001, userName=張三, age=25)

要是出錯(cuò)了,比如傳個(gè)不存在的用戶 ID(假設(shè)數(shù)據(jù)庫(kù)查不到會(huì)拋異常),日志會(huì)打錯(cuò)誤信息,返回給前端的結(jié)果是:

{
"code": 500,
"msg": "調(diào)用UserService的queryUser方法失。河脩舨淮嬖",
"data": null
}
這組件的好處:總結(jié)一下
  • 不用再寫(xiě) @Autowired:Controller 里干干凈凈,再也不用注入一堆 Service;

  • 統(tǒng)一日志 / 異常:想改日志格式、加權(quán)限校驗(yàn),只需要改ServiceExecutor,不用改每個(gè)方法;

  • 緩存優(yōu)化:解析過(guò)的 Service 信息會(huì)緩存,下次調(diào)用更快;

  • 類(lèi)型安全:寫(xiě) Lambda 的時(shí)候,方法名錯(cuò)了編譯就報(bào)錯(cuò),不用等到運(yùn)行才發(fā)現(xiàn)。

注意事項(xiàng):避坑指南
  • JDK 版本:用JDK8及以上,Lambda 表達(dá)式是 JDK8 才有的;

  • Service 要加@Service:Spring才能掃描到,不然SpringUtil拿不到實(shí)例;

  • 多實(shí)現(xiàn)類(lèi)的情況:如果一個(gè)接口有多個(gè)實(shí)現(xiàn)(比如UserServiceUserServiceImpl1UserServiceImpl2),需要在SpringUtil里加按名稱拿 Bean 的方法。

來(lái)源:https://juejin.cn/post/7575017581036765222

公眾號(hào)“Java精選”所發(fā)表內(nèi)容注明來(lái)源的,版權(quán)歸原出處所有(無(wú)法查證版權(quán)的或者未注明出處的均來(lái)自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請(qǐng)聯(lián)系,筆者會(huì)第一時(shí)間刪除處理!

最近有很多人問(wèn),有沒(méi)有讀者或者摸魚(yú)交流群!加入方式很簡(jiǎn)單,公眾號(hào)Java精選,回復(fù)“加群”,即可入群!

文章有幫助的話,點(diǎn)在看,轉(zhuǎn)發(fā)吧!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

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.

相關(guān)推薦
熱點(diǎn)推薦
尤爾曼德:我們?cè)诼?lián)賽階段戰(zhàn)勝了本菲卡、曼城,這表現(xiàn)可接受

尤爾曼德:我們?cè)诼?lián)賽階段戰(zhàn)勝了本菲卡、曼城,這表現(xiàn)可接受

懂球帝
2026-01-29 16:24:06
清華美女教授在三亞突然去世:事發(fā)全過(guò)程披露,學(xué)生披露大量隱情

清華美女教授在三亞突然去世:事發(fā)全過(guò)程披露,學(xué)生披露大量隱情

博士觀察
2026-01-28 20:46:56
商業(yè)航天概念震蕩拉升 航天科技直線漲停

商業(yè)航天概念震蕩拉升 航天科技直線漲停

每日經(jīng)濟(jì)新聞
2026-01-29 11:06:08
被曝“丑聞”才2小時(shí),交警回應(yīng)金晨肇事逃逸,惡心的一幕出現(xiàn)了

被曝“丑聞”才2小時(shí),交警回應(yīng)金晨肇事逃逸,惡心的一幕出現(xiàn)了

靜若梨花
2026-01-29 16:25:55
“流氓有文化更可怕”,退休老干部頻繁聯(lián)系女幼師,聊天記錄曝光

“流氓有文化更可怕”,退休老干部頻繁聯(lián)系女幼師,聊天記錄曝光

妍妍教育日記
2026-01-27 19:58:28
隨著吉達(dá)國(guó)民4-0,費(fèi)哈3-1,沙特聯(lián)積分榜出爐:C羅率隊(duì)跌至第3

隨著吉達(dá)國(guó)民4-0,費(fèi)哈3-1,沙特聯(lián)積分榜出爐:C羅率隊(duì)跌至第3

凌空倒鉤
2026-01-29 07:56:44
15年前,徐帆砸了沈星的豪宅。 15年后沈星還住在4500萬(wàn)房子里。

15年前,徐帆砸了沈星的豪宅。 15年后沈星還住在4500萬(wàn)房子里。

歲月有情1314
2026-01-29 13:47:16
把水賣(mài)給酒鬼?河南一藥企“不務(wù)正業(yè)”,一年掙了40億

把水賣(mài)給酒鬼?河南一藥企“不務(wù)正業(yè)”,一年掙了40億

毒sir財(cái)經(jīng)
2026-01-28 15:27:05
退位后的李淵日子有多難過(guò)?李世民:您的宮女太多,不如回家嫁人

退位后的李淵日子有多難過(guò)?李世民:您的宮女太多,不如回家嫁人

掠影后有感
2026-01-29 10:44:30
這次軍委的動(dòng)作,真是讓人倒吸一口涼氣!

這次軍委的動(dòng)作,真是讓人倒吸一口涼氣!

百態(tài)人間
2026-01-27 15:31:38
他是五代十國(guó)最好皇帝,計(jì)劃30年開(kāi)創(chuàng)太平年,可老天只給他5年半

他是五代十國(guó)最好皇帝,計(jì)劃30年開(kāi)創(chuàng)太平年,可老天只給他5年半

長(zhǎng)風(fēng)文史
2026-01-29 14:46:17
還八百就八百,你可知八百精兵意味著什么?

還八百就八百,你可知八百精兵意味著什么?

小豫講故事
2026-01-28 06:00:07
開(kāi)年大瓜!國(guó)產(chǎn)女優(yōu)上岸成功嫁為人妻,拍短視頻后遭惡語(yǔ)相向

開(kāi)年大瓜!國(guó)產(chǎn)女優(yōu)上岸成功嫁為人妻,拍短視頻后遭惡語(yǔ)相向

社會(huì)醬
2026-01-16 16:54:49
特朗普:她不會(huì)辭職;我可能面臨被彈劾

特朗普:她不會(huì)辭職;我可能面臨被彈劾

揚(yáng)子晚報(bào)
2026-01-28 07:23:00
凍干草莓檢出鎘超標(biāo)、國(guó)家禁用農(nóng)藥克百威殘留?采購(gòu)企業(yè)投訴,市監(jiān)認(rèn)為沒(méi)標(biāo)準(zhǔn)不立案

凍干草莓檢出鎘超標(biāo)、國(guó)家禁用農(nóng)藥克百威殘留?采購(gòu)企業(yè)投訴,市監(jiān)認(rèn)為沒(méi)標(biāo)準(zhǔn)不立案

大風(fēng)新聞
2026-01-28 19:04:04
自己在家養(yǎng)發(fā)半年:頭發(fā)越來(lái)越多,白的越來(lái)越少,我做對(duì)了3件事

自己在家養(yǎng)發(fā)半年:頭發(fā)越來(lái)越多,白的越來(lái)越少,我做對(duì)了3件事

君笙的拂兮
2026-01-28 16:47:18
俄邀澤連斯基赴莫斯科和普京會(huì)面!總統(tǒng)助理:來(lái)吧,保證你的安全

俄邀澤連斯基赴莫斯科和普京會(huì)面!總統(tǒng)助理:來(lái)吧,保證你的安全

娛樂(lè)督察中
2026-01-29 16:00:30
價(jià)格大跳水!主力車(chē)型直降超15萬(wàn),中年男人的夢(mèng)中豪車(chē)撐不住了?

價(jià)格大跳水!主力車(chē)型直降超15萬(wàn),中年男人的夢(mèng)中豪車(chē)撐不住了?

財(cái)經(jīng)八卦
2026-01-28 20:05:03
國(guó)鐵集團(tuán):12306客戶端沒(méi)與任何第三方平臺(tái)合作,不便上網(wǎng)的老年人可電話購(gòu)票

國(guó)鐵集團(tuán):12306客戶端沒(méi)與任何第三方平臺(tái)合作,不便上網(wǎng)的老年人可電話購(gòu)票

紅星新聞
2026-01-29 11:19:02
腸癌手術(shù)一做,人生倒計(jì)時(shí)就開(kāi)始了?醫(yī)生實(shí)話實(shí)說(shuō):這5點(diǎn)要注意

腸癌手術(shù)一做,人生倒計(jì)時(shí)就開(kāi)始了?醫(yī)生實(shí)話實(shí)說(shuō):這5點(diǎn)要注意

荷蘭豆愛(ài)健康
2026-01-29 13:04:32
2026-01-29 17:16:49
Java精選
Java精選
一場(chǎng)永遠(yuǎn)也演不完的戲
1768文章數(shù) 3859關(guān)注度
往期回顧 全部

科技要聞

周亞輝的AI新賭局:國(guó)內(nèi)太卷 出海另起爐灶

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

體育要聞

詹姆斯哭了!騎士視頻致敬41歲超巨

娛樂(lè)要聞

張譯不再隱瞞!公開(kāi)回應(yīng)退圈息影真相

財(cái)經(jīng)要聞

崔東樹(shù):中國(guó)汽車(chē)未來(lái)年銷(xiāo)或達(dá)5000萬(wàn)輛

汽車(chē)要聞

車(chē)長(zhǎng)超5米還帶后輪轉(zhuǎn)向 比亞迪海豹08/海獅08將亮相

態(tài)度原創(chuàng)

藝術(shù)
親子
時(shí)尚
房產(chǎn)
公開(kāi)課

藝術(shù)要聞

梵高全集(高清350張)震撼……

親子要聞

一個(gè)現(xiàn)象:縣城里的孕婦越來(lái)越少了

冬天大衣怎么穿才更好看?選好顏色、找對(duì)單品,高級(jí)簡(jiǎn)約又大氣

房產(chǎn)要聞

萬(wàn)科難眠夜:前董事長(zhǎng)郁亮失聯(lián),三筆債券靠深鐵才通過(guò)展期

公開(kāi)課

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

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版