最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Java+OpenClaw實(shí)現(xiàn)企業(yè)級(jí)智能體自動(dòng)化

 更新時(shí)間:2026年04月02日 09:36:43   作者:東離與糖寶  
本文介紹了OpenClaw開(kāi)源框架,它為Java程序員提供了一個(gè)無(wú)需學(xué)習(xí)Python便可調(diào)用AI智能體的API網(wǎng)關(guān),文章詳細(xì)講解了OpenClaw的核心功能、架構(gòu)設(shè)計(jì)、環(huán)境準(zhǔn)備、Java集成實(shí)戰(zhàn)及企業(yè)級(jí)落地的關(guān)鍵細(xì)節(jié),需要的朋友可以參考下

前言

Python 寫(xiě) AI 智能體就像養(yǎng)了一只智商在線但脾氣古怪的貓——三行代碼能搞定的事,往往要先和 conda 環(huán)境、CUDA 版本、依賴沖突搏斗三天。OpenClaw 作為 2026 年 GitHub 上狂攬 18 萬(wàn)星的開(kāi)源 Agent 框架,提供了標(biāo)準(zhǔn)化的 REST API 網(wǎng)關(guān),讓 Java 后端終于可以不被迫學(xué) Python,直接用 Spring Boot 就能調(diào)度 AI 智能體。本文提供可直接落地的 Java 集成方案,包含完整的 HTTP 調(diào)用層設(shè)計(jì)和生產(chǎn)級(jí)容錯(cuò)代碼。

一、先吐槽:為什么 Java 程序員總得被迫學(xué) Python?

搞 Java 的老鐵們肯定都經(jīng)歷過(guò)這種魔幻場(chǎng)景:公司突然說(shuō)要搞 AI 自動(dòng)化,CTO 拍板用某開(kāi)源 Agent 框架,你興沖沖打開(kāi) GitHub,結(jié)果發(fā)現(xiàn)人家只提供 Python SDK。于是你開(kāi)始了一場(chǎng)"從入門(mén)到放棄"的修行:

  • 早上九點(diǎn):pip install xxx
  • 早上十點(diǎn):發(fā)現(xiàn)需要 Python 3.9,而你系統(tǒng)自帶 3.8
  • 中午十二點(diǎn):好不容易裝好環(huán)境,提示缺某個(gè) C++ 編譯器
  • 下午三點(diǎn):終于跑通 Demo,一裝 PyTorch 發(fā)現(xiàn) CUDA 版本不對(duì)
  • 晚上十點(diǎn):你盯著滿屏的紅色報(bào)錯(cuò),開(kāi)始懷疑人生

這就好比你本來(lái)是個(gè)開(kāi)轎車的老司機(jī),為了送個(gè)外賣(mài)被迫去考摩托車駕照,結(jié)果摩托車還老是熄火。

OpenClaw 的出現(xiàn),相當(dāng)于給 Java 程序員修了一條高速公路。它本質(zhì)上是一個(gè)自托管的 AI Agent 網(wǎng)關(guān),對(duì)外暴露標(biāo)準(zhǔn)的 HTTP REST 接口。你可以把它理解成一個(gè)"翻譯官"——左邊耳朵聽(tīng) Java 后端發(fā)來(lái)的 HTTP 請(qǐng)求,右邊嘴巴用 Python 和 AI 模型聊天,但這一切對(duì) Java 層完全透明。

二、OpenClaw 到底是個(gè)啥?三分鐘建立認(rèn)知

別被那些花里胡哨的宣傳詞忽悠,OpenClaw 的核心就三件事:

本地 AI 網(wǎng)關(guān),數(shù)據(jù)不出域
它跑在你自己的服務(wù)器上(Windows、Linux、Mac 都能跑),默認(rèn)監(jiān)聽(tīng) 18789 端口。你的業(yè)務(wù)數(shù)據(jù)不會(huì)流向第三方平臺(tái),這對(duì)金融、醫(yī)療等敏感行業(yè)是剛需。

