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

java序列化的種類和使用場景詳解

 更新時(shí)間:2025年01月11日 09:43:29   作者:CC大煊  
本文詳細(xì)介紹了序列化的概念、Java內(nèi)置序列化、自定義序列化、第三方序列化框架(如Kryo、Protobuf)以及在分布式系統(tǒng)和RPC框架中的應(yīng)用,通過比較不同序列化方式的優(yōu)缺點(diǎn),指導(dǎo)開發(fā)者選擇合適的序列化方案,以確保系統(tǒng)的性能、安全性和可維護(hù)性

序列化概述

什么是序列化?

序列化是將對象的狀態(tài)轉(zhuǎn)換為字節(jié)流的過程,以便可以將對象存儲(chǔ)到文件、數(shù)據(jù)庫,或者通過網(wǎng)絡(luò)傳輸。反序列化則是將字節(jié)流轉(zhuǎn)換回對象的過程。

這一過程使得數(shù)據(jù)可以在不同的計(jì)算機(jī)系統(tǒng)之間傳遞,或者在程序的不同運(yùn)行時(shí)之間持久化。

序列化的作用

  1. 持久化:將對象的狀態(tài)保存到存儲(chǔ)介質(zhì)中,以便在需要時(shí)恢復(fù)。
  2. 網(wǎng)絡(luò)傳輸:在分布式系統(tǒng)中,通過網(wǎng)絡(luò)將對象從一個(gè)應(yīng)用傳輸?shù)搅硪粋€(gè)應(yīng)用。
  3. 深度復(fù)制:通過序列化和反序列化實(shí)現(xiàn)對象的深度復(fù)制。
  4. 緩存:將對象序列化后存儲(chǔ)在緩存中,以便快速檢索。
  5. 分布式計(jì)算:在微服務(wù)架構(gòu)中,服務(wù)之間需要傳遞復(fù)雜的數(shù)據(jù)結(jié)構(gòu),序列化可以有效地實(shí)現(xiàn)這一點(diǎn)。

Java內(nèi)置序列化

java.io.Serializable接口

  • 定義Serializable是一個(gè)標(biāo)記接口,用于指示一個(gè)類的對象可以被序列化。
  • 實(shí)現(xiàn):任何需要序列化的類都必須實(shí)現(xiàn)這個(gè)接口。沒有方法需要實(shí)現(xiàn),只需聲明即可。

使用ObjectOutputStream和ObjectInputStream

序列化對象

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.dat"))) {
    out.writeObject(yourObject);
} catch (IOException e) {
    e.printStackTrace();
}

反序列化對象

try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.dat"))) {
    YourClass yourObject = (YourClass) in.readObject();
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn)

  • 簡單易用:通過實(shí)現(xiàn)Serializable接口即可實(shí)現(xiàn)序列化。
  • 內(nèi)置支持:Java標(biāo)準(zhǔn)庫自帶,無需額外依賴。

缺點(diǎn)

  • 性能較差:序列化后的數(shù)據(jù)體積較大,速度較慢。
  • 不靈活:無法輕松控制序列化過程,如字段排除。
  • 不兼容性:類結(jié)構(gòu)變化(如字段增加或刪除)可能導(dǎo)致反序列化失敗。
  • 安全問題:可能導(dǎo)致反序列化漏洞,需要謹(jǐn)慎處理。

自定義序列化

實(shí)現(xiàn)Externalizable接口

定義Externalizable接口擴(kuò)展了Serializable接口,允許開發(fā)者完全控制序列化和反序列化過程。

方法

  • writeExternal(ObjectOutput out): 自定義對象的序列化過程。
  • readExternal(ObjectInput in): 自定義對象的反序列化過程。

自定義序列化方法

實(shí)現(xiàn)示例

public class CustomObject implements Externalizable {
    private String name;
    private int age;

    public CustomObject() {
        // 必須提供無參數(shù)構(gòu)造函數(shù)
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);
        out.writeInt(age);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name = (String) in.readObject();
        age = in.readInt();
    }
}

