自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 JDK和CGLIB动态代理原理

该代理对象的方法会有逻辑上的增强,其一方面会执行增强的逻辑,另一方面其实就是通过反射调用被代理类的方法,这个调用过程跟静态代理就很像了。这里通过实现了JDK的InvocationHandler接口中invoke方法,其实这个类就是JDK动态代理的代理类,后面生成的代理对象就是通过该代理类,来间接调用原始类的方法的。代理对象的方法是如何被增强的呢,其实增加逻辑并不在代理对象中,而是在代理类这个中间者里,代理对象只不过是调用了这个中间者的invoke方法而已;最后就是生成代理对象。

2024-02-06 15:11:12 293 1

原创 Spring IOC - Bean的生命周期之依赖注入

在父子容器进行类型查找:查找类型匹配的 beanNames,beanFactory#beanNamesForType 方法根据类型查找是,先匹配单例实例类型(包括 Spring 托管 Bean),再匹配 BeanDefinition 的类型。其会调用到Spring进行依赖查找的核心API: beanFactory#resolveDependency,其本质是根据类型查找依赖,调用beanFactory#beanNamesForType方法根据类型查找依赖名称。此时只有一个依赖,从容器获取真实的 bean。

2023-11-19 17:28:53 546

原创 Spring IOC - 推断构造方法

首先看下方法的源码及注释如下,下面我们再逐行解析。// 使用适当的实例化策略为指定的bean创建一个新实例:工厂方法、构造函数自动装配或简单实例化// 创建bean的实例,这里也是spring推断构造方法的核心所在// args:表示程序员通过getBean传入的参数,如果使用getBean(Class<?> requireType,Object[] args),那么传入的参数就会传入到这里// 这个参数是用于构造函数或工厂方法调用的显示参数// 获取bean的Class对象Class<?

2023-11-17 14:29:56 181

原创 Spring IOC - Bean的生命周期之实例化

在Spring启动流程文章中讲到,容器的初始化是从refresh方法开始的,其在初始化的过程中会调用finishBeanFactoryInitialization方法。而在该方法中则会调用DefaultListableBeanFactory#preInstantiateSingletons方法,该方法的核心作用是初始化非延迟加载的Bean,且提供了两个扩展点

2023-11-13 20:08:16 486

原创 Spring IOC - BeanDefinition解析

若bean没有父亲,将当前beanDefinition通过克隆或深拷贝方式生成一个新的RootBeanDefinition,并返回;若bean有父亲,将父beanDefinition通过克隆或深拷贝方式生成一个新的RootBeanDefinition,再将子beanDefiniton属性覆盖RootBeanDefiniton的相同信息,并返回该RootBeanDefinition.

2023-11-13 10:30:00 84

原创 Spring IOC - Spring启动过程解析

注册Bean的后置处理器,包括系统内置的和自定义的,如:AutowireAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor。2.AbstractRefreshableApplicationContext:关闭当前beanFactory,创建新的beanFactory,体现了刷新的含义。提前给beanFactory塞入bean实例:如BeanFactory,ResourceLoader等,以及设置类加载器、属性编辑器等。

2023-11-04 17:10:24 231

原创 Spring IOC - ConfigurationClassPostProcessor源码解析

上文提到Spring在Bean扫描过程中,会手动将5个Processor类注册到beanDefinitionMap中,其中ConfigurationClassPostProcessor就是本文将要讲解的内容,该类会在refresh()方法中通过调用invokeBeanFactoryPosstProcessors(beanFactory)被调用。对full模式的配置类BeanDefinition进行CGLib增强:把CGLib生成的子类型设置到beanDefinition中。

2023-10-31 19:43:59 1132 9

原创 Spring IOC - Bean的扫描

Component及其衍生注解:@Configuration、@Controller、@Service、@Repository标记的类,被Spring IOC扫描到后,即可被容器管理起来。其原理基本涵盖在AnnotationConfigApplicationContext构造函数体的三行代码里。

2023-07-10 21:09:43 679

原创 Spring IOC - FactoryBean源码解析

FactoryBean是Spring框架中的一个接口,它允许我们自定义一个工厂类,用于创建和管理Spring容器中的Bean实例。getObject():用于返回一个Bean实例,这个方法可以自定义创建Bean实例的逻辑。getObjectType():用于返回创建的Bean实例的类型。当我们在Spring中自定义一个FactoryBean时,Spring容器会先创建这个FactoryBean实例,然后调用它的getObject()方法来获取实际的Bean实例。

2023-06-02 19:33:10 498

原创 Spring IOC - Bean的初始化

