1.33context:component-scan的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 }

修改配置: 其中的name-generator指定为我们自定义的生成器

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd
 7         http://www.springframework.org/schema/context
 8         http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10     <context:component-scan name-generator="com.boxuewa.dk.demo5.MyBaenNamegenerator" base-package="com.boxuewa.dk.demo5">
11     </context:component-scan>
12 </beans>

修改Student类,添加一个BeanNameAware接口的实现(关于BeanNameAware接口请参看相关介绍 )。

 1 /**
 2  * @author 戴着假发的程序员
 3  *  
 4  * @description
 5  */
 6 @Component
 7 public class Student implements BeanNameAware {
 8     @Override
 9     public void setBeanName(String s) {
10         System.out.println("Student的BeanName:"+s);
11     }
12 }

测试:

1 @Test
2 public void testNameGen(){
3     ApplicationContext ac =
4             new ClassPathXmlApplicationContext("applicationContext-demo9.xml");
5 }

结果:

我们发现Student的Beanname会按照我们的规则生成.

posted @ 2020-10-06 09:12  戴着假发的程序员0-1  阅读(258)  评论(0编辑  收藏  举报