`
文章列表
ApplicationModel 实例模型. 1.init 会通过 SPI 机制加载 ApplicationInitListener,调用其 init 方法. 2.initFrameworkExts 通过 SPI 机制加载 FrameworkExt 的扩展实现. 3.获取 ConsumerModel & ProviderModel. 4.Environment、ConfigManager、ServiceRepository. 我理解的 Ap ...
调试 ParamNameResolver. final Annotation[][] paramAnnotations = method.getParameterAnnotations(); 二维数组,第一维是参数长度,第二维是注解个数. 1.看参数上是否有 @Param 注解,有就读取该注解中的值. 2.如果第1步不成立,则看能否获取实际参数名. 3.如果还不行,则是第几个参数(排除特殊参数,例如 RowBound 等). // 解析方法参数.   public ParamNameResolver(Configuration config, Method method) {     // ...
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setParameters) ResultSetHandler (handleResultSets, handleOutputParameters) StatementHandler (prepare, par ...
Cache 类主要提供 put/get/remove 方法. public interface Cache {   /**    * cache 的 id.    */   String getId();   /**    * @param key Can be any object but usually it is a {@link CacheKey}    * @param value The result of a select.    */   void putObject(Object key, Object value);   /**    * @param key The ...
ClassLoaderWrapper 类是对 ClassLoader 的包装. 怎么理解了?看下这个方法就知道了. ClassLoader[] getClassLoaders(ClassLoader classLoader) {     return new ClassLoader[]{         classLoader,         defaultClassLoader,         Thread.currentThread().getContextClassLoader(),         getClass().getClassLoader(),         syste ...
上面写的很清楚,Transaction 是对 database connection 的封装,处理 connection 的生命周期. 创建、准备、提交、回滚和关闭. public interface Transaction {   /**    * Retrieve inner database connection.    * @return DataBase connection    * @throws SQLException    */   Connection getConnection() throws SQLException;   /**    * Commit inne ...
说明:本篇文章中有部分内容参考自下面相关链接上的内容,小伙伴可自行参考.本文在其基础上进行整理并扩充部分内容. 我们从最开始的 jdbc 开始说起. public class JdbcUtil {     // 单机 MySQL 支持的最大连接数是 16384     private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";     private static final String URL = "jdbc:mysql://localhost:3306/guns";   ...
先看个例子吧. 方法定义: ``` public int calc(int a, int b, int c){         return (a+b) * c;     } ``` javap 查看其字节码 ``` public int calc(int, int, int);     descriptor: (III)I     flags: ACC_PUBLIC     Code:       stack=2, locals=4, args_size=4      ...
1.Tomcat 类加载器架构 Tomcat 服务器类加载要解决的问题: 1.同一个 tomcat 服务器下的不同应用所使用的类库可以实现隔离. 2.同一个 toncat 服务器下的不同应用所使用的类库可以互相共享. 3.服务器需要尽可能保证自身的安全不受部署的 web 应用程序影响(服务器使用到的类库应当和应用程序使用到的类库互相隔离). 在 Tomcat 目录结构中,有 3 组目录:/common/* /server/* /shared/* /WEB-INF/* 可以存放 java 类库. /common/* 类库可被 tomcat 和所有引用程序共同使用 /server/* 类库可被 ...
producer 的工作逻辑: 启动 producer 的线程将待发送消息封装成 ProducerRecord. 然后将其序列化发送给 partitioner, 再由后者确定了目标分区后一同发送给位于 producer 程序中的一块内存缓冲区. 而 producer 的另一个线程负责实时从缓冲区中提取出来准备就绪的消息封装成一个批次,发送给对应的 broker. public class SimpleKafkaProducer {     public static void main(String[] args) {         Properties props = new P ...
执行引擎是 java 虚拟机最核心的组成部分之一.在虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型称为各种虚拟机执行引擎的统一外观. 在不同的虚拟机实现里,执行引擎在执行 java 代码的时候,可能会解释 ...
1.系统选择 linux 系统优于 windows 系统. 因为 linux 采用的是 epoll 模型,而 window 一般采用的是轮询方式,并且 linux 有 sendfile,传输效率高 2.磁盘规划 (1)普通的机械盘就能满足kafka的存储要求,因为 kafka使用的是顺序 I/O,它的速度比较快,但是 SSD 更好. (2)JBOD 性价比优于 RAID. 3.磁盘容量规划需要考虑的点 (1)新增消息数 (2)消息的留存时间 (3)副本数 (4)是否启用压缩 (5)平均消息大小 4.内存规划 (1)尽量分配多的内存给操作系统的 page cache,因为 kafka 是把消 ...
类加载器 虚拟机设计团队把类加载阶段中的“通过一个全限定性名获取二进制字节流”这个动作的实现放到 java 虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类. 这个动作的代码模块称为“类加载器”。 任何一 ...
解析阶段 解析阶段是虚拟机将常量池中的符号引用转换为直接引用的过程(在验证阶段我们知道,符号引用是将对类自身以外的信息进行匹配性验证,说人话就是说比如一个类A,调用了类B的方法,那么在解析阶段需要看下类A的 ...
类加载过程 也就是加载、验证、准备、解析、初始化这5阶段的具体动作: 加载阶段 ①通过一个类的全限定名来获取定义此类的二进制字节流 ②将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构 ③在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口. 虚拟机规范并没有详细说明从哪里获取一个二进制字节流,充满创造力的开发人员玩出了各种花样,例如从 zip 包中读取,最后从 jar、ear、war 中读取.从网络中读取,运行时计算生成.由其他文件生成,例如 jsp 相对于类加载过程的其他阶段,一个非数组类的加载阶段(准确的说是加载阶段中获 ...
Global site tag (gtag.js) - Google Analytics