自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 spring源码(AOP(Cglib))

由参数可以看出,LoadingCache存储着两个Function类型的函数式接口,一个是Generic所包含的key值,如上图。这里式现将GET_KEY对应的函数式接口创建好,方便接下来执行ClassLoaderData方法创建LoadingCache时候要传进来的参数GET_KEY。总由图可以看到这个代理对象里面的属性值都是默认值,如果想调用代理方法需要对这几个属性进行设置。点进去,可以看到这个创建的代码和创建KeyFactory时的代码是一样的。下面是创建自定义的代理对象的部分。

2024-07-31 17:13:26 178

原创 【无标题】

当我们在 调用某个对象的时候,如果检测到当前对象是被代理,那么直接创建代理对象覆盖即可。这个匿名内部类(也就是Lamda表达式),会被存储在三级缓存中,当需要的时候必须要有,如果不需要,就在生成完整的对象之后,删除三级缓存。我们传进去生成代理对象的匿名内部类,当需要代理对象的时候,直接调用匿名内部类创建代理对象即可。①在进行属性注入的时候,调用到该对象,查看该对象是否需要被代理,如果需要直接创建代理对象。注意,引用对象在实例化的时候,如果被引用的对象是代理对象,在什么时候生成具体的代理对象。

2024-07-16 13:46:40 165

原创 spring中的几种创建对象的方式

①通过beanPostprocessor生成代理对象,(实现接口InstantiationAwareBeanPostProcessor)③通过FactoryBean创建对象 (实现方法,getObject)②通过反射生成对象 (Class.forName)⑤通过supplier创建对象。④通过FactoryMethod创建对象。

2024-07-15 15:06:06 197

原创 2.2.1、spring源码2(finishBeanFactoryInitialization)

主要是做对beanName的处理,因为有时候传进来的beanName带有&的前缀,看下面的源码,如果不带&直接返回beanName,如果没有则进行截取操作返回对应的beanName。从代码中可以看出,先从缓存中获取,分别从一级缓存,二级缓存,三级缓存中获取,因为之前并没有创建号的对象,所以这里的一级缓存为空,下面是判断条件中的isSingletonCurrentlyInCreation方法。if (singletonObject == null)因为singletonObject为空,所以进入,

2024-07-01 17:58:38 1525

原创 spring源码(invokeBeanFactoryPostProcessors)

PriorityOrdered是子类的,Ordered是父类,先把子类和父类的排序都执行了,剩下的就是执行不排序的。点进getBeanFactoryPostProcessors,可以看到在get上面有对应的add方法。点进invokeBeanFactoryPostProcessors。先贴一下这个方法的代码。

2024-06-27 17:22:29 172 1

原创 报503 service unavaliable

springcloud 版本问题,在2020.0.0版本之前会自动引入Netflix Ribbon依赖,Netflix Ribbon功能跟loadbalancer一样,因Netflix公司停止维护Ribbon后, 在Spring Cloud 2020.0.0版本之后Spring使用loadbalancer替代了Ribbon, 但是loadbalancer依赖需要手动引入. 所以如果你使用的Spring Cloud版本是2020.0.0或更高的版本, 添加loadbalancer依赖即可解决503的问题。

2023-09-14 16:59:09 270 1

原创 报javax.validation.constraints不存在报错

使用2.4.12版本的SpringBoot,那么validation默认被移除了,所以添加上述依赖。

2023-09-14 13:41:14 1088 1

原创 spring源码(事务(配置文件的加载及对象的创建))

因为adviceBeanName是myAdvice,这里getBean就是获取一个beanName=myAdvice,Class=Advice的对象,接下来就是创建myAdvice对象流程。点进去,创建advisor类型的DefaultBeanFactoryPointcutAdvisor对象,走创建对象的流程。看一下BEANS_NAMESPACE_URI对应的值,可以看到默认的命名空间对应的是bean的命名空间。走完下面的步骤,到此populateBean方法走完,看一下当前对象的值的情况。