多模型支持,隨時(shí)換芯
OpenClaw 支持接入 OpenAI、Anthropic、Gemini、OpenRouter,甚至本地 Ollama 模型。想從 GPT-4 換成通義千問(wèn)?改個(gè)配置就行,Java 代碼一行不用動(dòng)。

自帶"記憶"和"手"
不像那些只會(huì)聊天的玩具機(jī)器人,OpenClaw 有持久化記憶(能記住用戶上周說(shuō)過(guò)的話),還能調(diào)用工具——發(fā)郵件、查數(shù)據(jù)庫(kù)、操作瀏覽器、調(diào)用 Shell 命令,甚至能幫你自動(dòng)填寫(xiě) Excel 表格。

簡(jiǎn)單說(shuō),它更像是一個(gè)"數(shù)字員工"而不是"聊天框"。

三、架構(gòu)設(shè)計(jì):Java 和 OpenClaw 怎么分工?

企業(yè)級(jí)應(yīng)用講究邊界清晰。我們不要把 OpenClaw 當(dāng)成黑盒魔盒,而是把它看作微服務(wù)架構(gòu)中的一個(gè)特殊類型的微服務(wù):

┌─────────────────────────────────────────────────────┐
│                    前端 / 移動(dòng)端                      │
└──────────────────────┬──────────────────────────────┘
                        │ HTTP
┌──────────────────────▼──────────────────────────────┐
│              Spring Boot 業(yè)務(wù)服務(wù)層                   │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────┐  │
│  │  用戶管理     │  │  訂單邏輯     │  │  權(quán)限控制 │  │
│  └──────────────┘  └──────────────┘  └──────────┘  │
└──────────────────────┬──────────────────────────────┘
                        │ REST API (JSON over HTTP)
┌──────────────────────▼──────────────────────────────┐
│              OpenClaw 本地網(wǎng)關(guān) (Port 18789)          │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────┐  │
│  │  意圖理解     │  │  工具調(diào)用     │  │  記憶存儲(chǔ) │  │
│  └──────────────┘  └──────────────┘  └──────────┘  │
└──────────────────────┬──────────────────────────────┘
                        │
┌──────────┼──────────┐
▼          ▼          ▼
┌──────┐   ┌──────┐   ┌────────┐
│GPT-4 │   │Claude│   │本地模型 │
└──────┘   └──────┘   └────────┘
  • Java 層負(fù)責(zé):業(yè)務(wù)邏輯、事務(wù)管理、權(quán)限校驗(yàn)、數(shù)據(jù)持久化。
  • OpenClaw 負(fù)責(zé):理解自然語(yǔ)言、調(diào)用 AI 模型、執(zhí)行非結(jié)構(gòu)化任務(wù)。

兩者通過(guò)標(biāo)準(zhǔn)的 HTTP/JSON 通信,你可以用任何 Java HTTP 客戶端(RestTemplate、WebClient、OkHttp、Feign)來(lái)調(diào)用。

四、環(huán)境準(zhǔn)備:把 OpenClaw 跑起來(lái)

在寫(xiě) Java 代碼之前,得先把"翻譯官"請(qǐng)到位。OpenClaw 的安裝比你想象的要簡(jiǎn)單,因?yàn)樗饕蕾?Node.js,但提供了可執(zhí)行文件,甚至支持 Java 方式啟動(dòng)。

快速部署(Linux/macOS)

克隆倉(cāng)庫(kù)

git clone https://github.com/OpenClaw/OpenClaw.git
cd OpenClaw

安裝依賴(需要 Node.js 20+)

npm install

初始化配置(交互式向?qū)В?/p>

npm run setup

配置過(guò)程中會(huì)讓你選擇:

  • 模型提供商:OpenAI / Anthropic / Gemini / OpenRouter / Ollama
  • API Key:填你自己的模型密鑰
  • 監(jiān)聽(tīng)端口:默認(rèn) 18789,建議保持默認(rèn)

