首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

BeetlSQL 3.6.4 发布,流行的 Java DAO 工具

本次发布感谢很多网友提出的想法和提交的PR,实际上3.x以来的各个功能调整或者Bug修复,都是网友的新人和积极参与 修复3.6.x 引入JSQLParser后解析SQL Server的错误 增加了Slf4JLogInterceptor,未来替代DebugInterceptor 修复代码生成重复导入包名的错误 Solon升级到1.5.17 <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>3.6.4-RELEASE</version> </dependency> BeetlSQL 自主研发自2015年,目标是提供开发高效,维护高效,运行高效的数据访问框架,它适用范围广,定制性强,写起数据库访问代码特别顺滑,不亚于MyBatis. 你不想写SQL也好,或者想更好的写SQL也好,BeetlSQL都能满足这要求,目前支持的数据库如下 传统数据库:MySQL,MariaDB,Oralce,Postgres,DB2,SQL Server,H2,SQLite,Derby,神通,达梦,华为高斯,人大金仓,PolarDB 等 大数据:HBase,ClickHouse,Cassandar,Hive 物联网时序数据库:Machbase,TD-Engine,IotDB SQL查询引擎:Drill,Presto,Druid 内存数据库:ignite,CouchBase 阅读文档源码和例子在线体验性能测试 BeetlSQL也支持IDEA插件,提供向导和自动提示

优秀的个人博客,低调大师

从源码角度详解Java的Callable接口

