当前位置:网站首页>@Can component be used on the same class as @bean?
@Can component be used on the same class as @bean?
2022-07-27 21:46:00 【chenzixia】
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 )
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,
So we're 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 definition information 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 + @Bean Embellished UserManager Definition
Bean The type is also defined by ScannedGenericBeanDefinition replaced ConfigurationClassBeanDefinition
Subsequently passed BeanDefinition When creating an instance , The nature created is @Configuration + @Bean 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-projectspring-boot-bean-componenttargetclassescomleeqslmanagerUserManager.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
summary
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 @Configuration + @Bean 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 , What I said earlier is wrong , Later, I went to look through 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

Spring 4.1.2 The introduction of 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 .
边栏推荐
- Shengyang technology officially launched the remote voiceprint health return visit service system!
- B站崩了,如果我们是那晚负责修复的开发人员
- 软件测试面试题:软件测试项目从什么时候开始?为什么?
- 2021-11-05 understanding of class variables and class methods
- Talk about MySQL transaction two-phase commit
- @Detailed introduction of requestparam annotation
- How to deal with high concurrency deadlock?
- 对象在内存中存在形式&内存分配机制
- LInkedList底层源码
- Under the epidemic, the mobile phone supply chain and offline channels are blocked! Sales plummeted and inventory was serious!
猜你喜欢

In addition to "adding machines", in fact, your micro service can be optimized like this

Technical practice behind bloom model: how to refine 176billion parameter model?

ACM mm 2022 | Zhejiang University proposed: point cloud segmentation, active learning of new SOTA

除了「加机器」,其实你的微服务还能这样优化

zibbix安装部署

LinkedList underlying source code

Search, insert and delete of hash table

Graphic SQL, this is too vivid!

学完4种 Redis 集群方案要多久?我一口气给你说完

一文读懂Plato Farm的ePLATO,以及其高溢价缘由
随机推荐
For 3nm and below processes, ASML new generation EUV lithography machine exposure
三星最先进EUV产线已投产:今年7nm产能将是去年3倍
Report design - how to make your powerbi Kanban brilliant?
Who is the sanctity of the six Chinese enterprises newly sanctioned by the United States?
Search, insert and delete of hash table
Dual process theory and triple mental model
屏蔽自动更新描述文件(屏蔽描述文件)
Unit-- read Excel
Up to 7.5gbps! The world's first 5nm 5g baseband snapdragon X60 release: support the aggregation of all major bands!
Software testing interview question: when does the software testing project start? Why?
成员方法及其传参机制
腾讯云[HiFlow】| 自动化 -------HiFlow:还在复制粘贴?
Cocoapods reload
V2.x synchronization is abnormal. There are a lot of posts that cannot be synchronized in the cloud, and the synchronization is blocked and slow
紫光展锐:2020年将有数十款基于春藤510的5G终端商用
JVM-内存模型 面试总结
2021-11-05 understand main method syntax, code block and final keyword
Software testing interview question: what is regression testing?
IDEA连接MySQL数据库并执行SQL查询操作
2021-11-05 understanding of class variables and class methods