1. Spring bean defination
一般情况下,我们定义和应用bean都使用bean id,但是今天我遇到了这样的定义
<bean id = "writeService" class = "aServiceImp, bServiceImp, cServiceImp" name = "aService, bService, cService" init-method = "init"> <property name = "interfaceName"> <value>baseService></value> </property> ............ </bean>
这样的定义首先表明aService, bService, cService都implements interface baseService
用spring IOC注入的时候,既可以用id writeService,也可以用name aService/bService/cService
bean id 和 bean name到底有什么区别呢?
Google和百度都找不到我想要的答案,最后还是在spring的官网上找到了如下的解释,我自己理解为:bean name的定义是合法的,但是一个bean name不能唯一的代表一个bean,也就是多个bean可以拥有相同的bean name,但是bean id是唯一标示一个bean的,所以我们应该尽量避免用bean name来引用bean。
原文解释:
For a fallback match, the bean name is considered as a default qualifier value. This means that the bean may be defined with an id "main" instead of the nested qualifier element, leading to the same matching result. However, note that while this can be used to refer to specific beans by name, @Autowired is fundamentally about type-driven injection with optional semantic qualifiers. This means that qualifier values, even when using the bean name fallback, always have narrowing semantics within the set of type matches; they do not semantically express a reference to a unique bean id. Good qualifier values would be "main" or "EMEA" or "persistent", expressing characteristics of a specific component - independent from the bean id (which may be auto-generated in case of an anonymous bean definition like the one above).