摘要:本文从源码角度深入解析Callable接口。 本文分享自华为云社区《深入解析Callable接口》,作者: 冰 河 。 本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小。 1.Callable接口介绍 Callable接口是JDK1.5新增的泛型接口,在JDK1.8中,被声明为函数式接口,如下所示。 @FunctionalInterface public interface Callable<V> { V call() throws Exception; } 在JDK 1.8中只声明有一个方法的接口为函数式接口,函数式接口可以使用@FunctionalInterface注解修饰,也可以不使用@FunctionalInterface注解修饰。只要一个接口中只包含有一个方法,那么,这个接口就是函数式接口。 在JDK中,实现Callable接口的子类如下图所示。 默认的子类层级关系图看不清,这里,可以通过IDEA右键Callable接口,选择“Layout”来指定Callable接口的实现类图的不同结构,如下所示。 这里,可以选择“Organic Layout”选项,选择后的Callable接口的子类的结构如下图所示。 在实现Callable接口的子类中,有几个比较重要的类,如下图所示。 分别是:Executors类中的静态内部类:PrivilegedCallable、PrivilegedCallableUsingCurrentClassLoader、RunnableAdapter和Task类下的TaskCallable。 2.实现Callable接口的重要类分析 接下来,分析的类主要有:PrivilegedCallable、PrivilegedCallableUsingCurrentClassLoader、RunnableAdapter和Task类下的TaskCallable。虽然这些类在实际工作中很少被直接用到,但是作为一名合格的开发工程师,设置是秃顶的资深专家来说,了解并掌握这些类的实现有助你进一步理解Callable接口,并提高专业技能(头发再掉一批,哇哈哈哈。。。)。 PrivilegedCallable PrivilegedCallable类是Callable接口的一个特殊实现类,它表明Callable对象有某种特权来访问系统的某种资源,PrivilegedCallable类的源代码如下所示。 /** * A callable that runs under established access control settings */ static final class PrivilegedCallable<T> implements Callable<T> { private final Callable<T> task; private final AccessControlContext acc; PrivilegedCallable(Callable<T> task) { this.task = task; this.acc = AccessController.getContext(); } public T call() throws Exception { try { return AccessController.doPrivileged( new PrivilegedExceptionAction<T>() { public T run() throws Exception { return task.call(); } }, acc); } catch (PrivilegedActionException e) { throw e.getException(); } } } 从PrivilegedCallable类的源代码来看,可以将PrivilegedCallable看成是对Callable接口的封装,并且这个类也继承了Callable接口。 在PrivilegedCallable类中有两个成员变量,分别是Callable接口的实例对象和AccessControlContext类的实例对象,如下所示。 private final Callable<T> task; private final AccessControlContext acc; 其中,AccessControlContext类可以理解为一个具有系统资源访问决策的上下文类,通过这个类可以访问系统的特定资源。通过类的构造方法可以看出,在实例化AccessControlContext类的对象时,只需要传递Callable接口子类的对象即可,如下所示。 PrivilegedCallable(Callable<T> task) { this.task = task; this.acc = AccessController.getContext(); } AccessControlContext类的对象是通过AccessController类的getContext()方法获取的,这里,查看AccessController类的getContext()方法,如下所示。 public static AccessControlContext getContext(){ AccessControlContext acc = getStackAccessControlContext(); if (acc == null) { return new AccessControlContext(null, true); } else { return acc.optimize(); } } 通过AccessController的getContext()方法可以看出,首先通过getStackAccessControlContext()方法来获取AccessControlContext对象实例。如果获取的AccessControlContext对象实例为空,则通过调用AccessControlContext类的构造方法实例化,否则,调用AccessControlContext对象实例的optimize()方法返回AccessControlContext对象实例。 这里,我们先看下getStackAccessControlContext()方法是个什么鬼。 private static native AccessControlContext getStackAccessControlContext(); 原来是个本地方法,方法的字面意思就是获取能够访问系统栈的决策上下文对象。 接下来,我们回到PrivilegedCallable类的call()方法,如下所示。 public T call() throws Exception { try { return AccessController.doPrivileged( new PrivilegedExceptionAction<T>() { public T run() throws Exception { return task.call(); } }, acc); } catch (PrivilegedActionException e) { throw e.getException(); } } 通过调用AccessController.doPrivileged()方法,传递PrivilegedExceptionAction。接口对象和AccessControlContext对象,并最终返回泛型的实例对象。 首先,看下AccessController.doPrivileged()方法,如下所示。 @CallerSensitive public static native <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context) throws PrivilegedActionException; 可以看到,又是一个本地方法。也就是说,最终的执行情况是将PrivilegedExceptionAction接口对象和AccessControlContext对象实例传递给这个本地方法执行。并且在PrivilegedExceptionAction接口对象的run()方法中调用Callable接口的call()方法来执行最终的业务逻辑,并且返回泛型对象。 PrivilegedCallableUsingCurrentClassLoader 此类表示为在已经建立的特定访问控制和当前的类加载器下运行的Callable类,源代码如下所示。 /** * A callable that runs under established access control settings and * current ClassLoader */ static final class PrivilegedCallableUsingCurrentClassLoader<T> implements Callable<T> { private final Callable<T> task; private final AccessControlContext acc; private final ClassLoader ccl; PrivilegedCallableUsingCurrentClassLoader(Callable<T> task) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION); sm.checkPermission(new RuntimePermission("setContextClassLoader")); } this.task = task; this.acc = AccessController.getContext(); this.ccl = Thread.currentThread().getContextClassLoader(); } public T call() throws Exception { try { return AccessController.doPrivileged( new PrivilegedExceptionAction<T>() { public T run() throws Exception { Thread t = Thread.currentThread(); ClassLoader cl = t.getContextClassLoader(); if (ccl == cl) { return task.call(); } else { t.setContextClassLoader(ccl); try { return task.call(); } finally { t.setContextClassLoader(cl); } } } }, acc); } catch (PrivilegedActionException e) { throw e.getException(); } } } 这个类理解起来比较简单,首先,在类中定义了三个成员变量,如下所示。 private final Callable<T> task; private final AccessControlContext acc; private final ClassLoader ccl; 接下来,通过构造方法注入Callable对象,在构造方法中,首先获取系统安全管理器对象实例,通过系统安全管理器对象实例检查是否具有获取ClassLoader和设置ContextClassLoader的权限。并在构造方法中为三个成员变量赋值,如下所示。 PrivilegedCallableUsingCurrentClassLoader(Callable<T> task) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION); sm.checkPermission(new RuntimePermission("setContextClassLoader")); } this.task = task; this.acc = AccessController.getContext(); this.ccl = Thread.currentThread().getContextClassLoader(); } 接下来,通过调用call()方法来执行具体的业务逻辑,如下所示。 public T call() throws Exception { try { return AccessController.doPrivileged( new PrivilegedExceptionAction<T>() { public T run() throws Exception { Thread t = Thread.currentThread(); ClassLoader cl = t.getContextClassLoader(); if (ccl == cl) { return task.call(); } else { t.setContextClassLoader(ccl); try { return task.call(); } finally { t.setContextClassLoader(cl); } } } }, acc); } catch (PrivilegedActionException e) { throw e.getException(); } } 在call()方法中同样是通过调用AccessController类的本地方法doPrivileged,传递PrivilegedExceptionAction接口的实例对象和AccessControlContext类的对象实例。 具体执行逻辑为:在PrivilegedExceptionAction对象的run()方法中获取当前线程的ContextClassLoader对象,如果在构造方法中获取的ClassLoader对象与此处的ContextClassLoader对象是同一个对象(不止对象实例相同,而且内存地址也相同),则直接调用Callable对象的call()方法返回结果。否则,将PrivilegedExceptionAction对象的run()方法中的当前线程的ContextClassLoader设置为在构造方法中获取的类加载器对象,接下来,再调用Callable对象的call()方法返回结果。最终将当前线程的ContextClassLoader重置为之前的ContextClassLoader。 RunnableAdapter RunnableAdapter类比较简单,给定运行的任务和结果,运行给定的任务并返回给定的结果,源代码如下所示。 /** * A callable that runs given task and returns given result */ static final class RunnableAdapter<T> implements Callable<T> { final Runnable task; final T result; RunnableAdapter(Runnable task, T result) { this.task = task; this.result = result; } public T call() { task.run(); return result; } } TaskCallable TaskCallable类是javafx.concurrent.Task类的静态内部类,TaskCallable类主要是实现了Callable接口并且被定义为FutureTask的类,并且在这个类中允许我们拦截call()方法来更新task任务的状态。源代码如下所示。 private static final class TaskCallable<V> implements Callable<V> { private Task<V> task; private TaskCallable() { } @Override public V call() throws Exception { task.started = true; task.runLater(() -> { task.setState(State.SCHEDULED); task.setState(State.RUNNING); }); try { final V result = task.call(); if (!task.isCancelled()) { task.runLater(() -> { task.updateValue(result); task.setState(State.SUCCEEDED); }); return result; } else { return null; } } catch (final Throwable th) { task.runLater(() -> { task._setException(th); task.setState(State.FAILED); }); if (th instanceof Exception) { throw (Exception) th; } else { throw new Exception(th); } } } } 从TaskCallable类的源代码可以看出,只定义了一个Task类型的成员变量。下面主要分析TaskCallable类的call()方法。 当程序的执行进入到call()方法时,首先将task对象的started属性设置为true,表示任务已经开始,并且将任务的状态依次设置为State.SCHEDULED和State.RUNNING,依次触发任务的调度事件和运行事件。如下所示。 task.started = true; task.runLater(() -> { task.setState(State.SCHEDULED); task.setState(State.RUNNING); }); 接下来,在try代码块中执行Task对象的call()方法,返回泛型对象。如果任务没有被取消,则更新任务的缓存,将调用call()方法返回的泛型对象绑定到Task对象中的ObjectProperty<V>对象中,其中,ObjectProperty<V>在Task类中的定义如下。 private final ObjectProperty<V> value = new SimpleObjectProperty<>(this, "value"); 接下来,将任务的状态设置为成功状态。如下所示。 try { final V result = task.call(); if (!task.isCancelled()) { task.runLater(() -> { task.updateValue(result); task.setState(State.SUCCEEDED); }); return result; } else { return null; } } 如果程序抛出了异常或者错误,会进入catch()代码块,设置Task对象的Exception信息并将状态设置为State.FAILED,也就是将任务标记为失败。接下来,判断异常或错误的类型,如果是Exception类型的异常,则直接强转为Exception类型的异常并抛出。否则,将异常或者错误封装为Exception对象并抛出,如下所示。 catch (final Throwable th) { task.runLater(() -> { task._setException(th); task.setState(State.FAILED); }); if (th instanceof Exception) { throw (Exception) th; } else { throw new Exception(th); } } 好了,今天就到这儿吧,我是冰河,我们下期见~~ 点击关注,第一时间了解华为云新鲜技术~