適用場景

  • 需要完全控制序列化過程:當(dāng)需要對序列化的格式進(jìn)行精細(xì)控制時(shí)。
  • 性能優(yōu)化:可以通過自定義序列化邏輯,減少序列化后的數(shù)據(jù)大小或提高速度。
  • 兼容性要求:在類結(jié)構(gòu)變化時(shí),能夠通過自定義邏輯保持兼容性。
  • 安全性需求:通過自定義序列化過程,可以增加安全檢查或過濾敏感信息。

第三方序列化框架

Kryo

特點(diǎn)與優(yōu)勢

  • 高性能:Kryo提供快速的序列化和反序列化速度。
  • 高效的空間利用:生成的序列化數(shù)據(jù)較小。
  • 支持多種數(shù)據(jù)結(jié)構(gòu):可以序列化復(fù)雜的對象圖。

使用示例

Kryo kryo = new Kryo();
Output output = new Output(new FileOutputStream("file.bin"));
kryo.writeObject(output, yourObject);
output.close();

Input input = new Input(new FileInputStream("file.bin"));
YourClass yourObject = kryo.readObject(input, YourClass.class);
input.close();

Protobuf (Google Protocol Buffers)

簡介

  • 語言中立、平臺(tái)中立的可擴(kuò)展機(jī)制,用于序列化結(jié)構(gòu)化數(shù)據(jù)。
  • 適用于數(shù)據(jù)存儲(chǔ)和通信協(xié)議。

使用示例

定義.proto文件:

syntax = "proto3";

message Person {
  string name = 1;
  int32 age = 2;
}

生成Java類,并使用:

Person person = Person.newBuilder().setName("John").setAge(30).build();
FileOutputStream output = new FileOutputStream("person.bin");
person.writeTo(output);
output.close();

FileInputStream input = new FileInputStream("person.bin");
Person person = Person.parseFrom(input);
input.close();

Jackson

JSON序列化與反序列化

  • 提供簡單易用的API來處理JSON數(shù)據(jù)。
  • 支持廣泛的Java對象類型。

使用示例

ObjectMapper objectMapper = new ObjectMapper();

// 序列化
String jsonString = objectMapper.writeValueAsString(yourObject);

// 反序列化
YourClass yourObject = objectMapper.readValue(jsonString, YourClass.class);

gRPC中的序列化

gRPC簡介

定義:gRPC是由Google開發(fā)的高性能、開源的遠(yuǎn)程過程調(diào)用(RPC)框架。

特點(diǎn)

  • 支持多種語言。
  • 基于HTTP/2協(xié)議,支持雙向流、并發(fā)請求。
  • 提供負(fù)載均衡、認(rèn)證、追蹤等特性。

Protobuf在gRPC中的應(yīng)用

角色:Protobuf是gRPC的默認(rèn)接口定義語言(IDL),用于定義服務(wù)和消息格式。

使用步驟

定義服務(wù)和消息

syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

生成代碼:使用protoc編譯器生成客戶端和服務(wù)器端代碼。

實(shí)現(xiàn)服務(wù)邏輯

public class GreeterImpl extends GreeterGrpc.GreeterImplBase {
    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloResponse> responseObserver) {
        HelloResponse response = HelloResponse.newBuilder()
            .setMessage("Hello, " + req.getName())
            .build();
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}

gRPC序列化的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 高效:Protobuf序列化格式緊湊,適合網(wǎng)絡(luò)傳輸。
  • 跨語言支持:支持多種編程語言,便于構(gòu)建多語言系統(tǒng)。
  • 強(qiáng)類型:IDL定義明確,減少通信錯(cuò)誤。

缺點(diǎn)

  • 學(xué)習(xí)曲線:需要學(xué)習(xí)和配置Protobuf和gRPC。
  • 二進(jìn)制格式:不如JSON易于調(diào)試和閱讀。
  • 依賴生成工具:需要依賴protoc工具生成代碼。

