当前位置:网站首页>@What happens if bean and @component are used on the same class?
@What happens if bean and @component are used on the same class?
2022-07-07 12:06:00 【Program ape DD_】
| Doubt description
lately , In the process of development , Found a way to write before , It's like this :
In my understanding ,@Configuration Add @Bean Will create a userName Not for null Of UserManager object , and @Component It will also create a userName by null Of UserManager object .
So we inject... Into other objects UserManager Object time , Which object is injected ?
Because the project has been online for a long time , Therefore, this writing method does not compile and report errors , There was no problem with the operation . I'll find my colleagues later to find out , Actually, I want :
take effect , In fact, it did take effect . So here comes the question :Spring How many... Are there in the container UserManager Object of type ?
| Spring Boot edition
Used in the project Spring Boot The version is :2.0.3.RELEASE. Object's scope Is the default value , That is to say singleton.
The results verify that
There are many ways to verify , Sure debug Follow the source code , have a look Spring How many... Are there in the container UserManager object , You can also go straight from UserManager Construction method , See which constructor methods are called , wait .
Let's start with the construction method , have a look UserManager How many instances did you instantiate .
Only parameterized constructors are called , The nonparametric construction method remains intact ( Not called at all ). If you want to know more , You can read :Spring The cycle of dependence , Detailed analysis of source code → Do you really need level 3 cache ?
https://www.cnblogs.com/youzhibing/p/14337244.html
since UserManager The constructor is called only once , So the previous question : Which object is injected . The answer is clear , There's no choice , Can only be @Configuration Add @Bean Created userName Not for null Of UserManager object .
Here comes the question : Why not @Component Created userName by null Of UserManager object ?
The source code parsing
@Configuration And @Component It's very close .
therefore @Configuration It can be component scan.
among ConfigurationClassPostProcessor And @Configuration Is closely linked , The class inheritance structure is as follows :
It has achieved BeanFactoryPostProcessor Interface and PriorityOrdered Interface .
About BeanFactoryPostProcessor, You can see :
https://www.cnblogs.com/youzhibing/p/10559337.html
from AbstractApplicationContext Of refresh Method called invokeBeanFactoryPostProcessors(beanFactory) Start , Follow the source code .
Now it's done com.lee.qsl Under bag component scan ,com.lee.qsl Package and sub package UserConfig、UserController and UserManager All scanned . Be careful , At the moment @Bean The processing of has not yet started ,UserManager It's through @Component And the scanned ; here Spring In the container beanDefinitionMap Medium UserManager That's true .
The next step is important , It is closely related to the answer we want .
Loop recursive processing UserConfig 、UserController and UserManager, Package them all into ConfigurationClass , Recursive scanning BeanDefinition. After the cycle , Let's see configClasses.
UserConfig bean In the definition beanMethods There's an element in [BeanMethod:name=userManager,declaringClass=com.lee.qsl.config.UserConfig].
Then we went down , Let's take a closer look at the link where the answer appears .
Did you find anything ?@Component Embellished UserManager The definition is directly overridden as @Configuration [email protected] Embellished UserManager Definition .Bean The type is also defined by ScannedGenericBeanDefinition replaced ConfigurationClassBeanDefinition.
Subsequently passed BeanDefinition When creating an instance , The nature created is @[email protected] Embellished UserManager, That is, it will reflect the call UserManager The parametric construction method of .
Since then , The answer is clear .Spring In fact, it gives a hint :
2021-10-03 20:37:33.697 INFO 13600 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'userManager' with a different definition: replacing [Generic bean: class [com.lee.qsl.manager.UserManager]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\qsl-project\spring-boot-bean-component\target\classes\com\lee\qsl\manager\UserManager.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=userConfig; factoryMethodName=userManager; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/lee/qsl/config/UserConfig.class]]
Only the log level is info , It's too inconspicuous .
Spring Upgrade optimization
Probably Spring The team realized info The level is too inconspicuous , Or realize that the direct coverage is not reasonable . So in Spring 5.1.2.RELEASE (Spring Boot It is 2.1.0.RELEASE ) Optimization is made .
Let's see in detail .
Start direct error reporting ,Spring Tips are also given .
The bean 'userManager', defined in class path resource [com/lee/qsl/config/UserConfig.class], could not be registered. A bean with that name has already been defined in file [D:\qsl-project\spring-boot-bean-component\target\classes\com\lee\qsl\manager\UserManager.class] and overriding is disabled.
Let's follow the source code , Mainly look at and Spring 5.0.7.RELEASE The difference between .
New configuration item allowBeanDefinitionOverriding To control whether BeanDefinition Cover , Not allowed by default . We can configure... In the configuration file :spring.main.allow-bean-definition-overriding=true , allow BeanDefinition Cover . This treatment is better , Leave the choice to the developer , Instead of dealing with it secretly , It has achieved the effect that developers want .
total junction
Spring 5.0.7.RELEASE ( Spring Boot 2.0.3.RELEASE ) Support @Configuration+ @Bean And @Component Act on the same class at the same time . When starting, it will give info Level log prompt , At the same time @[email protected] Embellished BeanDefinition overwrite @Component Embellished BeanDefinition.
Maybe Spring The team realized that the above treatment was not appropriate , So in Spring 5.1.2.RELEASE Optimization is made . Added configuration item :allowBeanDefinitionOverriding, Give the initiative to the developer , It's up to the developer to decide whether to allow coverage .
| Add
About allowBeanDefinitionOverriding, Wrong front , I went to the source code , Supplemented as follows .Spring 1.2 introduction DefaultListableBeanFactory When it's time private boolean allowBeanDefinitionOverriding=true;, The default is to allow BeanDefinition Cover .
Spring4.1.2 introduction isAllowBeanDefinitionOverriding() Method .
Spring From beginning to end, the default is to allow BeanDefinition Covered , The change is Spring Boot ,Spring Boot 2.1.0 Not covered before Spring Of allowBeanDefinitionOverriding The default value is , Still allowed BeanDefinition Covered .
Spring Boot 2.1.0 in SpringApplication Defines private properties :allowBeanDefinitionOverriding.
The specified value is not displayed , So the default is false , After the Spring Boot During startup , Will overwrite with this value Spring Medium allowBeanDefinitionOverriding The default value of .
About allowBeanDefinitionOverriding
, I think you should have made it clear .
We have created a high-quality technical exchange group , With good people , I will be excellent myself , hurriedly Click Add group , Enjoy growing up together . in addition , If you want to change jobs recently , Years ago, I spent 2 A wave of large factory classics were collected in a week , Those who are ready to change jobs after the festival can Click here to get !
Recommended reading
··································
Hello , I'm a procedural ape DD,10 Old driver developed in 、 Alibaba cloud MVP、 Tencent cloud TVP、 I have published books and started a business 、 State-owned enterprises 4 In the Internet 6 year . From ordinary developers to architects 、 Then to the partner . Come all the way , My deepest feeling is that I must keep learning and pay attention to the frontier . As long as you can hold on , Think more 、 Don't complain 、 Do it frequently , It's easy to overtake on a curve ! therefore , Don't ask me what I'm doing now, whether it's in time . If you are optimistic about one thing , It must be persistence to see hope , Instead of sticking to it when you see hope . believe me , Just stick to it , You must be better than now ! If you don't have any direction , You can pay attention to me first , Some cutting-edge information is often shared here , Help you accumulate the capital to overtake on the curve .
边栏推荐
- Matlab implementation of Huffman coding and decoding with GUI interface
- [shortest circuit] acwing1128 Messenger: Floyd shortest circuit
- [shortest circuit] acwing 1127 Sweet butter (heap optimized dijsktra or SPFA)
- 18 basic introduction to divider separator component of fleet tutorial (tutorial includes source code)
- 大佬们有没有人遇到过 flink oracle cdc,读取一个没有更新操作的表,隔十几秒就重复读取
- 问题:先后键入字符串和字符,结果发生冲突
- Flet教程之 14 ListTile 基础入门(教程含源码)
- SwiftUI 4 新功能之掌握 WeatherKit 和 Swift Charts
- 千人规模互联网公司研发效能成功之路
- 让数字管理好库存
猜你喜欢
【数据聚类】基于多元宇宙优化DBSCAN实现数据聚类分析附matlab代码
Camera calibration (1): basic principles of monocular camera calibration and Zhang Zhengyou calibration
超标量处理器设计 姚永斌 第9章 指令执行 摘录
【纹理特征提取】基于matlab局部二值模式LBP图像纹理特征提取【含Matlab源码 1931期】
zero-shot, one-shot和few-shot
Onedns helps college industry network security
CMU15445 (Fall 2019) 之 Project#2 - Hash Table 详解
112. Network security penetration test - [privilege promotion article 10] - [Windows 2003 lpk.ddl hijacking rights lifting & MSF local rights lifting]
In SQL, I want to set foreign keys. Why is this problem
@Bean与@Component用在同一个类上,会怎么样?
随机推荐
[texture feature extraction] LBP image texture feature extraction based on MATLAB local binary mode [including Matlab source code 1931]
Summed up 200 Classic machine learning interview questions (with reference answers)
MATLAB實現Huffman編碼譯碼含GUI界面
Ask about the version of flinkcdc2.2.0, which supports concurrency. Does this concurrency mean Multiple Parallelism? Now I find that mysqlcdc is full
一起探索云服务之云数据库
核舟记(一):当“男妈妈”走进现实,生物科技革命能解放女性吗?
Half of the people don't know the difference between for and foreach???
Suggestions on one-stop development of testing life
@Bean与@Component用在同一个类上,会怎么样?
Software design - "high cohesion and low coupling"
超标量处理器设计 姚永斌 第8章 指令发射 摘录
Automated testing framework
问下flinkcdc2.2.0的版本,支持并发,这个并发是指多并行度吗,现在发现,mysqlcdc全
什么是局域网域名?如何解析?
STM32F1与STM32CubeIDE编程实例-MAX7219驱动8位7段数码管(基于SPI)
[filter tracking] strapdown inertial navigation pure inertial navigation solution matlab implementation
Sonar:cognitive complexity
开发一个小程序商城需要多少钱?
让数字管理好库存
百度数字人度晓晓在线回应网友喊话 应战上海高考英语作文