戴着假發的程序員出品 抖音ID:戴着假發的程序員 歡迎關注
[查看視頻教程]
nameGenerator和contentx:component-sacn的屬性name-generator作用一致:
這個屬性指定你的構造型注解,注冊為Bean的ID生成策略,這個生成器基於接口BeanNameGenerator實現generateBeanName方法,你可以自己寫個類去自定義策略。這邊,我們可不顯示配置,它是默認使用org.springframework.context.annotation.AnnotationBeanNameGenerator生成器,也就是類名首字符小寫的策略,如Account類,它注冊的Bean的ID為account.並且可以自定義ID,.這邊簡單貼出這個默認生成器的實現。
1 public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) { 2 if (definition instanceof AnnotatedBeanDefinition) { 3 String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition); 4 if (StringUtils.hasText(beanName)) { 5 // Explicit bean name found. 6 return beanName; 7 } 8 } 9 // Fallback: generate a unique default bean name. 10 return buildDefaultBeanName(definition, registry); 11 }
我們可以自定義一個BeanName的生成器:
1 /** 2 * @author 戴着假發的程序員 3 * 4 * @description 5 */ 6 public class MyBaenNamegenerator implements BeanNameGenerator { 7 @Override 8 public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) { 9 String beanName = null; 10 //從beanDefinition中取出類名 11 String beanClassName = beanDefinition.getBeanClassName(); 12 if(beanClassName.indexOf(".")!=-1){ 13 beanClassName = beanClassName.substring(beanClassName.lastIndexOf(".")+1); 14 //我們來添加一個前綴 15 beanName = "dk_"+beanClassName; 16 } 17 return beanName; 18 } 19 }
修改配置類,配置nameGenerator為我們自定義的類:
1 /** 2 * @author 戴着假發的程序員 3 * 4 * @description 5 */ 6 @Configuration 7 @ComponentScan(basePackages = "com. st.dk.demo6",nameGenerator = MyBaenNamegenerator.class) 8 public class AppConfig { 9 }
給Person類實現BeanNameAware接口:
1 /** 2 * @author 戴着假發的程序員 3 * 4 * @description 5 */ 6 @Component 7 public class Person implements BeanNameAware { 8 public Person(){ 9 System.out.println("實例化Person類"); 10 } 11 12 @Override 13 public void setBeanName(String s) { 14 System.out.println("Person的beanName:"+s); 15 } 16 }
創建容器測試:
1 @Test 2 public void testNameGenerator(){ 3 ApplicationContext ac = 4 new AnnotationConfigApplicationContext(AppConfig.class); 5 }
結果:
我們會發現Person類的beanName會按照我們的定義的規則進行制定。