有经验的Java开发者有个特点是善于利用现有的轮子来构建汽车,而不是反复造轮子。如今的Java生态系统已经非常成熟。
在Java快速发展的几十年中,涌现出许多优秀的开源项目。在大多数情况下,我们可以在开源社区中找到合适的开源库。
许多开发者已经使用和测试了这些库,通常它们具有良好的性能和稳定性。合理地使用这些优秀的开源组件可以节省大量时间,让你有更多的时间去做其他事情。在本文中,将分享一些Java开发者应该熟悉的开源类库。
1 Orika
Orika是一个Java bean映射工具,可以递归地将数据从一个对象复制到另一个对象。在编写代码时,我们通常会发现需要将对象转换为不同的格式以适应不同的API,例如将DTO转换为POJO或POJO转换为VO。通常,我们需要通过getter/setter完成此操作。Orika可以通过简单的代码为您解决这个烦恼,而且性能损失不大。
Maven依赖项:
<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不仅可以复制简单的Java对象,还可以复制集合。是不是很棒?
2 Caffeine
Caffeine是一个高性能的内存缓存类库。Caffeine使用W-TinyLFU算法,其读写性能比guava更优秀。Spring 5已经将缓存的默认实现从guava改为了Caffeine。
Maven依赖项:
<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)
//如果缓存为空,运行以下表达式并将其存储在缓存中
.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是一个快速高效的Java对象序列化框架,具有高性能、序列化流小和简单API等特点。目前,许多开源项目都在使用Kryo,例如Apache Hive和Apache Spark。以下是Kryo和主要序列化框架的性能比较。
Maven依赖项:
<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是一个异步事件驱动的网络应用程序框架,可用于快速开发和维护高性能协议服务器和客户端。
在网络编程领域,Netty绝对是占据主导地位的。基于Java NIO,Netty使用反应器线程模型,将客户端连接绑定到特定线程,以避免IO线程频繁上下文切换。
Netty中的所有IO操作都是异步的,并具有超高的性能。许多开源的Java项目都将Netty作为默认的通信层框架,例如下面要提到的Zookeeper、Elasticsearch和Redisson。
5 Redisson
Redisson采用基于NIO的Netty框架,不仅可以作为Redis的底层驱动客户端,还可以以同步、异步、异步流或管道形式发送Redis命令、执行和处理Lua脚本以及处理返回结果。
在此基础上,它还集成了更先进的应用解决方案,不仅将原生的Redis哈希、列表、集合、字符串和地理数据结构封装为Java中最熟悉的数据结构,还实现了分布式锁等高级应用场景。
Maven依赖项:
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.16.2</version>
</dependency>
示例代码:
//获取和设置键值对
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);
以上是推荐的五个优秀的开源Java库,上面的代码只是一个演示,如果您真的想在生产环境中使用它们,您需要根据您的项目情况进行打包。希望在阅读本文后,您可以应用到您的项目中。