优秀的个人博客,低调大师

BeetlSQL 3.6.3 发布,流行的 Java DAO 工具

修复引SQLParser后,PageKit.getCountSql中若使用group by生成countsql不正确的Bug,如下: SELECT * FROM student GROUP BY id PageKit.getCountSql: SELECT COUNT(*) FROM student GROUP BY id Maven <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>3.6.3-RELEASE</version> </dependency> BeetlSQL 研发自2015年,目标是提供开发高效,维护高效,运行高效的数据访问框架,它适用范围广,定制性强,写起数据库访问代码特别顺滑,不亚于MyBatis. 你不想写SQL也好,或者想更好的写SQL也好,BeetlSQL都能满足这要求,目前支持的数据库如下 传统数据库:MySQL,MariaDB,Oralce,Postgres,DB2,SQL Server,H2,SQLite,Derby,神通,达梦,华为高斯,人大金仓,PolarDB 等 大数据:HBase,ClickHouse,Cassandar,Hive 物联网时序数据库:Machbase,TD-Engine,IotDB SQL查询引擎:Drill,Presto,Druid 内存数据库:ignite,CouchBase 阅读文档源码和例子在线体验 BeetlSQL也支持IDEA插件,提供向导和自动提示

优秀的个人博客,低调大师

BeetlSQL 3.6.2 发布,流行的 Java DAO 工具

