Spring中Bean命名的方式總結(jié)
在 Spring 框架中,每個 bean 必須至少有一個唯一的名稱。Spring 遵循簡單且默認(rèn)的命名策略來確定 bean 的名稱,無論我們使用 XML 配置還是基于Java代碼配置。本文將詳細(xì)討論這些策略。
1.使用@Component的默認(rèn)Bean命名
默認(rèn)情況下,Spring會使用聲明Bean類型的簡單名稱,將第一個字母改為小寫,并使用生成的值來命名Bean。此種方式適用于所有定型注解(@Service
、@Repository
等)。
下面我我們聲明一個非常簡單的bean,如下所示:
@Configuration @ComponentScan public class AppConfig { //... } @Component public class DemoBean { //... }
DemoBean使用@Component
注解,當(dāng)我們從應(yīng)用程序上下文中檢索 bean 并打印其名稱時,它會打印“ demoBean ”。
var applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);
程序輸出:
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.annotation.internalPersistenceAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
appConfig
demoBean
在以上結(jié)果輸出中,我們可以看到 Spring 創(chuàng)建的基礎(chǔ)設(shè)施 bean,還有我們創(chuàng)建的beanappConfig
和demoBean
.
2.使用@Bean的默認(rèn)Bean命名
當(dāng)我們使用@Bean
注解來創(chuàng)建一個新的bean時,該bean將以創(chuàng)建它的方法命名。
讓我們通過一個示例來理解,我們創(chuàng)建兩個具有不同方法名稱的DemoBean類型的 bean 。
@Configuration public class AppConfig { @Bean DemoBean demoBean(){ return new DemoBean(); } @Bean DemoBean anotherDemoBean(){ return new DemoBean(); } }
當(dāng)我們運行代碼并打印bean名稱時,會輸出以下結(jié)果:
...
appConfig
demoBean
anotherDemoBean
3.帶有值的顯式 Bean 命名
對于所有的注解類型,都有一個默認(rèn)屬性名為"value",可以用一個值進(jìn)行初始化,作為用于標(biāo)識bean的名稱。
@Component(value = "newBeanName") public class DemoBean { //... }
注意,@Component(value = "newBeanName")
等同于 @Component("newBeanName")
。它們產(chǎn)生一樣的結(jié)果。
同樣@Bean
注解有兩個屬性name
和 value
,可以為bean定義一個顯式名稱。
@Configuration public class AppConfig { @Bean(name = "newBeanName") DemoBean demoBean(){ return new DemoBean(); } @Bean(value = "anotherNewBeanName") DemoBean anotherDemoBean(){ return new DemoBean(); } }
當(dāng)我們運行代碼并打印bean名稱時,會輸出以下結(jié)果:
...
appConfig
newBeanName
anotherNewBeanName
4.Bean 名稱別名:多個 Bean 名稱
@Bean 注解的 name 或 value 屬性可以指定一個值數(shù)組,用于引用 bean 的名稱。當(dāng)這樣做時,數(shù)組中的第一個值將成為主要名稱,而其他值將成為別名。
@Bean(value = {"newBeanName", "newBeanName-1", "newBeanName-2"}) DemoBean demoBean(){ return new DemoBean(); }
現(xiàn)在,當(dāng)打印 bean 的名稱時,它仍然是 "newBeanName"。但是當(dāng)我們打印 bean 的名稱別名時,我們會得到額外的名稱,即 "newBeanName-1" 和 "newBeanName-2"。
var applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println); var demoBean = applicationContext.getBeansOfType(DemoBean.class); demoBean.forEach((k, v) -> { var aliases = applicationContext.getAliases(k); if (aliases.length > 0) { Arrays.stream(aliases).forEach(System.out::println); } });
輸出
...
appConfig
newBeanName
newBeanName-2
newBeanName-1
5.生成自定義Bean名稱
與Spring中的所有功能類似,bean的命名也可以進(jìn)行自定義。為了進(jìn)行自定義名稱生成,我們可以定義一個類,繼承 AnnotationBeanNameGenerator 并在 @ComponentScan 注解中指定該類的名稱。
@Configuration @ComponentScan(nameGenerator = CustomBeanNameGenerator.class) public class AppConfig { //... }
接下來,我們通過在 CustomBeanNameGenerator 類中重寫 buildDefaultBeanName() 方法來定義自定義的名稱生成邏輯。
以下示例會返回由小寫的簡單類名與唯一標(biāo)識符連接而成的 bean 名稱。
public class CustomBeanNameGenerator extends AnnotationBeanNameGenerator { @Override protected String buildDefaultBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) { var beanName = definition.getBeanClassName() .substring(definition.getBeanClassName().lastIndexOf(".") + 1) .toLowerCase(Locale.ROOT); var uid = UUID.randomUUID().toString().replace("-","").substring(0,8); return beanName + "-" + uid; } }
輸出
appConfig
demobean-889ed00b
到此這篇關(guān)于Spring中Bean命名的方式總結(jié)的文章就介紹到這了,更多相關(guān)Spring Bean命名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis游標(biāo)查詢大量數(shù)據(jù)方式
這篇文章主要介紹了Mybatis游標(biāo)查詢大量數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02logback的使用和logback.xml詳解(小結(jié))
Logback是由log4j創(chuàng)始人設(shè)計的另一個開源日志組件,這篇文章主要介紹了logback的使用和logback.xml詳解(小結(jié)),非常具有實用價值,需要的朋友可以參考下2018-11-11