戴着假发的程序员出品
context:component-scan的name-generator属性
spring应用手册(第一部分)
name-generator这个属性指定你的构造型注解,注册为Bean的ID生成策略,这个生成器基于接口BeanNameGenerator实现generateBeanName方法,你可以自己写个类去自定义策略。这边,我们可不显示配置,它是默认使用org.springframework.context.annotation.AnnotationBeanNameGenerator生成器,也就是类名首字符小写的策略,如Account类,它注册的Bean的ID为account.并且可以自定义ID,.这边简单贴出这个默认生成器的实现。
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
if (definition instanceof AnnotatedBeanDefinition) {
String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition);
if (StringUtils.hasText(beanName)) {
// Explicit bean name found.
return beanName;
}
}
// Fallback: generate a unique default bean name.
return buildDefaultBeanName(definition, registry);
}
我们可以自定义一个BeanName的生成器:
/**
* @author 戴着假发的程序员
*
* @description
*/
public class MyBaenNamegenerator implements BeanNameGenerator {
@Override
public String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry beanDefinitionRegistry) {
String beanName = null;
//从beanDefinition中取出类名
String beanClassName = beanDefinition.getBeanClassName();
if(beanClassName.indexOf(".")!=-1){
beanClassName = beanClassName.substring(beanClassName.lastIndexOf(".")+1);
//我们来添加一个前缀
beanName = "dk_"+beanClassName;
}
return beanName;
}
}
修改配置: 其中的name-generator指定为我们自定义的生成器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan name-generator="com.boxuewa.dk.demo5.MyBaenNamegenerator" base-package="com.boxuewa.dk.demo5">
</context:component-scan>
</beans>
修改Student类,添加一个BeanNameAware接口的实现(关于BeanNameAware接口请参看相关介绍 )。
/**
* @author 戴着假发的程序员
*
* @description
*/
@Component
public class Student implements BeanNameAware {
@Override
public void setBeanName(String s) {
System.out.println("Student的BeanName:"+s);
}
}
测试:
@Test
public void testNameGen(){
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext-demo9.xml");
}
结果:
我们发现Student的Beanname会按照我们的规则生成.