啟動(dòng)服務(wù)

方式一:Node 啟動(dòng)

npm start

方式二:Java 方式運(yùn)行(如果你打包成了 JAR)

java -jar OpenClaw.jar

看到日志里出現(xiàn) Gateway listening on http://0.0.0.0:18789 就說(shuō)明成功了。這時(shí)候你可以用 curl 測(cè)試一下:

curl http://localhost:18789/api/status

應(yīng)該返回類似這樣的 JSON:

{
"status": "running",
"uptime": 3600,
"channels": {
"telegram": { "status": "connected" }
}
}

五、Java 集成實(shí)戰(zhàn):從"Hello Agent"到生產(chǎn)代碼

5.1 基礎(chǔ)配置類

先定義一個(gè)配置類來(lái)管理 OpenClaw 的連接參數(shù),符合 Spring Boot 的"約定優(yōu)于配置"哲學(xué):

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "openclaw")
public class OpenClawProperties {
    private String baseUrl = "http://localhost:18789";
    private String apiKey; // 如果啟用了網(wǎng)關(guān)認(rèn)證
    private int timeoutSeconds = 60;
    private int maxRetries = 3;
    // Getters and Setters...
}

application.yml 中配置:

openclaw:
  base-url: http://localhost:18789
  timeout-seconds: 60

5.2 核心客戶端封裝

別直接用裸的 RestTemplate,封裝一層能讓你在出問(wèn)題時(shí)不至于抓瞎:

import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.http.*;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

@Service
public class OpenClawClient {
    private final RestTemplate restTemplate;
    private final OpenClawProperties properties;
    private final ObjectMapper objectMapper;

    public OpenClawClient(OpenClawProperties properties) {
        this.properties = properties;
        this.restTemplate = new RestTemplate();
        this.objectMapper = new ObjectMapper();

        // 設(shè)置超時(shí)
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(5000);
        factory.setReadTimeout(properties.getTimeoutSeconds() * 1000);
        this.restTemplate.setRequestFactory(factory);
    }

    /**
     * 發(fā)送消息給 Agent
     * 對(duì)應(yīng) OpenClaw 的 POST /api/message 端點(diǎn)
     */
    @Retryable(
        value = {OpenClawException.class}, 
        maxAttempts = 4, 
        backoff = @Backoff(delay = 1000)
    )
    public AgentResponse sendMessage(String sessionId, String message, String channel) {
        try {
            String url = properties.getBaseUrl() + "/api/message";

            // 構(gòu)建請(qǐng)求體
            Map requestBody = new HashMap<>();
            requestBody.put("channel", channel != null ? channel : "api");
            requestBody.put("to", sessionId);
            requestBody.put("message", message);
            requestBody.put("stream", false); // 企業(yè)級(jí)建議先關(guān)流式,便于監(jiān)控

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            if (properties.getApiKey() != null) {
                headers.set("Authorization", "Bearer " + properties.getApiKey());
            }

            HttpEntity> entity = new HttpEntity<>(requestBody, headers);

            ResponseEntity response = restTemplate.postForEntity(
                url, entity, String.class
            );

            if (response.getStatusCode().is2xxSuccessful()) {
                JsonNode jsonNode = objectMapper.readTree(response.getBody());
                return new AgentResponse(
                    jsonNode.get("messageId").asText(),
                    jsonNode.get("content").asText(),
                    jsonNode.get("sessionKey").asText()
                );
            } else {
                throw new OpenClawException("OpenClaw 返回異常狀態(tài): " + response.getStatusCode());
            }

        } catch (Exception e) {
            throw new OpenClawException("調(diào)用 Agent 失敗: " + e.getMessage(), e);
        }
    }

