6.10.6 给自动检测组件命名
当组件作为扫描过程的一部分被自动检测到时,其bean名称由该扫描程序已知的BeanNameGenerator策略生成。默认情况下,任何包含名称值的Spring构造型注解(@ Component,@ Repository,@ Service和@Controller)都将该名称提供给相应的bean定义。
如果此类注解不包含名称值或对于任何其他检测到的组件(例如通过自定义过滤器发现的那些组件),则默认的bean名称生成器将返回小写的非限定类名称。例如,如果以下两个组件被检测到,则名称为myMovieLister和movieFinderImpl:
@Service("myMovieLister") public class SimpleMovieLister { // ... }
@Repository public class MovieFinderImpl implements MovieFinder { // ... }
如果您不想依赖默认的bean命名策略,则可以提供自定义bean命名策略。首先,实现BeanNameGenerator接口,并确保包含默认的无参数构造函数。然后,在配置扫描程序时提供完全限定的类名:
@Configuration @ComponentScan(basePackages = "org.example", nameGenerator = MyNameGenerator.class) public class AppConfig { ... }
<beans> <context:component-scan base-package="org.example" name-generator="org.example.MyNameGenerator" /> </beans>
作为一般规则,使用注解指定名称,不管在什么时候,其他组件也可以生成对它的明确的引用。另一方面,不管什么时候,容器都会负责连接,自动生成的名称就能够胜任了。