gRPC結(jié)合Protobuf提供了一種高效、靈活的遠(yuǎn)程調(diào)用解決方案,適用于需要高性能和跨語言支持的系統(tǒng)。

Dubbo的默認(rèn)序列化

Dubbo簡介

定義:Dubbo是阿里巴巴開源的高性能Java RPC框架。

特點(diǎn)

  • 提供服務(wù)治理、負(fù)載均衡、自動(dòng)服務(wù)注冊與發(fā)現(xiàn)。
  • 支持多種協(xié)議和序列化方式。

Dubbo支持的序列化方式

  • Hessian:默認(rèn)序列化方式,支持跨語言。
  • Java序列化:使用Java自帶的序列化機(jī)制。
  • JSON:用于輕量級(jí)數(shù)據(jù)傳輸。
  • Protobuf:高效的二進(jìn)制序列化格式。
  • Kryo:高性能和高效空間利用的序列化方案。

默認(rèn)序列化機(jī)制及其應(yīng)用

Hessian序列化

  • 特點(diǎn):支持跨語言,序列化數(shù)據(jù)緊湊。
  • 應(yīng)用:適用于需要跨語言調(diào)用的場景,尤其是Java到其他語言的通信。

使用示例

在Dubbo中,配置序列化方式非常簡單,可以在服務(wù)提供者或消費(fèi)者的配置中指定:

<dubbo:protocol name="dubbo" serialization="hessian2"/>

優(yōu)點(diǎn)

  • 跨語言支持:Hessian支持多種語言實(shí)現(xiàn)。
  • 易用性:Dubbo默認(rèn)配置,開箱即用。

缺點(diǎn)

  • 性能:相比于Protobuf或Kryo,性能可能稍遜。
  • 可讀性:二進(jìn)制格式不易于調(diào)試。

Dubbo的默認(rèn)序列化機(jī)制通過Hessian提供了良好的跨語言支持和易用性,適合大多數(shù)分布式系統(tǒng)的需求。

序列化的注意事項(xiàng)

序列化的安全性

風(fēng)險(xiǎn)

  • 反序列化漏洞:攻擊者可能通過惡意構(gòu)造的字節(jié)流執(zhí)行任意代碼。
  • 數(shù)據(jù)泄露:未加密的序列化數(shù)據(jù)可能被竊取。

防護(hù)措施

  • 白名單機(jī)制:限制反序列化的類。
  • 使用安全庫:選擇安全性更高的序列化框架,如Protobuf。
  • 數(shù)據(jù)加密:對序列化數(shù)據(jù)進(jìn)行加密傳輸。

版本兼容性問題

挑戰(zhàn)

  • 序列化格式變更可能導(dǎo)致舊版客戶端或服務(wù)端無法解析新格式。

解決方案

  • 向后兼容:在Protobuf中使用optional字段。
  • 版本管理:維護(hù)良好的版本控制策略,使用版本號(hào)來管理不同的序列化格式。
  • 默認(rèn)值:為新增字段提供默認(rèn)值,避免解析錯(cuò)誤。

性能考慮

影響因素

  • 序列化和反序列化的速度。
  • 序列化數(shù)據(jù)的大小。

優(yōu)化策略

  • 選擇高效框架:如Kryo或Protobuf。
  • 減少數(shù)據(jù)量:僅序列化必要的數(shù)據(jù)。
  • 批量處理:合并多條消息,減少網(wǎng)絡(luò)開銷。

在設(shè)計(jì)和實(shí)現(xiàn)序列化機(jī)制時(shí),需綜合考慮安全性、版本兼容性和性能,以確保系統(tǒng)的穩(wěn)定性和高效性。

序列化在實(shí)際應(yīng)用中的場景

網(wǎng)絡(luò)傳輸

場景:在客戶端和服務(wù)器之間交換數(shù)據(jù)。

