简栈文化

Java技术人的成长之路~


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

请别再问Spring Bean的生命周期了

发表于 2020-05-04 | 更新于: 2020-08-02 | 分类于 Spring
我们用Spring就是因为它能帮我们很好的管理Bean,如果我们能充分的理解Bean的生命周期,就能在想要的环节去做想做的事情。 周期只有四个!是的,Spring Bean的生命周期只有这四个阶段。把这四个阶段和每个阶段对应的扩展点糅合在一起虽然没有问题,但是这样非常凌乱,难以记忆。要彻底搞清楚Spring的生命周期,首先要把这四个阶段牢牢记住。实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段。在这四步之间穿插的各种扩展点,稍后会讲。 实例化 Instantiation 属性赋值 Populate 初始化 Initialization 销毁 Destruction 实例化 -> 属性赋值 -> 初始化 -> 销毁 主要逻辑都在doCreate()方法中,逻辑很清晰,就是顺序调用以下三个方法,这三个方法与三个生命周期阶段一一对应,非常重要,在后续扩展接口分析中也会涉及。 createBeanInstance() -> 实例化 populateBean() -> 属性赋值 ...
阅读全文 »

浅谈Next-Key Lock与实测

发表于 2020-05-03 | 更新于: 2020-08-02 | 分类于 MySQL
数据库使用锁是为了支持更好的并发,提供数据的完整性和一致性。InnoDB是一个支持行锁的存储引擎,锁的类型有: 共享锁(S) 排他锁(X) 意向共享(IS) 意向排他(IX) 为了提供更好的并发,InnoDB提供了非锁定读:不需要等待访问行上的锁释放,读取行的一个快照。该方法是通过InnoDB的一个特性:MVCC来实现的。 InnoDB有三种行锁的算法: 1、Record Lock:单个行记录上的锁。 2、Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。 3、Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。 为什么section B上面的插入语句会出现锁等待的情况 ?InnoDB是行锁,在section A里面锁住了a=8的行,其他应该不受影响。why? 因为InnoDB对于行的查询都是采用了Next-Key Lock的算法,锁定的不是单个值,而是一个范围(GAP)。上面索引值有1,3,5,8,11,其记录的GAP的区间如下 ...
阅读全文 »

浅谈ElasticSearch架构以及集成

发表于 2020-05-02 | 更新于: 2020-08-02 | 分类于 ElasticSearch
简介Elasticsearch是一个高度可扩展的开源的分布式Restful全文搜索和分析引擎。它允许用户快速的(近实时的)存储、搜索和分析海量数据。它通常用作底层引擎技术,为具有复杂搜索功能和要求的应用程序提供支持。以下是ES可用于的一些场景: 电商网站提供搜索功能:可使用ES来存储产品的目录和库存,并为它们提供搜索和自动填充建议。 收集日志和交易数据,并进行分析:可使用Logstash来收集、聚合和解析数据, 然后让Logstash将此数据提供给ES。然后可在ES中搜索和聚合开发者感兴趣的信息。 需要快速调查、分析、可视化查询大量数据的特定问题:可以使用ES存储数据,然后使用Kibana构建自定义仪表板,来可视化展示数据。还可以使用ES的聚合功能针对这些数据进行复杂的商业分析。 我们要认识一个人Doug Cutting为什么要提Doug Cutting,因为Elasticsearch的底层是Lucene,而Lucene就是Doug Cutting大神写的。 引用来自于: 鲜枣课堂 1998年9月4日,Google公司在美国硅谷成立。正如大家所知,它是一家做搜索引擎起家的公司。 ...
阅读全文 »

Transaction注解哪些情况不生效?

