自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring AOP多Advisor问题

答:通过@Order或者@PriorityOrdered注解来定义的,value越小优先级越高,而且@PriorityOrdered的优先级总是比@Order高。比较器就是AnnotationAwareOrderComparator,比较方法是compare。如果一个targetClass实现了多个接口,那么生成proxy时会根据哪个接口来生成?如果某个target有多个advisor,如何定义其顺序?

2023-09-19 04:12:17 226

原创 OpenFeign如何自定义Http请求头

可以实现feign.RequestInterceptor接口,并实现apply方法,在该方法里可以对请求做一些处理。

2023-09-19 04:08:13 957

原创 OpenFeign如何从通用的响应体中解构出业务对象

在实际Restful项目中,通常都会定义一个通用的响应体对象,该对象内包括了本次调用的结果码,异常信息,业务数据对象等。对于一般的Controller接口的响应,我们都会自定义一个RestControllerAdvice,并实现ResponseBodyAdvice接口,来将Controller接口返回的业务对象统一封装成CommonResponse对象,并返回给客户端。1.2、 在decode时,首先先把decode处理委派给原来的Decoder(装饰器模式),并获取到decode后的结果对象;

2023-09-19 04:05:39 347

原创 LoadBalancer如何自定义负载均衡

【代码】LoadBalancer如何自定义负载均衡。

2023-09-19 04:04:16 461 1

原创 Spring AOP如何获取proxy所代理的原生对象

要注意的是AopProxyUtils的getSingletonTarget方法只能获取SingletonTargetSource类型的TargetSource的target,用@Aspect生成的Advisor的TargetSource的类型就是SingletonTargetSource,若是通过其它方式生成的Advisor,且使用的TargetSource不是SingletonTargetSource的话,就获取不到了。可以把proxy转Advised后获取被代理bean的这段逻辑封装到工具类当中。

2023-09-19 03:58:33 1177

原创 Spring AOP的Introduction的使用方法

Introduction和Before, After, Around等一样,都是Spring AOP的一种Advice类型。和Before, After, Around等类型的Advice不同的是,Introduction不是横切在Joinpoint处来新增advice逻辑的,而是为原有对象添加新的特性或者行为。我们可以看看具体的使用方法就明白了。

2023-09-19 03:56:26 96

原创 Spring事件通知机制介绍及使用方法

ApplicationContext内部使用了ApplicationEventMulticaster类,该类负责维护所有的Listener,并通过事件广播其将事件通知到对应的Listener中。Spring事件通知机制相当于Spring内部提供的一个松耦合的通信框架,可以解耦组件之间的通讯,基于观察者模式实现。1、 事件:表示一个事件,如果要自定义Spring的事件,只需继承ApplicationEvent抽象类即可。1、 自定义事件类:直接继承ApplicationEvent,实现事件的构造和处理逻辑。

2023-09-19 03:53:04 176

原创 Spring 各种Aware注入是如何实现的

ApplicationContextAwareProcessor主要就是执行各种Aware的注入逻辑。1、 先判断当前的bean是否实现了7个Aware接口中的其中一个,若都未实现则直接返回;2、 调用InvokeAwareInterfaces方法来执行具体的aware注入逻辑;

2023-09-19 03:35:46 66

原创 Spring AOP proxy生成流程源码解读

进入initializeBean方法里,走到applyBeanPostProcessorsAfterInitialization方法里,该方法就是为该bean执行每个BeanPostProcessor的postProcessAfterInitialization方法的。先在AbstractBeanFactory的doGetBean方法里打上断点,并给断点加上condition beanName.equals(“beProxied”),这里的beProxied是我的被代理的bean的beanName。

2023-09-19 03:34:07 62

原创 Spring DI解析_2

接下来看看CommonAnnotationBeanPostProcessor的postProcessProperties方法里的注入逻辑,第一步先调用findResourceMetadata方法从缓存injectionMetadataCache中获取待DI的Bean的的注入元信息metadata(扫描待注入点并加入到缓存中的逻辑请看《》),metadata里包含有该Bean待被注入的点的信息,比如某个Field的访问类型,对象类型,field name等。后续就是IOC容器生成注入的Bean的逻辑的。

2023-09-19 03:26:16 58

原创 Spring DI解析_1

applyMergedBeanDefinitionPostProcessors方法中会调用MergedBeanDefinitionPostProcessor接口的实现类的postProcessMergedBeanDefinition方法。本篇主要解析IOC容器是如何扫描被注入的Bean的待注入点的。扫描Method的逻辑和扫描Field的逻辑类似,不再赘述。

