自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring 循环依赖时,对需要AOP中增强的类如何处理?

Spring 5.1.8 RELEASE例:@Aspect@Componentpublic class LogAspects { //抽取公共的切入点表达式 //1、本类引用 //2、其他的切面引用 @Pointcut("execution(public int com.aop.MathCalculator.*(..))") public void pointCut(){}; //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)

2020-05-25 09:15:33 591

原创 SpringAOP的实现原理:3、SpringAOP代理完成之后是如何进行调用的?

正常情况下,每个Advisor里面都会包含PointCut和一个Advice:pointCut用来判断方法和类是否需要被增强,Advice用来给Bean做增强。调用步骤: 1、首先CGLib内部会根据方法获取对应的增强器 2、调用增强器的增强方法,对于MethodInterceptor的增强器,就会调用intercept方法。 2.1、intercept方法分析。我们分析对于自己写的@Aspect(@Around、@Before、@After 等)对于此拦截器,首先...

2020-06-01 13:45:30 430

原创 Spring中Bean实例化的三种方式

参考文章:忘记了1、构造方法<bean id="person" class="com.dfdc.spring.demo.Person"></bean><bean id="personWithParam" class="com.dfdc.spring.demo.Person"> <constructor-arg name="name" value="等风的草"/></bean><bean id="personWirhPar

2020-05-26 16:36:04 212

原创 Spring循环依赖产生的原因以及解决方式

原因一、构造方法引起的循环依赖的错误@Componentpublic class Aest { private MathCalculator mathCalculator; @Autowired public Aest(MathCalculator mathCalculator){ this.mathCalculator=mathCalculator; }}@Componentpublic class MathCalculator {

2020-05-26 16:06:31 1398 2

原创 SpringAOP的实现原理:2、AOP动态代理过程分析

创建代理的步骤分析: 1、首先对拦截器处理,interceptorNames还指定了一些拦截器进行合并,并将不同格式的拦截器处理成对应的增强器Advisor。 2、声明一个代理的工厂类ProxyFactory,并设置对应的增强器,设置TargeSource等信息。 3、根据设置堆ProxyFactory生成对应的AOPProxy,并获取对应的代理类咱们接着下面段代码分析:Object proxy = createProxy(bean.getClass(), be...

2020-05-26 15:40:18 288

原创 SpringAOP 如何获取所有的增强器

在对AOP相关的Bean进行增强的时候,必须要获取增强器,并把增强器应用到到Bean上。那么需要先获取所有的增强器,并构造称为Advisor。 如何获取构造器那下面,我们从findCandidateAdvisors()进行解析。这个方法的调用位置为,在初始化完成之后调用Bean的后置处理器,处理AOP的动态代理的过程中会多次用到。1、AnnotationAwareAspectJAutoProxyCreator.class #findCandidateAdvisors()pro...

2020-05-26 15:37:18 254

原创 SpringAOP的实现原理:1、如何获取可用AOP增强器?

接着上面进行分析。我们来分析如何根据Bean的信息获取他对应的拦截器。接着上一篇大纲进行分析:getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);@Overrideprotected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource targetSource) { List&l.

2020-05-26 15:31:40 202

原创 SpringAOP的实现原理:0、总纲

SpringAOP的作用: 并将那些影响了多个类的公共行为封装到一个可重用模块,减少代码的耦合。增强器的初始化是什么时候初始化的? 第一次调用wrapIfNecessary(bean, beanName, cacheKey)方法的时候就会进行第一次初始化,此时会判断对象上是否有@Aspect或者继承实现AOP相关方法的类,之后根据里面的方法进行构建增强器。在SpringAOP的实现过程中,对bean增强的实现有两个地方: 1、在实例化话完成之后会将实例化...

2020-05-26 15:28:03 197

原创 CGLib中类Enhancer介绍

Enhancer常用的方法介绍Enhancer enhancer = new Enhancer();1、设置要继承的父类enhancer.setSuperclass(superclass);2、设置要实现的接口,这里需要实现EnhancedConfiguration,因为EnhancedConfiguration集成了BeanFactoryAware,则要生成对应的实现方法,用于在谁知工厂的时候做增强处理。具体详见ImportAwareBeanPostProcessor。private sta

2020-05-26 11:35:05 2416

原创 CGLib中Callback介绍

参考文章: https://blog.csdn.net/zhang6622056/article/details/87286498本篇文章主要参考NeroJings作者的。我只是起到了搬运工的作用。callbacks简介这里的callback可以认为是cglib用于生成字节码的实现手段,cglib一共实现了6种callback,用于对代理类目标进行不同手段的代理,非常灵活,分别为FixedValueInvocationHandlerLazyLoaderMethodInterce.

2020-05-26 11:05:01 731

原创 CGLib中CallbackFilter介绍

作用: 在CGLib回调时可以设置对不同方法执行不同的回调逻辑,或者根本不执行回调。示例: 首先定义一个被代理类,包含2个方法: public class Target { public void f(String s,String dsd){ System.out.println("Target f()"); } public void g(int c){ System.out.println("Target g()"...

2020-05-26 11:01:03 1245

原创 Spring加载BeanDefinition的过程分析

分析的类:AnnotationConfigWebApplicationContext.classSpringboot启动的时候没有采用这个,具体Springboot的启动方式见后边的文章。 加载BeanDefinition的过程:protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) { //获取reader AnnotatedBeanDefinitionReader ...

2020-05-22 14:57:09 284

原创 spring 如何解决循环依赖,为什么要创建三个缓存?

spring是如何解决单例的循环依赖注入:首先看下面三个缓存: 1.singletonObjects:存放初始化好的bean 2.earlySingletonObjects:存放了刚实例化好的,调用getEarlyBeanReference进行扩展( SmartInstantiationAwareBeanPostProcessor)之后的。但是还未配置属性和初始化的bean,bean还在创建的过程中通过getBean可以获取到,用于解决循环依赖的问题。我们在获取该bean的时候会调用be

2020-05-22 14:54:42 825

原创 Bean相关的处理器 二、ApplicationListenerDetector

ApplicationListenerDetector:主要作用: 1、在Bean初始化完成之后:如果Bean是单例的则并且bean instanceof ApplicationListener。加入到this.applicationListeners中。 2、在Bean销毁之前搞事情:如果Bean是一个ApplicationListener,则会从ApplicationEventMulticaster(事件广播器)中提前删除了。class ApplicationListene...

2020-05-22 14:52:10 2053

原创 Bean相关的处理器 一、ApplicationContextAwareProcessor

作用: 主要就是对那些实现的Aware接口的Bean在实例化完成之后,初始化之前的阶段进行赋值。这也是忽略自动注入Aware这些接口的解决方案。class ApplicationContextAwareProcessor implements BeanPostProcessor { private final ConfigurableApplicationContext applicationContext; private final StringValueResolver ..

2020-05-22 14:51:07 125

原创 AnnotationConfigApplicationContext初始化过程

实例化的方式:public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { this(); //详解 1 register(annotatedClasses); //详解 2 refresh(); //详见Spring容器启动流程}详解 1public AnnotationConfigApplicationContext() { this.reader = ne

2020-05-22 13:58:08 401

原创 Spring启动流程核心步骤:10、 finishRefresh()

1、清除上下文资源缓存(如扫描中的ASM元数据)2、初始化上下文的生命周期处理器,并刷新(找出Spring容器中实现了Lifecycle接口的bean并执行start()方法)。3、发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作protected void finishRefresh() { // Clear context-level resource caches (such as ASM metadata f...

2020-05-22 13:40:25 230

原创 Spring启动流程核心步骤:9、finishBeanFactoryInitialization(beanFactory)

Spring的核心步骤:初始化Beanprotected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // Initialize conversion service for this context. //ConversionService.class用于类型转换的服务接口 //详见 :Spring中的数据转换:Converter、ConversionS

2020-05-21 15:22:17 165

原创 Spring启动流程核心步骤:8、registerListeners()

注册监听器protected void registerListeners() { // Register statically specified listeners first. for (ApplicationListener<?> listener : getApplicationListeners()) { getApplicationEventMulticaster().addApplicationListener(listener); }

2020-05-21 15:21:26 285

原创 Spring启动流程核心步骤:7、initMessageSource()

初始国际化资源protected void initMessageSource() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //判断本地是否包含国际化相关(messageSource)的Bean。 if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) { this.messageSource = beanFact

2020-05-21 15:20:19 203

原创 Spring启动流程核心步骤:6、registerBeanPostProcessors(beanFactory)

注册Bean相关的处理器protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);}public static void registerBeanPostProcessors( Configurable

2020-05-21 15:19:37 246

原创 Spring启动流程核心步骤:5、invokeBeanFactoryPostProcessors(beanFactory)

对于BeanFactory相关的处理器的处理protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { //在下面详细分析 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); //对L

2020-05-21 15:18:51 135

原创 Spring启动流程核心步骤:4、postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

不同子类会做不同的事情。下面将以Springboot启动是到的AnnotationConfigServletWebServerApplicationContext来做分析。 比如 :AnnotationConfigServletWebServerApplicationContext.class会进行包的扫描和一些类信息的加载、因为此类在前面没有做这一块。 protected void postProcessBeanFactory(Confi...

2020-05-21 15:17:30 351

原创 Spring启动流程核心步骤:3、prepareBeanFactory(beanFactory)

主要作用:protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // Tell the internal bean factory to use the context's class loader etc. //初始化类加载器 beanFactory.setBeanClassLoader(getClassLoader()); //初始化SPEL解析器,也就是EL表..

2020-05-21 15:07:54 200

原创 Spring启动流程核心步骤: 2、obtainFreshBeanFactory()

2、初始化容器、初始化处理器、加载beanDefinition信息protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {refreshBeanFactory();return getBeanFactory();}有两种实现 : 1、先看咱们项目中注解方式启动采用的GenericApplicationContext@Overrideprotected final void r...

2020-05-21 15:06:36 188

原创 Spring启动流程核心步骤 :1、prepareRefresh()

1、容器初始化protected void prepareRefresh() {// Switch to active.this.startupDate = System.currentTimeMillis();this.closed.set(false); //设置上下文状态this.active.set(true);// Initialize any placeholder property sources in the contex...

2020-05-21 15:04:43 253

原创 Spring容器启动流程分析

Spring版本:5.1.8.RELEASEAnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);因为我们实例采用注解驱动的,因此我们的容器实例为:AnnotationConfigApplicationContext分析类的继承关系refresh()方法是容器启动最重要的流程,没有之一,里面完成了容器的...

2020-05-21 15:01:35 376

原创 Redis面试题整理(有的乱后续会分模块整理)

过期策略:定时删除、惰性删除和定期删除。1、Redis过期键删除策略删除策略 使用的是惰性删除和定期删除两种策略相结合。 定期删除:指的是 redis 默认每秒10次,就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例、使用快慢两种速率模式回收键,默认采用慢模式,随时检查20个...

2020-03-02 10:46:00 1514 1

转载 10、详解Condition的await和signal等待通知机制

1.Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来...

2019-12-24 11:43:46 175

转载 9、深入理解读写锁ReentrantReadWriteLock

1.读写锁的介绍在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized(关于synchronized可以看这篇文章)或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获取锁。而在一些业务场景中,大部分只是读数据,写数据很少,如果仅仅是读数据的话并...

2019-12-24 11:42:21 137

转载 8、彻底理解ReentrantLock

ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入。与此同时,Reen...

2019-12-24 11:41:15 111

原创 7、(AQS)AbstractQueuedSynchronizer

参考资料:https://www.cnblogs.com/chengxiao/archive/2017/07/24/7141160.html 同步器是用来构建锁和其他同步组件的基础框架,它的实现主要依赖一个int成员变量来表示同步状态以及通过一个FIFO队列构成等待队列。它的子类必须重写AQS的几个protected修饰的用来改变同步状态的方法,其他方法主要是实现了排队和阻塞机制。状态的...

2019-12-24 11:40:17 109

原创 6、原子性、可见性和有序性以及原因

1. 三大性质简介synchronized: 具有原子性,有序性和可见性;volatile:具有有序性和可见性在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性。关于synchronized和volatile已经讨论过了,就想着将并发编程中这两大神器在原子性...

2019-12-24 11:37:41 319

原创 4、volatile

1. volatile简介自我总结:synchronized: 具有原子性,有序性和可见性;volatile:具有有序性和可见性另外的参考资料: https://blog.csdn.net/yinbucheng/article/details/71305951在for()循环或者while()内容中对voilate赋值不生效。for (Node<E> h = h...

2019-12-24 11:32:41 319

原创 3.、synchronized简介

synchronized简介自我理解:synchronize在JDK1.6之后进行优化升级,新增:偏向锁、轻量级锁和重量锁。性能提升很大。所以现在建议采用synchronize。在学习知识前,我们先来看一个现象:public class SynchronizedDemo implements Runnable {private static int count = 0;...

2019-12-24 11:31:15 170 1

原创 2、java内存模型以及happens-before规则

1. JMM的介绍自我理解:出现线程安全的原因:一般是因为主内存和工作内存数据不一致性和重排序导致的。在单线程当中:as-if-serial会保证顺序执行和重排序之后的结果是一致的。在多线程的前提下:JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证,JMM中happens-before原则会提供六种规则,如果A线程的写操作a与B线程的读操作b之间存...

2019-12-24 11:30:17 136

原创 1、线程的状态转换以及基本操作

在上一篇文章中并发编程的优缺点谈到了为什么花功夫去学习并发编程的技术,也就是说我们必须了解到并发编程的优缺点,我们在什么情况下可以去考虑开启多个线程去实现我们的业务,当然使用多线程我们应该着重注意一些什么,在上一篇文章中会有一些讨论。那么,说了这么多,无论是针对面试还是实际工作中作为一名软件开发人员都应该具备这样的技能。万事开头难,接下来就应该了解如何新建一个线程?线程状态是怎样转换的?关于线...

2019-12-24 11:29:28 136

转载 0、final的具体使用场景

final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类。即使能够知道final具体的使用方法,我想对final在多线程中存在的重排序问题也很容易忽略,希望能够一起做下探讨。2. final的具体使用场景final能够修饰变量,方法和类,也就是final使用范围基本涵盖了java每个地方,下面就分别以锁修饰的位置:...

2019-12-24 11:23:36 385

原创 Hystrix源码解析流程(二):Hystrix熔断过程分析

类分析图:测试用例:@RestControllerpublic class DeptController { @RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET) @HystrixCommand(fallbackMethod = "processHystrix_Get") public D...

2019-09-09 17:02:10 533

原创 Hystrix源码解析流程(一):真正调用前的准备工作

SpringCloud版本:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.SR3</versi...

2019-09-03 12:40:05 269

空空如也

空空如也

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

TA关注的人

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