2.28@ComponentScan注解的nameGenerator屬性


戴着假發的程序員出品  抖音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會按照我們的定義的規則進行制定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM