method is called. This will happen automatically if Bean implement the interface. setBeanName(String beanName)
BeanNameAware
The following is a detailed explanation of when when, who and how to call:
setBeanName()
Who calls ?
Spring IOC (control reversal) container
call setBeanName()
.
When Bean is initialized and registered to the Spring context, the Spring container checks whether Bean has implemented the interface. If it is implemented, Spring will automatically call the method and transmit the setBeanName()
Bean name
Bean name BeanNameAware
. setBeanName()
When is it called?
setBeanName()
Bean initialization stage
: - After
Bean instantiated, But In any other initialized callback
(such asor
The surrounding life cycle events are shown below:setBeanName()
) before call.@PostConstruct
InitializingBean.afterPropertiesSet()
The order of the event : -
Spring container instantiated bean. Spring determines the name of the bean from the configuration (such as
or).
If bean is implemented, thesetBeanName()
- method is called, and the name of the bean is passed as a parameter.
- Relying on injection and other initialization operations.
-
@Bean
@Component
-
BeanNameAware
How to call SpringsetBeanName()
?
Bean's registration period :
Spring register all bean to the
application context setBeanName()
. When registering Bean, it associates its name with Bean (explicitly defined or automatically generated).
-
Check :
During the initialization period, Spring will check whether bean has achieved . If so, Spring will automatically call the method.
-
Pass the name of the bean :
BeanNameAware
The name of the bean passed to is:BeanNameAware
The name specified in the configuration (setBeanName()
or - The default name generated by Spring (e.g., class name, first letter sketch:
corresponding ).
setBeanName()
- Simplified code process
-
@Bean(name = "myBean")
The following is the way Spring calls@Component("myBean")
in the Bean's life cycle:
// Spring容器初始化(伪代码) public class BeanFactory { public Object createBean(Class<?> beanClass, String beanName) { // 步骤1:实例化bean Object bean = instantiateBean(beanClass); // 步骤2:检查bean是否实现了BeanNameAware if (bean instanceof BeanNameAware) { // 步骤3:调用setBeanName()并传递bean的名称 ((BeanNameAware) bean).setBeanName(beanName); } // 步骤4:继续进行依赖注入和其他生命周期回调 injectDependencies(bean); initializeBean(bean); return bean; } }
Practice example
bean definition
@Configuration public class AppConfig { @Bean(name = "tenantA-dataSource") public TenantDataSource tenantADataSource() { return new TenantDataSource(); } }
bean implementation
import org.springframework.beans.factory.BeanNameAware; public class TenantDataSource implements BeanNameAware { private String tenantName; private String databaseUrl; @Override public void setBeanName(String beanName) { // 从bean名称中提取租户名称 if (beanName.contains("-")) { this.tenantName = beanName.split("-")[0]; } else { throw new IllegalArgumentException("无效的bean命名约定。预期格式:<tenantname>-dataSource"); } // 根据租户名称动态分配数据库URL this.databaseUrl = "jdbc:mysql://localhost:3306/" + tenantName + "_db"; System.out.println("setBeanName() called for: " + beanName + ", resolved tenant: " + tenantName); } public void connect() { System.out.println("Connecting to database: " + databaseUrl); } }
Main application
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { // 初始化Spring上下文 ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); // 获取bean TenantDataSource tenantA = (TenantDataSource) context.getBean("tenantA-dataSource"); // 使用bean tenantA.connect(); } }
Output<code>setBeanName() called for: tenantA-dataSource, resolved tenant: tenantA Connecting to database: jdbc:mysql://localhost:3306/tenantA_db</code>
Use case
setBeanName()
- :
-
Use the name of the bean to associate (such as the attributes specific to the tenants).
Debug
: - Add debugging or log records according to the name of the bean.
:
Dynamically modify Bean behavior according to the Bean name. -
or external configuration.setBeanName()
Avoid the logic too complicated by hard -coding Bean name dependencies. For this kind of situation, it is best to use an external configuration source or dynamic routing. -
The above is the detailed content of spring-: who-calls-setBeanName()?. For more information, please follow other related articles on the PHP Chinese website!

Start Spring using IntelliJIDEAUltimate version...

When using MyBatis-Plus or other ORM frameworks for database operations, it is often necessary to construct query conditions based on the attribute name of the entity class. If you manually every time...

Java...

How does the Redis caching solution realize the requirements of product ranking list? During the development process, we often need to deal with the requirements of rankings, such as displaying a...

Conversion of Java Objects and Arrays: In-depth discussion of the risks and correct methods of cast type conversion Many Java beginners will encounter the conversion of an object into an array...

Solutions to convert names to numbers to implement sorting In many application scenarios, users may need to sort in groups, especially in one...

Detailed explanation of the design of SKU and SPU tables on e-commerce platforms This article will discuss the database design issues of SKU and SPU in e-commerce platforms, especially how to deal with user-defined sales...

How to set the SpringBoot project default run configuration list in Idea using IntelliJ...


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

SublimeText3 Chinese version
Chinese version, very easy to use

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

Notepad++7.3.1
Easy-to-use and free code editor