2023-09-19 03:21:37 72

原创 Tomcat的线程池和jdk的线程池区别

Tomcat的线程池和jdk的线程池区别

2023-09-19 03:14:05 282

原创 Mybatis缓存机制介绍及避坑指南

mybatis缓存机制介绍及避坑指南

2023-09-19 02:58:05 398

原创 innoDB的锁的类型及加锁方法

首先要明白,innoDB支持多粒度锁,即允许行锁和表锁共存共享锁(shared lock)(读锁,S锁):S锁分为行级S锁和表级S锁。不同的事务可以同时获得同一个S锁(即不同事务可以共享S锁),比如不同事务可以同时获取某表的某行的S锁。某表或某行被S锁锁定后,就不能被X锁锁定(即S锁和X锁是互斥的);排他锁(exclusive lock)(写锁,X锁):X锁分为行级X锁和表级X锁。X锁与其它一切锁都是互斥的(这就是"排他"的含义),比如某表的某行被X锁锁定后,既不能被其它事务的S锁锁定,也不能被其它

2022-02-11 18:18:36 1094

原创 停止线程的3种方法

在介绍停止线程的方法前,先介绍几个方法作为预备知识:1、interrupt()这个方法的作用是使得调用该方法的线程的interrupted状态为true。注意,这个方法并不是直接停止线程,它只是修改线程的interrupted状态位,相当于给该线程打了个“需要停止”的标记。我们可以通过实验来验证这一现象:public class Test2 { public void print() { for (int i = 0; i < 500000; i++) { System.out.p

2021-12-01 01:24:55 5790

原创 synchronized修饰方法时,锁的是当前对象吗?

锁的是当前对象,我们可以通过实验证明将某个类中的两个方法分别用synchronized来修饰,然后new出两个线程分别调用该类的两个方法,其中一个方法会使得调用它的线程sleep 10秒,若另一个线程调用的另一个方法在前一个线程sleep完10秒后才能执行,则可以证明synchronized修饰方法时,锁的是当前对象public class Test { public synchronized void func1() { System.out.println("func1!"); try {

2021-11-30 18:59:04 2244

原创 Thread.sleep()是使线程进入就绪态还是阻塞态?

明显是阻塞态。因为就绪态的线程,cpu是随时都可以调度到的。而Thread.sleep()方法可以指定sleep的时间,在这段时间内cpu不可能调度到该线程,故这段时间内该线程应处于阻塞态。当sleep时间结束后,该线程会由阻塞态转为就绪态;...

2021-11-30 18:46:42 4445 2

原创 进程或线程的生命周期

要注意的一点是:一个阻塞态的进程(线程)在等到相关事件发生后(如其等待的I/O操作已完成),转成的状态是就绪态,然后该线程需要等待CPU的调度,调度到它后才能继续执行,而不是等待时间发生后就立刻调度该线程。...

2021-11-30 18:43:06 204

原创 什么是循环依赖

从一个类开始,依赖线路能回到该类,从而形成了一个依赖闭环,这就是循环依赖。如A, B两个类形成的循环依赖:相关代码:public class Test { public static void main(String[] args) { A a = new A(); }}class A { private A a = new A();}class B { private A a = new A();}执行结果会抛出StackOverflowError一个类也能形

2021-11-28 16:07:33 423

原创 通过反射实例化某类的对象

直接使用默认构造器实例化对象:package test;import java.lang.reflect.InvocationTargetException;public class Test { public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, No

2021-11-27 15:27:20 273

原创 3种获取某个类的Class对象的方法

1、通过调用某个对象的getClass()方法获取;package test;public class Test { public static void main(String[] args) { Test test = new Test(); Class<? extends Test> tClass = test.getClass(); System.out.println(tClass.getName()); }}执行结果:test.Test2、通过调用C

2021-11-27 15:05:43 619

原创 System.out.println()与i–中的非线程安全问题

System.out.println()与i–中的非线程安全问题今天看高洪岩的《Java多线程编程核心技术》中的第1.2.4节中提到,System.out.println()方法内部虽然是同步的,但是i--操作却是在进入System.out.println()前发生的,故若有多个线程都操作i而没有对该操作进行同步的话,是会发生非线程安全问题的。书中的代码及执行结果如下:可我亲自做实验时,结果却是线程安全的,实验代码及执行结果如下:我执行了很多次,结果都是线程的安全的。我的jdk版本是17

2021-11-26 21:27:41 3178

空空如也

空空如也

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

TA关注的人

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