1.內(nèi)置BeanNameGenerator
BeanNameGenerator為BeanDefinition生成Bean名稱
public interface BeanNameGenerator {
/**
* Generate a bean name for the given bean definition.
* @param definition the bean definition to generate a name for
* @param registry the bean definition registry that the given definition
* is supposed to be registered with
* @return the generated bean name
*/
String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry);
}
如下圖
有2種策略,一種是是掃描xml(<context:component-scan />)時,一種是在注解掃描時(@ComponentScan)
測試代碼:
public class AnnotationBeanNameGeneratorTests {
private BeanNameGenerator beanNameGenerator = new DefaultBeanNameGenerator();
//private BeanNameGenerator beanNameGenerator = new AnnotationBeanNameGenerator();
@Test
public void generateBeanNameWithNamedComponent() {
BeanDefinitionRegistry registry = new SimpleBeanDefinitionRegistry();
AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(ComponentWithName.class);
String beanName = this.beanNameGenerator.generateBeanName(bd, registry);
assertNotNull("The generated beanName must *never* be null.", beanName);
assertTrue("The generated beanName must *never* be blank.", StringUtils.hasText(beanName));
assertEquals("walden", beanName);
}
}
2.自定義BeanNameGenerator
可以指定nameGenerator屬性來自定義bean的命名生成規(guī)則
public @interface ComponentScan {
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
}
參考:
http://www.cnblogs.com/jason0529/p/5272265.html
http://www.cnblogs.com/jason0529/p/5274650.html
http://yunzhongxia.iteye.com/blog/898433