2023-08-23 11:27:02 89

原创 【无标题】

点进MethodCacheKey,可以看到每个MethodCacheKey的构造器带有hashcode,说明每次创建的该对象都是唯一的。这里获取的targetSource是createProxy的时候传进来的要代理的对象,只是这个对象被封装了。点进getInterceptorsAndDynamicInterceptionAdvice。点进getInterceptorsAndDynamicInterceptionAdvice。对于getInstance。只添加这三个adapter。

2023-08-09 08:41:59 48 1

原创 Spring源码(AOP动态代理过程)

如果有在配置文件的proxy-target-class属性设置为true,这个方法返回结果就会为true。这里的KeyFactory使用了动态代理来实现的,适用动态代理来实现的原因如下图。可以看到around-->before-->around-->after-->afterReturning,往回走。因为KeyFactory是EnhancerKey类型,EnhancerKey是一个内部接口,需要代理类来实现。可以看到around-->before-->around-->after,往回走。

2023-08-07 14:56:49 80

原创 spring源码(AOP(JDK))

是BiFunction类型的,看一下这个接口的具体定义.传进去的key对应类加载器,parameter对应Caculator的Class。第一次遍历只是对supplier和Factory执行赋值,第二次循环,supplier就有值了,这时候就会执行。上图方法之行为完毕,执行完supplier.get方法。执行完毕,可以看到创建了一个代理类。看一下代理中的apply实现。点进去看这个方法如何实现。apply方法的其余实现。接下来看一下源码中的实现。执行完毕,到此执行到这。先贴一下自己实现的代码。

2023-07-31 11:08:04 46 1

原创 spring源码(AOP(准备工作))

对象的创建流程logUtil-->在resolveBeforeInstantion(在实例化之前)会获取BeanFactory中的所有AspectJPointCutAdvisor并创建-->创建AspectJPointCutAdvisor的内部类MethodLocatingFactoryBean,myPoint,创建logUtil对象的时候执行isInfrastructureClass,如果是true就直接不执行后面的判断,如创建后续的AspectJPointCutAdvisor对象的时候就是这个流程。

2023-07-27 13:53:01 136 2

原创 spring源码(执行初始化)

1)判断是否是那六中Aware,如果是其中任意一种,对bean设置对应的值2)判断是否是import类型的Aware,如果是,做一些处理3)不做任何处理,直接返回4)从元数据中获取init方法并执行。到此,返回经过PostProcessor处理的bean我们继续走往下走,走到initializeBean的invokeInitMethods,点进去走到afterPropertiesSet可以看到在这里创建对象,并赋值给singletonInstance。

2023-07-20 13:22:24 72

原创 spring源码(属性填充(填充具体属性))

前面我们在对引用属性和@Autowired注解标注的属性进行赋值之后,接下来我们对具体的属性进行赋值。以address属性为例,在注入的时候就进入RuntimeBeanReference类型。到此applyPropertyValues执行完毕,也就是populate执行完毕。到此类型转换完成,接着就把它方法创建出来的深拷贝对象中去。到此返回一个对应这个属性名称的Object类型的值。有哪些属性需要我们进行赋值,我们打开pvs看一下。走到这所有的属性都是未转换过的属性,点进去,前面的方法不看,

2023-07-19 16:00:52 130

原创 spring源码(填充属性(自动装配))

这里的返回结果为false,如图。

2023-07-18 11:04:29 172 1

原创 通过反射创建对象

上面我们已经看完调用postProcessMergedBeanDefinition方法,接着我们继续往下走,调用findResourceMetadata,其实这个方法和findLifecycleMetadata方法类似,只是处理的对象不一样,上面是针对Lifecycle,接下来是针对Resource的。可以看到,在这里面做了设置转换服务注册值处理器。在这里做这些操作的原因是:我们在配置文件中设置的值都是string类型的,但这个值不一定是string类型的,所以对设置的值需要进行类型转换等处理操作。

2023-07-13 13:58:47 2088 1

