The Spring framework is in the Bean initialization stage. As part of the Spring Bean life cycle, the
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
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 instantiated, But In any other initialized callback
(such as or 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). setBeanName()
@Bean
@Component
BeanNameAware
How to call Spring setBeanName()
? 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
corresponding ).
setBeanName()
@Bean(name = "myBean")
The following is the way Spring calls @Component("myBean")
in the Bean's life cycle: <code class="language-java">// 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; } }</code>
<code class="language-java">@Configuration public class AppConfig { @Bean(name = "tenantA-dataSource") public TenantDataSource tenantADataSource() { return new TenantDataSource(); } }</code>
<code class="language-java">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); } }</code>
<code class="language-java">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(); } }</code>
<code>setBeanName() called for: tenantA-dataSource, resolved tenant: tenantA Connecting to database: jdbc:mysql://localhost:3306/tenantA_db</code>
setBeanName()
Use the name of the bean to associate (such as the attributes specific to the tenants).
Debug
:Programming custom
:
When to avoid the use of
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!