本次发布主要是升级了Beetl版本 升级Beetl到3.4.0 SQLManagerBuilder 增加getName方法,获取SQLManager的名字 合并社区的PR,Query,Mapper类等方法内部调整 Maven <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>3.6.2-RELEASE</version> </dependency> BeetlSQL 研发自2015年,目标是提供开发高效,维护高效,运行高效的数据访问框架,它适用范围广,定制性强,写起数据库访问代码特别顺滑,不亚于MyBatis. 你不想写SQL也好,或者想更好的写SQL也好,BeetlSQL都能满足这要求,目前支持的数据库如下 传统数据库:MySQL,MariaDB,Oralce,Postgres,DB2,SQL Server,H2,SQLite,Derby,神通,达梦,华为高斯,人大金仓,PolarDB 等 大数据:HBase,ClickHouse,Cassandar,Hive 物联网时序数据库:Machbase,TD-Engine,IotDB SQL查询引擎:Drill,Presto,Druid 内存数据库:ignite,CouchBase 阅读文档源码和例子在线体验 BeetlSQL也支持IDEA插件,提供向导和自动提示

优秀的个人博客,低调大师

Beetl 3.4.0.RELEASE,Java 模板引擎 Beetl

使用了ANTLR 4.9.2版本,代替4.7.2 百度同学对Beetl代码可读性持续数月的的调整,在这个版本验证发布 代码升级到antlr4.9后,性能测试如下(测试代码:https://gitee.com/xiandafu/template-benchmark) Benchmark (outputType) Mode Cnt Score Error Units Beetl.benchmark 1 thrpt 5 84457.196 ± 1023.689 ops/s Freemarker.benchmark 1 thrpt 5 23607.474 ± 391.247 ops/s Handlebars.benchmark 1 thrpt 5 22654.605 ± 412.977 ops/s Thymeleaf.benchmark 1 thrpt 5 6968.233 ± 105.056 ops/s Beetl是一款全功能,高性能优秀的国产模板引擎,各方面特性领先国外同类技术!可以广泛用于动态页面生成,静态页面生成,代码生成,文本转换,脚本语言和规则引擎等,从2011年来,一直维护,并得到国内公司用户的赞赏。 Maven <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>3.4.0.RELEASE</version> </dependency> 文档 源码 在线体验

优秀的个人博客,低调大师

BeetlSQL 3.6.1 发布,流行的 Java DAO 工具

本次改动引入了sqlParser工具,用来解析sql,代替之前自己写的解析工具 修复upsert方法复合主键不支持的错误 合并来自社区的PR,增强BeetlSQL代码可读性 按照社区建议,采用sqlParser,解决execute方法解析sql导致的问题 Maven <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>3.6.1-RELEASE</version> </dependency> BeetlSQL 研发自2015年,目标是提供开发高效,维护高效,运行高效的数据访问框架,它适用范围广,定制性强,写起数据库访问代码特别顺滑,不亚于MyBatis. 你不想写SQL也好,或者想更好的写SQL也好,BeetlSQL都能满足这要求,目前支持的数据库如下 传统数据库:MySQL,MariaDB,Oralce,Postgres,DB2,SQL Server,H2,SQLite,Derby,神通,达梦,华为高斯,人大金仓,PolarDB 等 大数据:HBase,ClickHouse,Cassandar,Hive 物联网时序数据库:Machbase,TD-Engine,IotDB SQL查询引擎:Drill,Presto,Druid 内存数据库:ignite,CouchBase 阅读文档源码和例子在线体验 BeetlSQL也支持IDEA插件,提供向导和自动提示

优秀的个人博客,低调大师

BeetlSQL 3.5.1 发布,流行的 Java DAO 工具

此版本修复了使用Query类翻页查询,遇到表名为order的BUG。所有sql关键字作为表名或者字段名,在Query的翻页API里,都会出错,建议升级。 Maven <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>3.5.1-RELEASE</version> </dependency> BeetlSQL 研发自2015年,目标是提供开发高效,维护高效,运行高效的数据访问框架,它适用范围广,定制性强,写起数据库访问代码特别顺滑,不亚于MyBatis. 你不想写SQL也好,或者想更好的写SQL也好,BeetlSQL都能满足这要求,目前支持的数据库如下 传统数据库:MySQL,MariaDB,Oralce,Postgres,DB2,SQL Server,H2,SQLite,Derby,神通,达梦,华为高斯,人大金仓,PolarDB 等 大数据:HBase,ClickHouse,Cassandar,Hive 物联网时序数据库:Machbase,TD-Engine,IotDB SQL查询引擎:Drill,Presto,Druid 内存数据库:ignite,CouchBase 阅读文档源码和例子在线体验 BeetlSQL也支持IDEA插件,提供向导和自动提示

优秀的个人博客,低调大师

BeetlSQL 3.5.0 发布,流行的 Java DAO 工具

本次发布增加了若干方便的功能 新增SQLManagerExtend类,用于全局对BeetlSQL扩展,比如枚举转化,或者自动注入sql参数。较之前方法更为简单 增加@Seq注解,当字段使用此注解,自动按照数据库序列来赋值 修复@Auto 使用的BUG Maven <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>3.5.0-RELEASE</version> </dependency> BeetlSQL 研发自2015年,目标是提供开发高效,维护高效,运行高效的数据库访问框架,它适用范围广,定制性强,写起数据库访问代码特别顺滑,不亚于MyBatis. 你不想写SQL也好,或者想更好的写SQL也好,BeetlSQL都能满足这要求,目前支持的数据库如下 传统数据库:MySQL,MariaDB,Oralce,Postgres,DB2,SQL Server,H2,SQLite,Derby,神通,达梦,华为高斯,人大金仓,PolarDB 等 大数据:HBase,ClickHouse,Cassandar,Hive 物联网时序数据库:Machbase,TD-Engine,IotDB SQL查询引擎:Drill,Presto,Druid 内存数据库:ignite,CouchBase 阅读文档源码和例子在线体验 BeetlSQL也支持IDEA插件,提供向导和自动提示

优秀的个人博客,低调大师

BeetlSQL 3.4.2 发布,流行的 Java DAO 工具

Query功能支持Optional参数,如果为空,则andEq不生效 lambdaQuery.andEq(User::getName, Optional.ofNullable(name)).count(); 允许Mapper方法在JDK 代理基础上,再次被代理。 public static interface UserMapper<User>{ @Sql("select * from sys_user where id=? ") @Datasource("crm1") User selectById(Integer id); @Sql("select * from sys_user where id=? ") @Log() User selectById2(Integer id); } 这里,Datasource注解和Log注解均为自定义注解,以Log注解实现为例子,使用@MapperProxy申明实现类 @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD}) @MapperProxy(LogExecutor.class) public @interface Log { String value() default ""; } public static class LogExecutor implements MapperProxyExecutor { @Override public Object after(ProxyContext context,Object ret) { System.out.println("log "+ret); return ret; } } Maven <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>3.4.2-RELEASE</version> </dependency> BeetlSQL 研发自2015年,目标是提供开发高效,维护高效,运行高效的数据库访问框架,它适用范围广,定制性强,写起数据库访问代码特别顺滑,不亚于MyBatis.目前支持的数据库如下 传统数据库:MySQL,MariaDB,Oralce,Postgres,DB2,SQL Server,H2,SQLite,Derby,神通,达梦,华为高斯,人大金仓,PolarDB 等 大数据:HBase,ClickHouse,Cassandar,Hive 物联网时序数据库:Machbase,TD-Engine,IotDB SQL查询引擎:Drill,Presto,Druid 内存数据库:ignite,CouchBase 阅读文档源码和例子在线体验 BeetlSQL也支持IDEA插件,提供向导和自动提示

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册