應(yīng)用

  • RPC框架:如Dubbo、gRPC使用序列化進(jìn)行遠(yuǎn)程方法調(diào)用。
  • 消息隊(duì)列:Kafka、RabbitMQ等將消息序列化后傳輸。

考慮

  • 選擇高效的序列化方式以減少帶寬占用和提高傳輸速度。

數(shù)據(jù)持久化

場景:將對象狀態(tài)保存到存儲(chǔ)介質(zhì)。

應(yīng)用

  • 數(shù)據(jù)庫存儲(chǔ):將復(fù)雜對象序列化后存儲(chǔ)在數(shù)據(jù)庫中。
  • 文件存儲(chǔ):將對象序列化為文件格式,如JSON或XML。

考慮

  • 需要確保序列化格式的穩(wěn)定性和可讀性,以便于后續(xù)的數(shù)據(jù)恢復(fù)和處理。

分布式系統(tǒng)中的應(yīng)用

場景:在不同節(jié)點(diǎn)之間共享數(shù)據(jù)。

應(yīng)用

  • 緩存系統(tǒng):如Redis,將對象序列化后存儲(chǔ)以提高訪問速度。
  • 微服務(wù)通信:服務(wù)之間通過序列化數(shù)據(jù)進(jìn)行交互。

考慮

  • 需要確保序列化格式的兼容性和一致性,以支持不同版本的服務(wù)之間的通信。

高性能RPC框架設(shè)計(jì)

RPC框架的基本原理

定義:遠(yuǎn)程過程調(diào)用(RPC)允許程序調(diào)用不同地址空間中的函數(shù),就像調(diào)用本地函數(shù)一樣。

組成部分

  • 客戶端和服務(wù)端:客戶端發(fā)起請求,服務(wù)端處理請求并返回結(jié)果。
  • 通信協(xié)議:定義消息格式和傳輸規(guī)則(如HTTP/2、gRPC)。
  • 序列化機(jī)制:將請求和響應(yīng)對象轉(zhuǎn)換為字節(jié)流(如Protobuf)。
  • 服務(wù)注冊與發(fā)現(xiàn):通過服務(wù)注冊中心管理和發(fā)現(xiàn)服務(wù)實(shí)例。

如何在10萬QPS下實(shí)現(xiàn)毫秒級(jí)服務(wù)調(diào)用

高效網(wǎng)絡(luò)協(xié)議:使用低開銷協(xié)議,如HTTP/2或自定義的二進(jìn)制協(xié)議,減少網(wǎng)絡(luò)傳輸時(shí)間。

異步IO:利用Netty等框架實(shí)現(xiàn)非阻塞IO,提高并發(fā)處理能力。

連接池:維護(hù)長連接池,減少連接建立和關(guān)閉的開銷。

負(fù)載均衡:在客戶端和服務(wù)端之間分配請求,避免單點(diǎn)過載。

緩存:在客戶端或服務(wù)端緩存常用數(shù)據(jù),減少重復(fù)計(jì)算和傳輸。

性能優(yōu)化策略

序列化優(yōu)化

  • 使用高效的序列化格式(如Protobuf、Kryo)降低序列化和反序列化的開銷。
  • 只序列化必要的數(shù)據(jù),減少數(shù)據(jù)包大小。

線程模型優(yōu)化

  • 使用線程池管理請求處理,避免頻繁創(chuàng)建和銷毀線程。
  • 采用事件驅(qū)動(dòng)模型(如Reactor模式)處理高并發(fā)請求。

資源管理

  • 內(nèi)存管理:使用對象池減少GC壓力。
  • 連接管理:優(yōu)化連接復(fù)用和斷開策略。

監(jiān)控和調(diào)優(yōu)

  • 實(shí)時(shí)監(jiān)控系統(tǒng)性能指標(biāo),及時(shí)發(fā)現(xiàn)瓶頸。
  • 通過壓測和分析進(jìn)行持續(xù)優(yōu)化。

Netty中的序列化

