
spring
文章平均质量分 86
小幸运-s
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
从根儿上学习spring 十一 之run方法启动第四段(5)
如果该方法返回了false说明bean属性已设置完毕不需要populateBean方法后续继续对bean进行属性设置。这几行的逻辑就是调用了invokeAwareMethods(beanName, bean)方法,这个方法的逻辑很简单就是判断当前初始化的bean是不是实现了Aware接口,如果实现了该接口那么就判断具体的Aware接口类型,比如是否是BeanNameAware接口,是的话则调用其setBeanName方法等等,这个方法很简单大家自己点进去看下就明白了,我就不赘述了。我们看下该方法的代码。原创 2024-08-04 22:13:06 · 743 阅读 · 0 评论 -
从根儿上学习spring 十 之run方法启动第四段(4)
这其实主要是为了防止这个bean存在动态代理的情况,如果存在动态代理那这个bean的引用就会更改,从普通的bean变成动态代理的bean,如果这时候简单的把刚实例化好的普通bean暴露出去那就会有问题。这就得结合bean的初始化生命周期来看,这时候的bean实例是创建出来了,相当于new出来一个完全新的对象,而对象的属性还没设值,所以这时候对beanDefinition的操作也最多是影响bean的属性初始化。当前bean是A,在初始化属性B的时候又会尝试去获取A,所以会再次走到A的初始化过程)原创 2024-08-04 22:10:35 · 827 阅读 · 0 评论 -
从根儿上学习spring 九 之run方法启动第四段(3)
一般情况下调用doGetBean方法获取的bean实例都是为了真实使用的,像我们上面举得A,B对象的例子获取的A,B对象当然都是为了真实使用的,但有种场景就只是为了做类型检查,比如有时候为了判断FactoryBean里的对象的类型就要先获取FactoryBean再通过getObject方法获取里面的真实对象来判断其类型,这时获取的FactoryBean实例可能就只是为了类型检查并不是为了真实使用。二:当bean是多例时,会有不同的创建bean的逻辑,下面我们按照代码顺序先分析单例的情况。原创 2024-08-04 22:07:39 · 1036 阅读 · 0 评论 -
从根儿上学习spring 八 之run方法启动第四段(2)
后面我们讲bean的初始化过程还会讲到这里就先到这。假设spring先初始化A,这时候发现A依赖B所以在初始化A的过程中被打断跑去实例化并初始化B(注意这时候A的初始化过程被打断了),在初始化B的时候发现B又依赖A,spring又尝试去初始化A,这时候调用getSingleton(String beanName, boolean allowEarlyReference)方法时(beanName为A),isSingletonCurrentlyInCreation(beanName)方法就会返回true。原创 2024-08-04 22:03:51 · 771 阅读 · 0 评论 -
从根儿上学习spring 七 之run方法启动第四段(1)
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors方法的逻辑准确来说的话就是执行了了两个接口的两个方法,分别是BeanFactoryPostProcessor接口的postProcessBeanFactory方法和BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法,执行顺序是先执行前者再执行后者。让我们直接进入正题。原创 2024-08-04 21:58:50 · 1069 阅读 · 0 评论 -
从根儿上学习spring 六 之run方法启动第三段
362行就不需要多说啥了,363行是对applicationContext就行后置处理,postProcessApplicationContext方法的逻辑是向applicationContext里设置BeanNameGenerator对象(该对象用来生成bean名称的,如果你有指定的话)以及设置ResourceLoader接口实现,该接口主要用来加载classpatch下的资源,后面用到我们再细说。解释完BeanDefinitionLoader我们直接到图5的696行的load()方法里看看它做了啥。原创 2024-08-04 21:55:10 · 535 阅读 · 0 评论 -
从根儿上学习spring 五 之run方法启动第二段
讲完了PropertySources和PropertySource,我们再回头看图6的方法configurePropertySources方法似乎变得很简单没必要一行行分析了吧,这个方法就是向environment的sources属性里加入启动时的两个PropertySource,有不清楚的同学再结合我上面说的对着代码看两遍就清楚了,我就不再赘述了。Environment接口继承了PropertyResolver接口,PropertyResolver接口主要提供了获取配置属性的方法,如图3所示。原创 2024-08-04 21:51:20 · 780 阅读 · 0 评论 -
从根儿上学习spring 四 之run方法启动第一段
由上图可以看到在getSpringFactoriesInstances方法里先获取了类加载器,然后使用SpringFactoriesLoader.loadFactoryNames(type, classLoader)方法是获取所有META-INF/spring.factories资源文件里的数据,META-INF/spring.factories文件里的内容大概是xxx=yyyy的形式,而这里的xxx就是type.getname()的值,yyyy就是获取到的names集合里的每个string值。原创 2024-08-04 21:46:50 · 805 阅读 · 0 评论 -
从根儿上学习spring 三 之依赖注入原理了解
举个例子,你为公司所有业务部门写了一个针对一些中间件优雅下线的通用功能,可你不确定后面公司业务部门会不会后面引入其它的中间件,所以你定义了一个接口GraceDownInteface,接口里定义一个下线方法,规定所有实现了该接口的方法在服务挂掉前都会被自动执行。前面的beanFactory和bean分别代表需要扩展的对象,BeanFactory是spring的 bean容器,bean就是spring创建的bean实例。针对上面的步骤我们都可以对其做扩展处理,并且可以在每步的前后都可以做扩展处理。原创 2024-08-04 21:42:52 · 505 阅读 · 0 评论 -
从根儿上学习spring一 之杂谈
从根儿上学习spring原创 2024-08-04 21:37:30 · 544 阅读 · 0 评论 -
从根儿上学习spring 二 之依赖注入原理了解
很快我们发现在SpringApplication#prepareContext里使用了getAllSources方法,在并将获取到的primarySources属性传给了SpringApplication类的load方法,跟随着load方法一步一步debug下去就会发现spring把TestMain.class封装成了BeanDefinition,并放到了DefaultListableBeanFactory的Map类型的beanDefinitionMap属性中了,key为testMain。原创 2024-08-04 21:40:28 · 718 阅读 · 0 评论 -
org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean
今天写工具方法在,在一个被其他工程依赖的项目里加了一个dao类,其它依赖项目报错org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'hqAuthMapperExt' for bean class [com.hunqingplatfor...原创 2019-11-19 22:28:21 · 2534 阅读 · 1 评论 -
AutowiredAnnotationBeanPostProcessor和RequiredAnnotationBeanPostProcessor源码简析
首先声明,本人正在努力学习spring源码,如果有志同道合的朋友可以先私信然后加好友讨论。本文比较简单由于刚看不久更多的起到记录笔记的作用,欢迎各位大佬指出问题。 首先提出问题:1.spring在什么时候开始解析@Autowired注解实现依赖注入的呢?2.@Qualifier又是如何与@Autowired配合使用的呢? 首先要明确一点的是,在spring解析beanD...原创 2019-11-18 11:48:25 · 746 阅读 · 0 评论 -
spring创建aop代理对象流程分析
1.在实例化bean之后会调用AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsAfterInitialization方法,该方法会找到所有实例化好的BeanPostProcessor对bean进行后置处理2.AbstractAutoProxyCreator的postProcessAfterInitialization方法会...原创 2019-11-04 19:43:40 · 940 阅读 · 0 评论 -
spring源码获取所有Advisor记录
接着上一篇spring实例化包含@Transational注解类(不论是类上还是方法上)的流程。1.在BeanPostProcesser的实现类AbstractAutoProxyCreator的wrapIfNecessary方法里调用getAdvicesAndAdvisorsForBean方法2.在其父类AbstractAdvisorAutoProxyCreator的getAdvice...原创 2019-10-31 16:02:46 · 414 阅读 · 0 评论 -
spring @Transational注解注释的方法或者类的初始化流程
1.入口是AbstractApplicationContext类的refresh方法调用finishBeanFactoryInitialization方法2.进入finishBeanFactoryInitialization方法的beanFactory.preInstantiateSingletons()方法3.在preInstantiateSingletons方法里调用getBe...原创 2019-10-31 13:14:20 · 350 阅读 · 0 评论 -
关于junit单元测试时用户线程自动终止问题
在使用junit单元测试spring boot rabbitMQ时在onmessage方法里接收到消息正断点着呢,突然线程自动断掉了,一脸懵逼的我各种找rabbitmq的过期配置设置了一些值后再测试发现断点时间延长了,可并不是我设置的时间,无论我设置多长程序都会在一个固定时间内推出。再不使用junit测试时却不会出现这种情况。 所以断定肯定是junit的问题,百度下说junit...原创 2018-08-15 11:47:07 · 3157 阅读 · 0 评论 -
spring mvc接受前台formdata 文件后台无法接收到文件
今天同事接收前台传的excel的文件 怎么也接收不到 。用form表单却可以正常接收到 。然后我怀疑是前端的表单有问题。虽然他传的formdata里加了name 可我在input里再次加了name才可以正常接收。 可想而知input的name还是不能省下的。之前网上虽然说使用formdata上传文件并不需要form表单 可之前试了不行可能写法不同吧 前台必须加上form才行,原创 2017-09-26 11:13:43 · 5327 阅读 · 0 评论 -
关于spring使用@value注解获取properties文件属性问题
最近使用java加载properties文件内容 突然想到了@value不是可以做这样的工作嘛 。于是换成@value来加载 由于没用过这个注解还是导致了一些问题 这里来记录下。 首先我的spring配置文件如下 然后使用 @Value("#{configProperties['a原创 2017-08-01 10:04:56 · 3547 阅读 · 0 评论 -
spring使用map接收前台整型数据
spring MVC接收map对象参数 如果参数里有前台传来的数字类型 ,比如flag=2这时你可别直接使用Integer去强转 Integr intData=(Integer)map.get("flag")。因为前台传到后台的数据默认都是字符串所有这里map.get("flag")接收到的实际类型是字符串(尽管你可能声明的map参数泛型是String,Object)。所以你需要使用Integer原创 2017-02-23 21:47:29 · 2112 阅读 · 0 评论