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
setBeanName()
. Jika ia dilaksanakan, Spring akan secara automatik memanggil kaedah dan menghantar nama kacang setBeanName()
yang ditakrifkan dalam konfigurasi atau lalai
. BeanNameAware
setBeanName()
Bilakah ia dipanggil?
setBeanName()
: 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:
Spring menentukan nama kacang dari konfigurasi (seperti atau
).
setBeanName()
Jika kacang dilaksanakan, kaedah
@Bean
@Component
BeanNameAware
? setBeanName()
setBeanName()
:
Semasa tempoh permulaan, musim bunga akan memeriksa sama ada kacang telah mencapai. Jika ya, Spring secara automatik akan memanggil kaedah .
:
BeanNameAware
Nama kacang yang diluluskan kepada adalah:
Nama yang dinyatakan dalam konfigurasi (BeanNameAware
atau setBeanName()
).
).
setBeanName()
@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>
<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()
Gunakan nama kacang untuk bersekutu (seperti atribut khusus kepada penyewa).
debug
:Pengaturcaraan Custom
:
bila hendak mengelakkan penggunaan
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!