Netty是一個(gè)高性能的網(wǎng)絡(luò)應(yīng)用框架,廣泛用于構(gòu)建高并發(fā)的網(wǎng)絡(luò)服務(wù)。序列化在Netty中扮演著重要角色,幫助將數(shù)據(jù)對象轉(zhuǎn)化為字節(jié)流進(jìn)行網(wǎng)絡(luò)傳輸。以下是Netty中常用的序列化方法和實(shí)現(xiàn)。

Netty本身沒有默認(rèn)的序列化方式。它提供了靈活的機(jī)制,允許開發(fā)者根據(jù)需要選擇和實(shí)現(xiàn)自己的序列化方式。通過合理選擇和優(yōu)化序列化方式,可以顯著提升應(yīng)用的性能和可靠性。

常用序列化方法

Java原生序列化

  • 實(shí)現(xiàn):使用ObjectInputStreamObjectOutputStream。
  • 優(yōu)點(diǎn):簡單易用。
  • 缺點(diǎn):性能較低,序列化后的數(shù)據(jù)較大。

Protobuf(Protocol Buffers)

  • 實(shí)現(xiàn):通過定義.proto文件生成Java類。
  • 優(yōu)點(diǎn):高效、跨語言支持、數(shù)據(jù)結(jié)構(gòu)清晰。
  • 缺點(diǎn):需要編寫和維護(hù).proto文件。

JSON

  • 實(shí)現(xiàn):使用Jackson或Gson等庫。
  • 優(yōu)點(diǎn):可讀性好,易于調(diào)試。
  • 缺點(diǎn):性能相對較低,數(shù)據(jù)體積較大。

Kryo

  • 實(shí)現(xiàn):使用Kryo庫進(jìn)行序列化。
  • 優(yōu)點(diǎn):高效、支持復(fù)雜對象。
  • 缺點(diǎn):需要手動(dòng)注冊類,可能不適合所有對象。

Netty中的序列化實(shí)現(xiàn)

編碼器與解碼器

  • Netty通過ChannelHandler中的EncoderDecoder實(shí)現(xiàn)序列化和反序列化。
  • 例如,ProtobufEncoderProtobufDecoder用于處理Protobuf格式的數(shù)據(jù)。

自定義序列化

  • 可以通過實(shí)現(xiàn)MessageToByteEncoderByteToMessageDecoder接口來自定義序列化邏輯。
  • 這允許開發(fā)者根據(jù)特定需求優(yōu)化序列化過程。

使用Java原生序列化

依賴

確保你的項(xiàng)目中包含Netty的依賴。

示例代碼

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;

import java.io.Serializable;

// 定義一個(gè)可序列化的對象
class MyObject implements Serializable {
    private static final long serialVersionUID = 1L;
    private String message;

    public MyObject(String message) {
        this.message = message;
    }

    @Override
    public String toString() {
        return "MyObject{" +
                "message='" + message + '\'' +
                '}';
    }
}

// 服務(wù)器處理器
class ServerHandler extends SimpleChannelInboundHandler<MyObject> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MyObject msg) throws Exception {
        System.out.println("Received: " + msg);
        // Echo the received object back to the client
        ctx.writeAndFlush(msg);
    }
}

// 服務(wù)器啟動(dòng)類
public class NettyServer {
    public static void main(String[] args) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
                        ChannelPipeline p = ch.pipeline();
                        p.addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(null)));
                        p.addLast(new ObjectEncoder());
                        p.addLast(new ServerHandler());
                    }
                });

            ChannelFuture f = b.bind(8080).sync();
            f.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

注意事項(xiàng)

  • 性能:Java原生序列化性能較低,適合簡單的測試和學(xué)習(xí)環(huán)境。在生產(chǎn)環(huán)境中,建議使用更高效的序列化方式,如Protobuf或Kryo。
  • 安全性:Java原生序列化可能存在安全問題,特別是反序列化時(shí)。確保只反序列化來自可信源的數(shù)據(jù)。

