Rumah > Java > javaTutorial > Spring-: Who-calls-setBeanName ()?

Spring-: Who-calls-setBeanName ()?

Mary-Kate Olsen
Lepaskan: 2025-01-28 22:05:10
asal
675 orang telah melayarinya

spring-: who-calls-setBeanName()?

Rangka kerja musim bunga berada di peringkat inisialisasi kacang. Ini akan berlaku secara automatik jika Bean melaksanakan antara muka .

setBeanName(String beanName) Berikut adalah penjelasan terperinci apabila ketika, siapa dan bagaimana untuk memanggil: BeanNameAware

siapa yang memanggil ? setBeanName()

Spring IOC (Control Reversal) Container


Call

. setBeanName()

Apabila kacang dimulakan dan didaftarkan pada konteks musim bunga, Container Spring memeriksa sama ada Bean telah melaksanakan antara muka

. Jika ia dilaksanakan, Spring akan secara automatik memanggil kaedah dan menghantar nama kacang setBeanName() yang ditakrifkan dalam konfigurasi atau lalai

nama kacang

. BeanNameAware setBeanName() Bilakah ia dipanggil?


tahap inisialisasi kacang setBeanName():

    selepas
  1. bean instantiated,

    tetapi dalam mana -mana panggilan balik yang diasaskan lain (seperti

    atau

    ) setBeanName() sebelum panggilan. @PostConstruct Perintah peristiwa InitializingBean.afterPropertiesSet(): peristiwa kitaran hayat sekitar ditunjukkan di bawah:

  2. Bean Instantiated Spring.

    Spring menentukan nama kacang dari konfigurasi (seperti atau

    ).

    setBeanName() Jika kacang dilaksanakan, kaedah

    dipanggil, dan nama kacang diluluskan sebagai parameter.
    1. Bergantung pada suntikan dan operasi inisialisasi lain.
    2. @Bean @Component
    3. bagaimana untuk memanggil Spring BeanNameAware? setBeanName()
    4. Tempoh Pendaftaran Bean
    :
Spring Register All Bean ke
Konteks Aplikasi

. Apabila mendaftarkan kacang, ia mengaitkan namanya dengan kacang (secara jelas ditakrifkan atau dihasilkan secara automatik). setBeanName()

  1. semak

    :

    Semasa tempoh permulaan, musim bunga akan memeriksa sama ada kacang telah mencapai

    . Jika ya, Spring secara automatik akan memanggil kaedah .

  2. Lulus nama kacang

    : BeanNameAware Nama kacang yang diluluskan kepada adalah:

    Nama yang dinyatakan dalam konfigurasi (BeanNameAware atau setBeanName()).

  3. Nama lalai yang dihasilkan oleh Spring (mis., Nama Kelas, Letter Surat Pertama:
  4. sepadan

    ).

    setBeanName()

    Proses Kod Ringkas
    • Berikut adalah cara panggilan Spring @Bean(name = "myBean") dalam kitaran hidup kacang: @Component("myBean")
      <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>
      Salin selepas log masuk

      Contoh Amalan

      definisi kacang

      <code class="language-java">@Configuration
      public class AppConfig {
      
          @Bean(name = "tenantA-dataSource")
          public TenantDataSource tenantADataSource() {
              return new TenantDataSource();
          }
      }</code>
      Salin selepas log masuk

      pelaksanaan kacang

      <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>
      Salin selepas log masuk

      Aplikasi Utama

      <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>
      Salin selepas log masuk
      output

      <code>setBeanName() called for: tenantA-dataSource, resolved tenant: tenantA
      Connecting to database: jdbc:mysql://localhost:3306/tenantA_db</code>
      Salin selepas log masuk
      Gunakan kes

      setBeanName()

      konfigurasi dinamik
        :
      1. Gunakan nama kacang untuk bersekutu (seperti atribut khusus kepada penyewa).

        debug

        :
      2. Tambah debugging atau rekod log mengikut nama kacang.

        Pengaturcaraan Custom

        :

      3. secara dinamik mengubah tingkah laku kacang mengikut nama kacang.
      4. bila hendak mengelakkan penggunaan

      Bagi kebanyakan aplikasi, lebih praktikal untuk bergantung pada
      atau konfigurasi luaran.

      setBeanName() Elakkan logik terlalu rumit oleh kebergantungan nama kacang yang keras. Untuk keadaan seperti ini, lebih baik menggunakan sumber konfigurasi luaran atau penghalaan dinamik.

    Atas ialah kandungan terperinci Spring-: Who-calls-setBeanName ()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    sumber:php.cn
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Artikel terbaru oleh pengarang
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan