亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

有經(jīng)驗(yàn)的JAVA開(kāi)發(fā)者有個(gè)特點(diǎn)是善于利用現(xiàn)有的輪子來(lái)構(gòu)建汽車,而不是反復(fù)造輪子。如今的Java生態(tài)系統(tǒng)已經(jīng)非常成熟。

在Java快速發(fā)展的幾十年中,涌現(xiàn)出許多優(yōu)秀的開(kāi)源項(xiàng)目。在大多數(shù)情況下,我們可以在開(kāi)源社區(qū)中找到合適的開(kāi)源庫(kù)。

許多開(kāi)發(fā)者已經(jīng)使用和測(cè)試了這些庫(kù),通常它們具有良好的性能和穩(wěn)定性。合理地使用這些優(yōu)秀的開(kāi)源組件可以節(jié)省大量時(shí)間,讓你有更多的時(shí)間去做其他事情。在本文中,將分享一些Java開(kāi)發(fā)者應(yīng)該熟悉的開(kāi)源類庫(kù)。

1 Orika

Orika是一個(gè)Java bean映射工具,可以遞歸地將數(shù)據(jù)從一個(gè)對(duì)象復(fù)制到另一個(gè)對(duì)象。在編寫代碼時(shí),我們通常會(huì)發(fā)現(xiàn)需要將對(duì)象轉(zhuǎn)換為不同的格式以適應(yīng)不同的API,例如將DTO轉(zhuǎn)換為POJO或POJO轉(zhuǎn)換為VO。通常,我們需要通過(guò)getter/setter完成此操作。Orika可以通過(guò)簡(jiǎn)單的代碼為您解決這個(gè)煩惱,而且性能損失不大。

Maven依賴項(xiàng):

<dependency>
    <groupId>ma.glasnost.orika</groupId>
    <artifactId>orika-core</artifactId>
    <version>1.4.6</version>
</dependency>

示例代碼:

public class UserVo {
    private String username;

    private String phone;

//省略getter/setter
}

public class User {
    private String username;

    private String phone;

//省略getter/setter
}

public class OrikaTest {

    public static void mAIn(String[] args) {
        User user = new User();
        user.setPhone("xxxxxx");
        user.setUsername("name");

        MApperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        UserVo userVo = mapperFactory.getMapperFacade().map(user, UserVo.class);
        System.out.println("the copy object: "+userVo);
    }
}

Orika不僅可以復(fù)制簡(jiǎn)單的Java對(duì)象,還可以復(fù)制集合。是不是很棒?

2 Caffeine

Caffeine是一個(gè)高性能的內(nèi)存緩存類庫(kù)。Caffeine使用W-TinyLFU算法,其讀寫性能比guava更優(yōu)秀。Spring 5已經(jīng)將緩存的默認(rèn)實(shí)現(xiàn)從guava改為了Caffeine。

Maven依賴項(xiàng):

<dependency>
    <groupId>com.Github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.9.0</version>
</dependency>

示例代碼:

Cache<String, String> cache = Caffeine.newBuilder()
                .maximumSize(10000)
                .expireAfterAccess(60, TimeUnit.SECONDS)
                //如果緩存為空,運(yùn)行以下表達(dá)式并將其存儲(chǔ)在緩存中
                .build(key-> key+"test");

        String key2="test2";
        cache.put("test", "cache");
        //獲取緩存值,如果為空,則返回null
        log.info("key present: [{}] -> [{}]", k, cache.getIfPresent(k));
        log.info("key present: [{}] -> [{}]", key2, cache.getIfPresent(key2));
        //移除緩存
        cache.invalidate(k);

3 Kryo

Kryo是一個(gè)快速高效的Java對(duì)象序列化框架,具有高性能、序列化流小和簡(jiǎn)單API等特點(diǎn)。目前,許多開(kāi)源項(xiàng)目都在使用Kryo,例如Apache Hive和Apache Spark。以下是Kryo和主要序列化框架的性能比較。



Maven依賴項(xiàng):

<dependency>
    <groupId>com.esotericsoftware</groupId>
    <artifactId>kryo</artifactId>
    <version>5.2.0</version>
</dependency>

示例代碼:

public class KryoSerializer {

    private KryoFactory factory =()->{
        Kryo kryo = new Kryo();
        kryo.setDefaultSerializer(CompatibleFieldSerializer.class);
        kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
        return kryo;
    };

    private KryoPool pool = new KryoPool.Builder(factory).softReferences().build();


    public byte[] serialize(Object object) {
        return pool.run(kryo -> {
            try(Output output = new Output(2048,-1)) {
                kryo.writeClassAndObject(output,object);
                output.flush();
                return output.toBytes();
            }
        });
    }


    public <T> T deserialize(byte[] data) {
        try(Input input = new Input(data)) {
            return pool.run(kryo -> ((T) kryo.readClassAndObject(input)));
        }
    }
}

4.NETty

Netty是一個(gè)異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架,可用于快速開(kāi)發(fā)和維護(hù)高性能協(xié)議服務(wù)器和客戶端。

在網(wǎng)絡(luò)編程領(lǐng)域,Netty絕對(duì)是占據(jù)主導(dǎo)地位的。基于Java NIO,Netty使用反應(yīng)器線程模型,將客戶端連接綁定到特定線程,以避免IO線程頻繁上下文切換。

Netty中的所有IO操作都是異步的,并具有超高的性能。許多開(kāi)源的Java項(xiàng)目都將Netty作為默認(rèn)的通信層框架,例如下面要提到的Zookeeper、Elasticsearch和redisson。

5 Redisson

Redisson采用基于NIO的Netty框架,不僅可以作為Redis的底層驅(qū)動(dòng)客戶端,還可以以同步、異步、異步流或管道形式發(fā)送Redis命令、執(zhí)行和處理Lua腳本以及處理返回結(jié)果。

在此基礎(chǔ)上,它還集成了更先進(jìn)的應(yīng)用解決方案,不僅將原生的Redis哈希、列表、集合、字符串和地理數(shù)據(jù)結(jié)構(gòu)封裝為Java中最熟悉的數(shù)據(jù)結(jié)構(gòu),還實(shí)現(xiàn)了分布式鎖等高級(jí)應(yīng)用場(chǎng)景。

Maven依賴項(xiàng):

<groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.16.2</version>
</dependency>

示例代碼:

//獲取和設(shè)置鍵值對(duì)
RBucket<String> nameRBucket =  redisson.getBucket("username");
nameRBucket.set("lance", 60, TimeUnit.SECONDS);
redisson.getBucket("username").get();

//操作哈希表
RMap<String, String> userMap = redisson.getMap("user");
userMap.put("id", "1");
userMap.put("name", "lance");
userMap.put("age", "30");

userMap.expire(60, TimeUnit.SECONDS);
redisson.getMap("user").get("name");

//操作列表
RList<String> usernames = redisson.getList("usernames");
users.add("lance");

studentRList.expire(60, TimeUnit.SECONDS);
redisson.getList("usernames").get(0);

以上是推薦的五個(gè)優(yōu)秀的開(kāi)源Java庫(kù),上面的代碼只是一個(gè)演示,如果您真的想在生產(chǎn)環(huán)境中使用它們,您需要根據(jù)您的項(xiàng)目情況進(jìn)行打包。希望在閱讀本文后,您可以應(yīng)用到您的項(xiàng)目中。

分享到:
標(biāo)簽:Java
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定