    /**
     * 健康檢查
     * 對(duì)應(yīng) GET /api/status
     */
    public boolean isHealthy() {
        try {
            String url = properties.getBaseUrl() + "/api/status";
            ResponseEntity response = restTemplate.getForEntity(url, String.class);
            return response.getStatusCode().is2xxSuccessful();
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 獲取活躍會(huì)話列表
     * 對(duì)應(yīng) GET /api/sessions
     */
    public List getActiveSessions() {
        String url = properties.getBaseUrl() + "/api/sessions";
        ResponseEntity response = restTemplate.getForEntity(url, String.class);

        List sessions = new ArrayList<>();
        try {
            JsonNode root = objectMapper.readTree(response.getBody());
            JsonNode sessionsNode = root.get("sessions");
            for (JsonNode s : sessionsNode) {
                sessions.add(new SessionInfo(
                    s.get("key").asText(),
                    s.get("messageCount").asInt()
                ));
            }
        } catch (Exception e) {
            throw new OpenClawException("解析會(huì)話列表失敗", e);
        }
        return sessions;
    }
}

5.3 領(lǐng)域模型定義

public class AgentResponse {
    private String messageId;
    private String content;
    private String sessionKey;

    public AgentResponse(String messageId, String content, String sessionKey) {
        this.messageId = messageId;
        this.content = content;
        this.sessionKey = sessionKey;
    }

    // Getters...
}

public class SessionInfo {
    private String sessionKey;
    private int messageCount;

    public SessionInfo(String sessionKey, int messageCount) {
        this.sessionKey = sessionKey;
        this.messageCount = messageCount;
    }

    // Getters...
}

public class OpenClawException extends RuntimeException {
    public OpenClawException(String message) {
        super(message);
    }

    public OpenClawException(String message, Throwable cause) {
        super(message, cause);
    }
}

5.4 業(yè)務(wù)層 Service:讓 AI 幫你審單

假設(shè)你有一個(gè)電商系統(tǒng),想做一個(gè)"智能審單助手",讓 AI 自動(dòng)審核訂單備注里的特殊要求是否合理:

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderAuditService {
    private final OpenClawClient openClawClient;
    private final OrderRepository orderRepository;

    public OrderAuditService(OpenClawClient openClawClient, OrderRepository orderRepository) {
        this.openClawClient = openClawClient;
        this.orderRepository = orderRepository;
    }

    /**
     * 使用 Agent 審核訂單
     * 業(yè)務(wù)邏輯完全在 Java 層控制,AI 只負(fù)責(zé)理解語(yǔ)義并給出建議
     */
    @Transactional
    public AuditResult auditOrder(Long orderId) {
        // 1. 查出訂單
        Order order = orderRepository.findById(orderId)
            .orElseThrow(() -> new OrderNotFoundException(orderId));

        // 2. 構(gòu)造給 AI 的提示詞(Prompt Engineering)
        String prompt = buildAuditPrompt(order);

        // 3. 調(diào)用 OpenClaw,指定使用"審單專家"這個(gè) Agent 配置
        String sessionId = "order_audit_" + orderId;
        AgentResponse response = openClawClient.sendMessage(
            sessionId, 
            prompt, 
            "api"
        );

        // 4. 解析 AI 返回的結(jié)構(gòu)化結(jié)果
        AuditDecision decision = parseAiResponse(response.getContent());

        // 5. 業(yè)務(wù)決策權(quán)在 Java 手里,AI 只是參謀
        if (decision.isApproved()) {
            order.setStatus("APPROVED");
            order.setAiSuggestion(decision.getReason());
        } else {
            order.setStatus("NEED_REVIEW");
            order.setAiWarning(decision.getRiskPoint());
        }

        orderRepository.save(order);

        return new AuditResult(orderId, order.getStatus(), decision.getReason());
    }

    private String buildAuditPrompt(Order order) {
        return String.format("""
            請(qǐng)審核以下電商訂單的特殊要求,判斷是否存在潛在履約風(fēng)險(xiǎn):

            訂單號(hào):%s
            商品:%s
            用戶備注:"%s"
            歷史退貨率:%.2f%%

            請(qǐng)以 JSON 格式返回:
            {
                "approved": true/false,
                "reason": "通過(guò)/拒絕的具體原因",
                "riskLevel": "high/medium/low"
            }
            """, 
            order.getOrderNo(),
            order.getProductName(),
            order.getUserRemark(),
            order.getUserReturnRate() * 100
        );
    }

    private AuditDecision parseAiResponse(String aiContent) {
        // 這里用 Jackson 解析 AI 返回的 JSON
        // 實(shí)際生產(chǎn)建議加 try-catch,防止 AI 偶爾抽風(fēng)返回非 JSON 格式
        try {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = mapper.readTree(aiContent);
            return new AuditDecision(
                node.get("approved").asBoolean(),
                node.get("reason").asText(),
                node.get("riskLevel").asText()
            );
        } catch (Exception e) {
            // 如果 AI 返回格式不對(duì),默認(rèn)轉(zhuǎn)人工
            return new AuditDecision(false, "AI 解析異常,轉(zhuǎn)人工審核", "high");
        }
    }
}

六、企業(yè)級(jí)落地的五個(gè)關(guān)鍵細(xì)節(jié)

把代碼跑通只是第一步,上生產(chǎn)環(huán)境還得考慮這些事:

6.1 連接池與并發(fā)控制

OpenClaw 單機(jī)默認(rèn)并發(fā)處理能力有限(取決于你配的模型 API 的速率限制)。Java 層要用線程池保護(hù)下游:

@Bean
public ThreadPoolTaskExecutor openclawExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(20);
    executor.setQueueCapacity(100);
    executor.setThreadNamePrefix("openclaw-");
    // 拒絕策略:caller runs,防止雪崩
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    return executor;
}

6.2 超時(shí)與熔斷

AI 模型有時(shí)候推理會(huì)很慢(特別是處理長(zhǎng)文本時(shí)),Java 層要設(shè)置合理的讀取超時(shí),并結(jié)合 Resilience4j 做熔斷:

// 熔斷配置:連續(xù) 5 次失敗,10 秒內(nèi)直接拋異常,不再調(diào)用
@CircuitBreaker(name = "openclaw", fallbackMethod = "fallbackAudit")
public AgentResponse sendMessage(String sessionId, String message, String channel) {
    // ... 實(shí)現(xiàn)
}

public AgentResponse fallbackAudit(String sessionId, String message, String channel, Exception ex) {
    log.warn("OpenClaw 服務(wù)熔斷,轉(zhuǎn)人工處理");
    return AgentResponse.fallback("系統(tǒng)繁忙,請(qǐng)稍后重試");
}

6.3 會(huì)話隔離

OpenClaw 有記憶功能,但企業(yè)場(chǎng)景要注意會(huì)話隔離。不能讓 A 用戶看到 B 用戶的上下文。建議用 userId + 業(yè)務(wù)類型 作為 sessionKey:

String sessionId = String.format("user_%s_biz_%s", userId, businessType);

6.4 成本監(jiān)控

大模型 API 是按 Token 收費(fèi)的,Java 層要埋點(diǎn)統(tǒng)計(jì)每個(gè)接口調(diào)用的 Token 消耗。OpenClaw 的 API 響應(yīng)里通常包含 usage 字段:

// 在 OpenClawClient 里解析 usage 并上報(bào) Micrometer/Prometheus
int promptTokens = jsonNode.get("usage").get("prompt_tokens").asInt();
int completionTokens = jsonNode.get("usage").get("completion_tokens").asInt();
meterRegistry.counter("openclaw.tokens.used").increment(promptTokens + completionTokens);

6.5 審計(jì)日志

誰(shuí)、在什么時(shí)間、問(wèn)了 AI 什么問(wèn)題、AI 怎么回答的——這些在金融、醫(yī)療行業(yè)是必須留痕的。建議用攔截器或 AOP 統(tǒng)一記錄:

@Aspect
@Component
public class OpenClawAuditAspect {
    @Around("@annotation(OpenClawAudit)")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        // 記錄請(qǐng)求參數(shù)...
        Object result = point.proceed();
        // 記錄響應(yīng)結(jié)果...
        // 存入 Elasticsearch 或數(shù)據(jù)庫(kù)
        return result;
    }
}