null) {try {else {// 调用afterPropertiesSet方法if (mbd!!!// 调用自定义的init方法。

2023-05-19 18:50:54 1053

原创 Spring IOC 源码解读

BeanDefinition 中的 beanClass(Object) 是以 String 定义,通过 spring 的 ClassUtil.forName 处理成 Class 类型,并通过 ClassLoader 加载。包含属性的读方法引用(readMethodRef,通常是getter),写方法引用(writeMethodRef,通常是setter)等信息。Bean 定义中的 id,name,scope,primary 等统称为 Bean 元信息。此阶段可以对 PropertyValue 做修改。

2023-04-28 15:07:22 900

原创 spring所有的扩展点

spring扩展点

2023-04-26 17:05:45 641

原创 线上问题诊断指南

线上问题诊断指南

2023-02-21 10:46:03 685

原创 SpringBoot揭密:spring-boot-starter-json介绍

SpringBoot支持三种Json库:Jackson、Gson、JSON-B,Jackson是SpringBoot官方推荐的默认库。SpringBoot分别提供了Jackson、Gson、JSON-B的自动装配:org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\org.springframework.boot.autoconfigure.gson.GsonAutoConfiguratio...

2022-04-19 15:37:07 2693

原创 SpringBoot揭密:spring-boot-starter-logging及源码解析

SpringBoot源码中使用的日志API为JCL(Java common log),JCL实际上只是一个日志门面,没有具体的日志功能实现。如果将SpringBoot中的spring-boot-start-logging依赖排除,可以看到启动项目时打印的是红色字体的JUL日志。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>sprin...

2022-04-10 15:44:34 4001

原创 SpringBoot揭密:spring-boot-starter-actuator与应用监控

系统上线后其稳定性是至关重要的,开发者做到对系统运行状态及各种信息了如指掌,才有底气保证系统没有问题,很多开发者连通过运行数据来监控系统状态的意识都没有,系统上线稳定后是否稳定全凭运气和被动接收用户反馈才知道。SpringBoot提供了非常成熟的应用监控模块SpringBoot Actuator,其中Actuator可理解为探测器,通过spring-boot-starter-actuator开箱即用,即可获得通过HTTP或者JMX方式暴露的EndPoint,EndPoin...

2022-04-09 19:30:20 2704

原创 JAVA泛型理解

一. 术语 泛型:声明中具有一个或者多个类型参数的类或者接口,就是泛型; 原生态类型:每一种泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。例如,与List<E>相对应的原生态类型是List。原生态类型就像从类型声明中删除了所有泛型信息一样,他们的存在主要是为了与泛型出现之前的代码相兼容。二. 理解 从技术的角度来说,像E、List<E>和List<String>这样的类型应称作不可...

2021-12-05 18:50:54 257

原创 SpringBoot揭密:spring-boot-starter-data-redis

一. POM解析 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.0.RELEASE</version> <scope>comp

2021-12-04 16:11:21 14656

原创 POM 标签大全详解及依赖管理

一. 标签大全<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"> <!--父项目的坐标。如果项目中没有规定某个元

2021-11-21 22:00:56 934

转载 版本名词解释

GA:General Availability,正式发布的版本,官方开始推荐广泛使用,国外有的用GA来表示release版本。RELEASE:正式发布版,官方推荐使用的版本,有的用GA来表示。比如spring。Stable:稳定版,开源软件有的会用stable来表示正式发布的版本。比如Nginx。Final:最终版,也是正式发布版的一种表示方法。比如Hibernate。RC:Release Candidate,发行候选版本,基本不再加入新的功能,主要修复bug。是最终发布成正式版的前一个版本

2021-11-09 11:15:55 1745

原创 Spring MVC从HandlerMapping中获取Handler

我们常用的@Controller和@RequestMapping注解对应的HandlerMapping类是RequestMappingHandlerMapping,其继承的AbstractHandlerMethodMapping类中缓存了URL到HandlerMethod的映射信息,从RequestMappingHandlerMapping中获取的Handler实际上是HandlerMethod。源码解析如下: HandlerMapping的getHandler()方法由抽...

2021-11-02 17:18:08 664

原创 Spring MVC中HandlerMapping的初始化

HandlerMapping的初始化发生在核心类:AbstractHandlerMethodMapping中,该类实现了InitializingBean,且RequestMappingHandlerMapping为该类子类,spring启动过程中会通过回调afterPropertiesSet方法完成HandlerMethod的初始化。初始化的过程实际上是将Controller中的方法注册到MappingRegistry中,MappingRegistry为AbstractH...

2021-11-02 16:11:44 286

原创 SpringBoot加载配置文件源码解析

SpringBoot通过事件广播机制通知ConfigFileApplicationListener这个监听器来加载properties和yaml文件。关于SpringBoot事件编程模型可参考:SpringBoot事件编程模型解析。 SpringBoot一站式启动过程中,会经过环境准备阶段:ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArgume...

2021-10-12 14:27:02 546

转载 SpringBoot配置文件加载顺序

小编最近在工作中使用SpringBoot开发项目时候,遇到配置文件加载问题,一直不是很清楚Idea中放置的位置和Maven打包成Jar包后放置的位置,顺便记录下。 如SpringBoot官网介绍默认情况下,我们可以将application.properties或者application.yam放置在如下四处:Application Property Files介绍1、第一种,根据官网介绍将application.properties放置在...

2021-09-30 16:48:47 102

原创 SpringMVC拦截器执行顺序分析

DispatcherServlet做为SpringMVC前置处理器,在doDispatch方法中定义了模块整体的核心流程,SpringMVC独有的拦截器的执行逻辑同样也定义在其中,关于SpringMVC的整体流程逻辑原理解析可参考文章:Spring MVC原理解析如下图所示,标注了拦截器执行的关键步骤:第一步:从处理器映射器中获取HandlerExecutionChian,该类包含一个处理器Handler和一个HandlerInterceptor列表...

2021-09-18 09:47:58 1364

原创 企业级网络爬虫实现及商业价值

目录1. 网络爬虫的价值和规制1.1 网络爬虫的功能和价值1.2 网络爬虫规制的必要性2. 君子协议3. 爬虫基本原理3.1 爬虫是什么?3.2 爬虫的基本流程3.3 爬虫分类4. 搜索引擎5. 爬虫实现5.1 爬虫服务核心逻辑概述5.2 数据爬取开发过程5.3 爬虫服务核心逻辑流程5.4 内容解析5.5 带账号爬取5.6 登陆流程5.7 爬虫COOKIE维护服务6. 规则引擎7. 反爬技术8. 数据清洗8.1 数仓分层架构

2021-09-12 08:51:18 1373

原创 SpringBoot里的观察者设计模式,SpringBoot事件编程模型解析

观察者模式直白解释:可理解为订阅和通知的过程,即订阅者(或者监听者、观察者)向注册和通知中心注册自己以及关注的事件,发布者(或者被观察者、通知者)向注册和通知中心发布事件消息,委托注册和通知中心向关注了该事件的观察者发布通知。通过注册和通知中心解耦了观察者和发布者,观察者不需要关心发布者是谁,只需关注自己对什么感兴趣;发布者不需关心观察者是谁,只需关注自己及时的发布通知。相关类图不再赘述,网上有很多,下图是观察者模式的交互方式,旨在便于理解。Spring中的事件编程模型就是观察者设计模式的实现,Spr

2021-04-28 12:20:32 685 2

原创 Spring MVC原理解析

现在基于请求驱动的Web框架基本都是由单一的Servlet作为整个应用程序的前置处理器(Front Controller),该Servlet接收到具体的Web处理请求之后,会参照预先可配置的映射信息,将待处理的Web请求转发给次一级的控制器来处理。DispatcherServlet就是Spring MVC框架中的这个单一的Servlet,它就是Spring MVC框架如此简单好用的原因,我们只需要定义一个Controller,写上自己的业务逻辑之后,即可处理Web请求了。原理就是Spring MVC已经

2021-04-23 18:17:04 1807 3

原创 自定义springboot actuator endpoint及原理解析

springboot actuator是springboot官方提供的系统信息探测器,用于获取系统状态和业务监控等信息。springboot admin封装了springboot actuator,常用于业务系统的可视化监控管理及报警。springboot actuator endpoint是使用spring mvc通过http方式对外提供服务的web端点,官方提供了有HealthEndpoint、InfoEndpoint等web端点,来提供系统的健康状态或其他系统信息。当需要自己的endpoint时,

2021-04-16 17:21:32 1164

原创 Spring里的模板方法设计模式,JdbcTemplate、RedisTemplate、RestTemplate源码分析

前言:设计模式是阅读源码的一项极其重要的内功心法,而其中模板方法设计模式的套路在JDK、Spring、Mybatis、Maven中被广泛使用,如:Spring中的各种Template,有JdbcTemplate、RedisTemplate、RestTemplate皆是这种老把戏,假如您对该内功心法了如指掌,那么阅读它们的源码简直快地飞起,甚至能依葫芦画瓢,设计出HttpTemplate、FtpTemplate根本不在话下。 模板方法设计模式简介:在一个方法里定义了做事的流程,该流程中的某些步骤的实现逻辑是

2021-04-07 15:15:52 2303

转载 如何设计好API

好的API应对客户端友好,换言之就是能够直接通过其方法签名而理解它做的事情,而不用深入去阅读方法的实现,甚至深入阅读API所在的整个类。单纯的介绍如何设计好API似乎如"海市蜃楼"般的虚无缥缈,因此本文从设计&实现的角度出发,针对我们在设计并实现API的过程中提出一些小意见。首先回顾一下API方法的组成模块:API注释 访问修饰符 返回值 方法名称 参数列表 异常列表 方法主体针对API方法的组成模块,将提出几点小意见;可简单归纳为:"一个原则,三点建议,两个思考,三要五不

2021-04-07 09:24:32 115

原创 拒绝花里胡哨,极简springboot starter自定义及原理

SpringBoot针对日常企业应用场景提供了各种spring-boot-starter依赖模块,所有这些依赖模块都遵循着约定俗成的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。SpringBoot通过AutoConfiguration模块自动装配官方(以spring-boot-starter-xxx方式命名)、第三方以及自定义(以xxx-spring-boot-starter方式命名)的starter.当我们向其他项目提供jar包时,可自定义为starter,SpringBoot项目

2021-04-06 19:27:38 149

原创 MySQL踩过的那些坑

SQL执行顺序from join on where group by(开始使用select中的别名,后面的语句都可以使用) avg sum(聚合函数) having select distinct order by limit从这个顺序不难发现,所有的查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个结果集,这个结果集将作为下一个执行步骤的输入...

2018-11-14 09:36:20 206

原创 MySQL优化常用方法

1、数据库表结构设计首先从业务出发,可利用ER图理清实体及实体之间的关系,包括一对一,一对多,多对多关系,多对多关系需要中间表。实体间的关系应该通过实体表的主键进行关联,不要使用非主键进行关联,以免留下后患。 其次,在设计数据库时,可先遵循范式进行设计,一般违反范式进行设计,也能带来好处,但会引入冗余。冗余利于数据查询,提升查询性能,但会造成数据不一致,因此需要维护冗余字段。 ...

2018-10-17 23:05:21 1795

转载 java引用级别--强引用、软引用、弱引用、虚引用

1、强引用(StrongReference)         强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object o=new Object();   //  强引用当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来

2016-08-12 14:55:09 343

原创 Command设计模式和java回调机制的异同

最大的区别在于命令模式的具体命令中组合了一个接收者对象,而java回调机制中的接口的实现类中(即匿名内部类)中并没有组合一个接收者,从而回调方法没有继续调用接收者的方法。简而言之,java回调机制相较command模式少了一层接收者环节。命令模式正是回调机制的一个面向对象的替代品。一、首先介绍回调机制回调机制:一开始,一个类定义了一些个未实现的方法,并且该类并不知道这些方法具体的实

2016-07-29 16:42:15 526

转载 Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)

本文背景:前些天用到了之前写的自定义图片文字复合控件,在给他设置监听时遇到了麻烦。虽然最后解决了问题,但发现在不重写LinearLayout的onInterceptTouchEvent时,子ImageView、子TextView、父Linearlayout三者不同的属性配置(android:clickable android:focuseable)会造成自定义控件onClick监听失败、或成功

2016-07-19 18:12:19 560

转载 补充说明Window、PhoneWindow与DecorView

我们大概理解了View/ViewGroup的概念。但是它们仅仅是界面的一部分,正如下图所示:对相关类的作用进行一下简单介绍:Window 类   位于 /frameworks/base/core/java/android/view/Window.java。该类是一个抽象类,提供了绘制窗口的一组通用API。可以将之理解为一个载体,各种View在这个载体上显示。Phon

2016-07-17 15:17:14 604

转载 android位置参数left、translationX、x、mScrollX

1.left     left的意义就是“该视图左边界距其父元素左边界的距离”,我之前也是这么理解的,这个并没有错。然而,在此基础上,我之前还以为当视图的位置改变时,left的值会随之改变,这个并不准确。准确地来讲,“位置改变未必会引起left的值的变化,left值得变化会引起视图左边界的位置变化”。我们来看一个例子:    图1图2    图中的数

2016-07-12 15:50:12 2527 1

原创 通过内存解析String的基本原理

1.java中String类型有两种赋值方式:直接赋值,如:String s = "a";     通过new赋值     如String s = new String("a");2.String类型是引用类型,其内存地址开辟在堆取。但是在堆区有一块区间称为字符串常量池。这块区间是用来干嘛的呢?当直接赋值时,要看值在编译期能不能确定,若能就会在常量池中创建对象,若不能就会在运行期时在堆区(字符

2016-07-08 16:04:17 471

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除