通過Netty的ObjectEncoderObjectDecoder,可以輕松實(shí)現(xiàn)Java對象的序列化和反序列化。根據(jù)需求選擇合適的序列化方式以優(yōu)化性能和安全性。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文帶你搞懂java中的統(tǒng)一異常處理

    一文帶你搞懂java中的統(tǒng)一異常處理

    這篇文章主要為大家詳細(xì)介紹了java中的異常處理以及統(tǒng)一異常結(jié)果處理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-02-02
  • Java程序生成Access文件代碼實(shí)例

    Java程序生成Access文件代碼實(shí)例

    這篇文章主要介紹了Java程序生成Access文件代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • EasyExcel核心實(shí)戰(zhàn)之Excel合并單元格,在線編輯與導(dǎo)出全攻略

    EasyExcel核心實(shí)戰(zhàn)之Excel合并單元格,在線編輯與導(dǎo)出全攻略

    在日常業(yè)務(wù)開發(fā)中,Excel?報(bào)表三個(gè)字往往意味著復(fù)雜、凌亂和無限的加班,本文提供了一套完整的?EasyExcel?解決方案,涵蓋三大核心場景,?即合并單元格,在線編輯和數(shù)據(jù)導(dǎo)出,感興趣的小伙伴可以了解下
    2026-05-05
  • java地理坐標(biāo)系及投影間轉(zhuǎn)換代碼示例

    java地理坐標(biāo)系及投影間轉(zhuǎn)換代碼示例

    在地圖投影中,經(jīng)常需要將坐標(biāo)從不同的坐標(biāo)系之間進(jìn)行轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于java地理坐標(biāo)系及投影間轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • Servlet會(huì)話技術(shù)基礎(chǔ)解析

    Servlet會(huì)話技術(shù)基礎(chǔ)解析

    這篇文章主要介紹了Servlet會(huì)話技術(shù)基礎(chǔ)解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java中ArrayList類的源碼解析

    Java中ArrayList類的源碼解析

    本文主要介紹了Java中ArrayList類的源碼解析,具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • SpringCLoud搭建Zuul網(wǎng)關(guān)集群過程解析

    SpringCLoud搭建Zuul網(wǎng)關(guān)集群過程解析

    這篇文章主要介紹了SpringCLoud搭建Zuul網(wǎng)關(guān)集群過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • mybatis insert返回主鍵代碼實(shí)例

    mybatis insert返回主鍵代碼實(shí)例

    這篇文章主要介紹了mybatis insert返回主鍵代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 重新啟動(dòng)IDEA時(shí)maven項(xiàng)目SSM框架文件變色所有@注解失效

    重新啟動(dòng)IDEA時(shí)maven項(xiàng)目SSM框架文件變色所有@注解失效

    這篇文章主要介紹了重新啟動(dòng)IDEA時(shí)maven項(xiàng)目SSM框架文件變色所有@注解失效,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • SpringBoot中的@EnableConfigurationProperties注解原理及用法

    SpringBoot中的@EnableConfigurationProperties注解原理及用法

    在SpringBoot中,@EnableConfigurationProperties注解是一個(gè)非常有用的注解,它可以用于啟用對特定配置類的支持,在本文中,我們將深入探討@EnableConfigurationProperties注解,包括它的原理和如何使用,需要的朋友可以參考下
    2023-06-06

最新評論

麻栗坡县| 临海市| 喀喇| 桐庐县| 西和县| 开江县| 保德县| 建平县| 巴塘县| 赣州市| 临安市| 隆尧县| 花莲县| 高陵县| 吐鲁番市| 光山县| 江都市| 方正县| 静海县| 陇川县| 平阳县| 施秉县| 德保县| 金阳县| 南汇区| 西昌市| 大连市| 邻水| 兴安盟| 吉首市| 泽普县| 淮南市| 惠水县| 正定县| 北票市| 巨野县| 察雅县| 台南市| 南雄市| 鹤庆县| 赤城县|