七、能玩出什么花樣?三個(gè)真實(shí)場(chǎng)景

光寫(xiě)代碼沒(méi)意思,關(guān)鍵是解決業(yè)務(wù)問(wèn)題。這里舉三個(gè)在 2026 年已經(jīng)落地的場(chǎng)景:

場(chǎng)景一:智能客服質(zhì)檢
傳統(tǒng)做法是雇傭 20 個(gè)人聽(tīng)錄音打分?,F(xiàn)在用 Java 調(diào)度 OpenClaw,自動(dòng)分析客服對(duì)話記錄,檢測(cè)是否有違規(guī)承諾、態(tài)度不佳等問(wèn)題。Java 負(fù)責(zé)從 CRM 拉取數(shù)據(jù),OpenClaw 負(fù)責(zé)理解對(duì)話語(yǔ)義,兩者通過(guò) REST API 配合,質(zhì)檢成本降低 80%。

場(chǎng)景二:代碼審查助手
在 CI/CD 流程中,Java 服務(wù)收到 Git 的 Webhook 后,調(diào)用 OpenClaw 分析 Pull Request 的代碼 diff。AI 檢查是否有潛在 NPE、SQL 注入風(fēng)險(xiǎn),然后在 GitLab 上自動(dòng)評(píng)論。Java 層控制審查策略(比如只檢查核心模塊),AI 負(fù)責(zé)具體的代碼理解。