原创 通过getFactoryMethod方式创建对象

继续往里面走,可以看到遍历获得的方法,如果candidate的修饰符与isStatic一致且candidate有资格作为mdb的工厂方法,就将方法添加进list中。所以返回的是ReflectionUtils.getAllDeclaredMethods(factoryClass)的结果,这个方法将该类和父类 的方法都返回回来,看一下返回的方法。getUserClass查看是否有子类,并返回对应的Class.我们这里还是原来传进去的类型,说明我们这个类不是动态代理实现的东西。就调用到我们要执行的方法。

2023-07-11 13:37:10 187 1

原创 通过supplier创建对象

方法,看里面怎么走。点进去,就调用到createUser方法,这是就返回了我们要创建的User对象。断点打在这里,执行到下面finishBeanFactoryInitialization创建User的时候会打到这里。可以看到User对象可以获取到该值,因为这里不为空,所以进入,点进obtainFromSupplier方法。这里补充一下,Supplier是函数式接口,当调用get()方法的时候,其实是调用传进来的方法。从下面的截图中可以看出,包装类中有值。接下来我们看在源码中是怎么走的。

2023-07-10 14:31:09 143 1

原创 通过BPP实现动态代理

因为我们写了一个bpp,所以我们这里点进registerBeanPostProcessor, 对于要注册的myInstantiationAwareBeanPostProcessor,因为我们还没有创建这个对象,所以我们会先走创建流程,这里我们从createbean方法开始看起,前面的流程和以前一样。,走到这里我们就开始创建我们写的一些对象,比如beforeInstantiation,同样要走创建对象的流程,前面的步骤省略,走到resolveBeforeInstantiation。往下走,返回一个代理对象。

2023-07-10 10:23:13 61 1

原创 loopup-method方法在源码中的流程

在这里我们可以看到lookup-method和method-replace对应的下表分别是1和2,并且定义了一个回调数组,后面执行到的MethodOverrideCallbackFilter可以根据这个下表来判断是有无覆盖或哪种覆盖。进方法,就先判断bd.hasMethodOverrides(),因为我们有一个lookup-method方法,所以计算结果为true,取反就为false,没进去,往下面else方向走,点进去。可以看到在这个方法里面先创建一个增强类,并实例化该对象,并在该对象中设置了一些参数。

2023-07-06 14:51:34 114 1

原创 2.2、FactoryBean核BeanFactory两者的区别

如果使用BeanFactory,则严格遵守springBean的生命周期的接口,从实例化到初始化,到invokeAwareMethod,invokeInitMethod,before,after,此流程非常复杂。如果需要一种更加便捷的方式创建则使用FactoryBean接口,就不要遵守这个创建流程。这个接口包括isSingleton(),getObject(),getObjectType()这三种方法。相同点:FactoryBean和BeanFactory都是创建对象的。

2023-07-03 09:30:31 94 1

原创 2.1、spring源码(finishBeanFactoryInitialization)

对比beanDefinitionMap和singletonObject中的对象,singletonObject的对象是初始化过的,beanDefinitionMap中包含初始化和未初始化的对象,不在singletonObject在beanDefinitionMap的对象就是未初始化的对象。如果使用BeanFactory,则严格遵守springBean的生命周期的接口,从实例化到初始化,到invokeAwareMethod,invokeInitMethod,before,after,此流程非常复杂。

2023-06-29 15:57:18 92

原创 1、spring源码(prepareBeanFactory:准备beanFactory)

首先先贴一下prepareBeanFactory方法的代码。

2023-06-28 09:34:31 186 1

原创 1.1如何实现自定义的属性编辑器

2、让spring感知到自己定义的编辑器:自定义个一个属性编辑器的注册器,实现PropertyEditeRegister接口。1、自定义一个实现了PropertyRegisterSuppor接口的编辑器。3、让spring 能够识别到对应的注册器。address类和custom类。将注册器加入到spring中。

2023-06-26 14:31:29 198 1

空空如也

空空如也

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

TA关注的人

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