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会按照我们的规则生成.
我是戴着假发的程序员,分享技术,分享经验,如果要转载,请注明:出自戴着假发的程序员