場(chǎng)景三:跨部門(mén)數(shù)據(jù)搬運(yùn)
銷售部門(mén)用飛書(shū),技術(shù)部門(mén)用 Jira,財(cái)務(wù)部門(mén)用金蝶。傳統(tǒng)對(duì)接需要寫(xiě)一堆 ETL 腳本?,F(xiàn)在用 OpenClaw 做"智能中間人":銷售在飛書(shū)說(shuō)"幫我把昨天的大單同步到 Jira 并通知財(cái)務(wù)",OpenClaw 理解意圖后調(diào)用 Java 提供的業(yè)務(wù) API(查訂單、建 Jira Ticket、發(fā)通知),Java 保證事務(wù)一致性,AI 負(fù)責(zé)理解"大單"到底是多大。

八、總結(jié):Java 程序員終于不用羨慕 Python 了

OpenClaw 的價(jià)值,在于它把 AI 能力"微服務(wù)化"了。它不提供 Python SDK 讓你入侵業(yè)務(wù)代碼,而是乖乖地通過(guò) HTTP 接口提供服務(wù)。這給了 Java 后端程序員架構(gòu)上的主導(dǎo)權(quán):

  • 你可以把它當(dāng)成一個(gè)特殊的下游服務(wù),用你熟悉的服務(wù)治理手段去管理;
  • 你可以繼續(xù)用 Spring Security 做權(quán)限,用 Seata 做分布式事務(wù),用 SkyWalking 做鏈路追蹤;
  • 哪天 OpenClaw 不好用了,你可以隨時(shí)換成其他 Agent 框架,只要接口兼容,Java 代碼不用大改。

記住這個(gè)公式:Java 管業(yè)務(wù),OpenClaw 管智能,HTTP 管通信。把這層關(guān)系理清楚,你就能在企業(yè)級(jí)場(chǎng)景下穩(wěn)健地落地 AI 自動(dòng)化,而不是搞個(gè)玩具 Demo 交差。

最后提醒一句:OpenClaw 作為開(kāi)源項(xiàng)目,更新迭代很快,部署前記得查閱當(dāng)時(shí)的最新文檔,別把 2026 年 3 月的代碼原封不動(dòng)套到 2027 年的版本上。

