当前位置:网站首页>@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 .
边栏推荐
- Flet教程之 15 GridView 基础入门(教程含源码)
- Sonar:cognitive complexity
- <No. 9> 1805. 字符串中不同整数的数目 (简单)
- How to write test cases for test coupons?
- 即刻报名|飞桨黑客马拉松第三期盛夏登场,等你挑战
- 相机标定(2): 单目相机标定总结
- [neural network] convolutional neural network CNN [including Matlab source code 1932]
- Complete collection of common error handling in MySQL installation
- Camera calibration (1): basic principles of monocular camera calibration and Zhang Zhengyou calibration
- Enclosed please find. Net Maui's latest learning resources
猜你喜欢

Flet教程之 19 VerticalDivider 分隔符组件 基础入门(教程含源码)

SwiftUI Swift 内功之如何在 Swift 中进行自动三角函数计算

Stm32f1 and stm32subeide programming example -max7219 drives 8-bit 7-segment nixie tube (based on SPI)
![111.网络安全渗透测试—[权限提升篇9]—[Windows 2008 R2内核溢出提权]](/img/2e/da45198bb6fb73749809ba0c4c1fc5.png)
111.网络安全渗透测试—[权限提升篇9]—[Windows 2008 R2内核溢出提权]
![[texture feature extraction] LBP image texture feature extraction based on MATLAB local binary mode [including Matlab source code 1931]](/img/65/bf1d0f82878a49041e8c2b3a84bc15.png)
[texture feature extraction] LBP image texture feature extraction based on MATLAB local binary mode [including Matlab source code 1931]

超标量处理器设计 姚永斌 第8章 指令发射 摘录

【神经网络】卷积神经网络CNN【含Matlab源码 1932期】

sql里,我想设置外键,为什么出现这个问题

Nuclear boat (I): when "male mothers" come into reality, can the biotechnology revolution liberate women?

Common locking table processing methods in Oracle
随机推荐
<No. 8> 1816. 截断句子 (简单)
开发一个小程序商城需要多少钱?
Fleet tutorial 14 basic introduction to listtile (tutorial includes source code)
Flet教程之 19 VerticalDivider 分隔符组件 基础入门(教程含源码)
Enclosed please find. Net Maui's latest learning resources
Is it safe to open Huatai's account in kainiu in 2022?
Onedns helps college industry network security
Steps of redis installation and self startup configuration under CentOS system
There are so many factors that imprison you
The function of adding @ before the path in C #
[texture feature extraction] LBP image texture feature extraction based on MATLAB local binary mode [including Matlab source code 1931]
Camera calibration (2): summary of monocular camera calibration
R language uses the quantile function to calculate the quantile of the score value (20%, 40%, 60%, 80%), uses the logical operator to encode the corresponding quantile interval (quantile) into the cla
相机标定(1): 单目相机标定及张正友标定基本原理
What is high cohesion and low coupling?
How much do you know about excel formula?
本地navicat连接liunx下的oracle报权限不足
【紋理特征提取】基於matlab局部二值模式LBP圖像紋理特征提取【含Matlab源碼 1931期】
R language Visual facet chart, hypothesis test, multivariable grouping t-test, visual multivariable grouping faceting boxplot, and add significance levels and jitter points
全球首堆“玲龙一号”反应堆厂房钢制安全壳上部筒体吊装成功