发表于 2020-05-01 | 更新于: 2020-08-02 | 分类于 Spring
看一个最简单的CGLIB的例子,感受一下AOP是如何做到的? 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061/** * Created with vernon-test * Description: * User: chenyuan * Date: 16/4/25 * Time: 上午9:25 */public class Target { public String execute() { String message = "----------test()----------"; System.out.println(message); return message; }}/** * Created with vernon-test * Description: * User: chenyuan * Date: ...
阅读全文 »

自己亲手写一个SpringBoot的事物

发表于 2020-04-08 | 更新于: 2020-08-02 | 分类于 Spring
1. 概述一直在用SpringBoot中的@Transactional来做事务管理,但是很少没想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事务的,最后我们结合源码的理解,自己动手写一个类似的注解来实现事务管理,帮助我们加深理解。 阅读说明:本文假设你具备Java基础,同时对事务有基本的了解和使用。 2. 事务的相关知识开始看源码之前,我们先回顾下事务的相关知识。 2.1 事务的隔离级别事务为什么需要隔离级别呢?这是因为在并发事务情况下,如果没有隔离级别会导致如下问题: 脏读(Dirty Read) :当A事务对数据进行修改,但是这种修改还没有提交到数据库中,B事务同时在访问这个数据,由于没有隔离,B获取的数据有可能被A事务回滚,这就导致了数据不一致的问题。 丢失修改(Lost To Modify): 当A事务访问数据100,并且修改为100-1=99,同时B事务读取数据也是100,修改数据100-1=99,最终两个事务的修改结果为99,但是实际是98。事务A修改的数据被丢失了。 不可重复读(Unrepeatable Re ...
阅读全文 »

十分钟搞懂Lombok使用与原理

发表于 2020-04-07 | 更新于: 2020-08-02 | 分类于 Java
简介Lombok是一款好用顺手的工具,就像Google Guava一样,在此予以强烈推荐,每一个Java工程师都应该使用它。Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现Lombok,开发人员可以节省构建诸如hashCode()和equals()这样的方法以及以往用来分类各种accessor和mutator的大量时间。 IntelliJ安装Lombok通过IntelliJ的插件中心安装 最后需要注意的是,在使用lombok注解的时候记得要导入lombok.jar包到工程,如果使用的是Maven Project,要在pom.xml中添加依赖。 12345<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.8</version>&l ...
阅读全文 »

深入理解ServiceLoader类与SPI机制

发表于 2020-04-06 | 更新于: 2020-08-02 | 分类于 Java
最近我们自己在重构项目,系统为了符合82原则(希望是80%的业务能通过穷举的方式固定下来,只有20%的允许特殊的定义),那么在固定一些标准流程以后,比如我们放大了原子服务的能力,当放大原子服务能力的时候,你就会发现,虽然抽象上看做的事情是一个意思,但是到实际去实现的时候发现还是各不相同。 在这里为了解决一个实现不同,但流程相同的问题,以及团队协作上的问题。我们引入的SPI (Service Provider Interface) 。 使用案例通常情况下,使用ServiceLoader来实现SPI机制。 SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制, 比如有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。 SPI机制可以归纳为如下的图: 如果大家看过源代码或者说看过一些博客文章大概都清楚,在一些开源项目中大量的使用了SPI的方式,比如:mysql-connector-java,dubbo等。 我们大概看眼MySQL的一个SPI实现 JDBC中的接口即为:java.sql.Dri ...
阅读全文 »

深入理解RocketMQ的设计

发表于 2020-04-05 | 更新于: 2020-08-02 | 分类于 MQ
技术架构RocketMQ架构上主要分为四部分,如上图所示: Producer:消息发布的角色,支持分布式集群方式部署。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递,投递的过程支持快速失败并且低延迟。 Consumer:消息消费的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式和广播方式的消费,它提供实时消息订阅机制,可以满足大多数用户的需求。 NameServer:NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消 ...
阅读全文 »

三句话理解时区与时间戳

发表于 2020-04-04 | 更新于: 2020-08-02 | 分类于 Java
第一句话:时间戳时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字,叫时间戳。时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。 关于 时间戳, 你可以看在线时间戳 http://tool.chinaz.com/Tools/unixtime.aspx 第二句话:时区时间戳 在地球的每一个角落都是相同的,但是在相同的时间点会有不同的表达方式,所以有了另外一个时间概念,叫时区。这里的时区与地区不是同一个概念,例如我们所在的时区叫 东八区 。 在设备中,可以自己手动的切换当前的系统时区: 你会发现:当你选在不同的时区,你的当前时间是不一样的。 第三句话:时间戳与时区在Code中应用格林威治标准时间GMT 十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测。1675年旧皇家观测所(Old Royal Observatory) 正式成立,到了1884年决定以通过格林 ...
阅读全文 »

如何打通SpringCloud与HSF的调用?

发表于 2020-04-03 | 更新于: 2020-08-02 | 分类于 Spring
背景2019年我们经历了一整年的各种迁移,其中包括了一项RPC框架的切换。以前我们用的HSF RPC框架,它是来自于阿里巴巴,经过了多年的双11高并发的洗礼,高性能这块儿毫无疑问没有任何的问题,而且它还同时支持TCP与HTTP的方式,唯一不太好的就是它不开源,如果出现问题定位起来确实有一些问题与风险。 所以,我们为了拥抱开源,全部采用SpringCloud,系统与系统之间调用是通过FeignClient的方式来调用的,但是由于底层的部分系统由于时间、人力、历史等原因,无法在短时间内都像我们一样能积极响应。所以就出现了SpringCloud与HSF服务同时存在的情况,为了大家再编码过程中都能像本地调用(TCP,FeignClient),所以就写了一个代理工具。 交互图 如果是上面的方式,我们还是能感受到每次都是通过HttpClient等方式发起一次Http请求,写代码时候的体验不是很好。 为了解决这个问题,那么我们的任务就是来写一个这个代理封装。 分析功能点了解一下FeignClient我们参考一下FeignClient的功能一个解析过程,如图: 生成动态代理类 解析出等的Meth ...
阅读全文 »
上一页1…456…15下一页
Vernon

Vernon

149 日志
66 分类
87 标签
RSS
GitHub E-Mail
© 2021 Vernon
由 Hexo 强力驱动
|
主题 — NexT.Gemini v6.0.4