以上就是基于Java+OpenClaw實(shí)現(xiàn)企業(yè)級(jí)智能體自動(dòng)化的詳細(xì)內(nèi)容,更多關(guān)于Java OpenClaw企業(yè)級(jí)智能體自動(dòng)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java獲取用戶IP屬地模擬抖音詳解

    Java獲取用戶IP屬地模擬抖音詳解

    細(xì)心的小伙伴可能會(huì)發(fā)現(xiàn),抖音新上線了 IP 屬地的功能,小伙伴在發(fā)表動(dòng)態(tài)、發(fā)表評(píng)論以及聊天的時(shí)候,都會(huì)顯示自己的 IP 屬地信息,本篇文章我們來(lái)模擬實(shí)現(xiàn)這一功能
    2022-07-07
  • Java實(shí)現(xiàn)表白小程序

    Java實(shí)現(xiàn)表白小程序

    本文講述了Java實(shí)現(xiàn)表白的代碼實(shí)例。具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過(guò)來(lái)看看吧,具體如下:
    2018-05-05
  • 教你Spring Cloud保證各個(gè)微服務(wù)之間調(diào)用安全性

    教你Spring Cloud保證各個(gè)微服務(wù)之間調(diào)用安全性

    在微服務(wù)的架構(gòu)下,系統(tǒng)會(huì)根據(jù)業(yè)務(wù)拆分為多個(gè)服務(wù),各自負(fù)責(zé)單一的職責(zé),在這樣的架構(gòu)下,我們需要確保各api的安全性,今天通過(guò)本文給大家分享Spring Cloud中如何保證各個(gè)微服務(wù)之間調(diào)用的安全性,需要的朋友參考下吧
    2021-08-08
  • Java中的這些騷操作你不能不知道!!!

    Java中的這些騷操作你不能不知道!!!

    今天在看python相關(guān)的東西,看到各種騷操作,回頭想了下Java有沒(méi)有什么騷操作,整理下面幾種,一起看一下吧,希望能給你帶來(lái)幫助
    2021-07-07
  • Java調(diào)用計(jì)算機(jī)攝像頭拍照實(shí)現(xiàn)過(guò)程解析

    Java調(diào)用計(jì)算機(jī)攝像頭拍照實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Java調(diào)用計(jì)算機(jī)攝像頭拍照實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 解決@RequestBody部分屬性丟失的問(wèn)題

    解決@RequestBody部分屬性丟失的問(wèn)題

    這篇文章主要介紹了解決@RequestBody部分屬性丟失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門(mén)教程

    Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門(mén)教程

    這篇文章主要介紹了Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門(mén)教程,包括基于TCP/IP和UDP協(xié)議的簡(jiǎn)單實(shí)例程序講解,需要的朋友可以參考下
    2016-01-01
  • Java全面解析XML格式串(JDOM解析)

    Java全面解析XML格式串(JDOM解析)

    下面小編就為大家?guī)?lái)一篇Java全面解析XML格式串(JDOM解析)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • Java實(shí)現(xiàn)字符串反轉(zhuǎn)

    Java實(shí)現(xiàn)字符串反轉(zhuǎn)

    這篇文章介紹了Java實(shí)現(xiàn)字符串反轉(zhuǎn)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • log4j如何根據(jù)變量動(dòng)態(tài)生成文件名

    log4j如何根據(jù)變量動(dòng)態(tài)生成文件名

    這篇文章主要介紹了log4j如何根據(jù)變量動(dòng)態(tài)生成文件名方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論

榆树市| 江华| 五台县| 泗水县| 方城县| 托克托县| 通辽市| 梨树县| 封开县| 山阳县| 瑞丽市| 左贡县| 宾川县| 宣恩县| 临猗县| 常州市| 洞头县| 永川市| 揭西县| 大埔县| 弋阳县| 增城市| 佳木斯市| 金山区| 民和| 车致| 呼图壁县| 灵台县| 黎川县| 额敏县| 荥经县| 尉犁县| 重庆市| 故城县| 左贡县| 长宁区| 利津县| 黄平县| 望奎县| 泰宁县| 荔浦县|