spring-: who-calls-setBeanName()?
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; } }
Copy after login
Practice example
bean definition
@Configuration public class AppConfig { @Bean(name = "tenantA-dataSource") public TenantDataSource tenantADataSource() { return new TenantDataSource(); } }
Copy after loginbean 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); } }
Copy after loginMain application <主>
Output <输>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(); } }
Copy after loginUse case<code>setBeanName() called for: tenantA-dataSource, resolved tenant: tenantA Connecting to database: jdbc:mysql://localhost:3306/tenantA_db</code>
Copy after login
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!

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

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

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics





Troubleshooting and solutions to the company's security software that causes some applications to not function properly. Many companies will deploy security software in order to ensure internal network security. ...

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...

Field mapping processing in system docking often encounters a difficult problem when performing system docking: how to effectively map the interface fields of system A...

Start Spring using IntelliJIDEAUltimate version...

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

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...

How to convert names to numbers to implement sorting within groups? When sorting users in groups, it is often necessary to convert the user's name into numbers so that it can be different...

Analysis of memory leak phenomenon of Java programs on different architecture CPUs. This article will discuss a case where a Java program exhibits different memory behaviors on ARM and x86 architecture CPUs...
