Home > Java > javaTutorial > spring-: who-calls-setBeanName()?

spring-: who-calls-setBeanName()?

Mary-Kate Olsen
Release: 2025-01-28 22:05:10
Original
675 people have browsed it

spring-: who-calls-setBeanName()?

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

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

defined in the configuration or default

Bean name BeanNameAware. setBeanName() When is it called?


setBeanName() Bean initialization stage

:
  1. After

    Bean instantiated, But In any other initialized callback

    (such as

    or setBeanName()) before call. @PostConstruct InitializingBean.afterPropertiesSet() The order of the event :

    The surrounding life cycle events are shown below:
  2. Spring container instantiated bean. Spring determines the name of the bean from the configuration (such as

    or

    ). setBeanName()

    If bean is implemented, the
      method is called, and the name of the bean is passed as a parameter.
    1. Relying on injection and other initialization operations.
    2. @Bean @Component
    3. BeanNameAware How to call Spring setBeanName()?
    Bean's registration period
  3. :

Spring register all bean to the

application context setBeanName(). When registering Bean, it associates its name with Bean (explicitly defined or automatically generated).

  1. Check :

    During the initialization period, Spring will check whether bean has achieved . If so, Spring will automatically call the method.

  2. Pass the name of the bean : BeanNameAware The name of the bean passed to is:

    BeanNameAware The name specified in the configuration (setBeanName() or

    ).
  3. 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:
    <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>
    Copy after login

    Practice example

    bean definition

    <code class="language-java">@Configuration
    public class AppConfig {
    
        @Bean(name = "tenantA-dataSource")
        public TenantDataSource tenantADataSource() {
            return new TenantDataSource();
        }
    }</code>
    Copy after login

    bean implementation

    <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>
    Copy after login

    Main application

    <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>
    Copy after login
    Output

    <code>setBeanName() called for: tenantA-dataSource, resolved tenant: tenantA
    Connecting to database: jdbc:mysql://localhost:3306/tenantA_db</code>
    Copy after login
    Use case

    setBeanName()

    Dynamic configuration
      :
    1. Use the name of the bean to associate (such as the attributes specific to the tenants).

      Debug

      :
    2. Add debugging or log records according to the name of the bean.

      Programming custom

      :

    3. Dynamically modify Bean behavior according to the Bean name.
    4. When to avoid the use of

    For most applications, it is more practical to rely on
    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!

    source:php.cn
    Statement of this Website
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
    Latest Articles by Author
    Popular Tutorials
    More>
    Latest Downloads
    More>
    Web Effects
    Website Source Code
    Website Materials
    Front End Template