spring自定义注解默认bean的id

晚上弄项目的时候发现spring对于注解(@Controller,@Service,等)Bean的id会默认取类名而非类全名,网上所找到的都是在打注解时指定bean的id。这样未免过于繁琐。
经翻源码得知Spring可以自定义注解的默认bean-id生成方式,因为毕竟少见,特此记录。

spring生成默认bean的id时会取类名首字母小写,具体代码如下

1
2
3
4
5
6
7
8
9
10
11

/*
类路径org.springframework.context.annotation.AnnotationBeanNameGenerator
*/

protected String buildDefaultBeanName(BeanDefinition definition) {
String beanClassName = definition.getBeanClassName();
Assert.state(beanClassName != null, "No bean class name set");
String shortClassName = ClassUtils.getShortName(beanClassName);
return Introspector.decapitalize(shortClassName);
}

只要重写该方法为

1
2
3
4
5
@NotNull
@Override
protected String buildDefaultBeanName(BeanDefinition definition) {
return definition.getBeanClassName();
}

并且在spring配置文件中

1
<context:component-scan base-package="me.nanlou" name-generator="xxxxxx"/>

指定我们重写的BeanNameGenerator类即可。