@Qualifier
在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。
Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常。
@Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。
@Autowired 可以对
成员变量
、方法以及
构造函数
进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。
这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。
<bean id="userDao" class="..."/>
<bean id="userService" class="...">
<property name="userDao">
<ref bean="userDao"/>
</property>
</bean>
这样你在userService里面要做一个userDao的setter/getter方法。
但如果你用了@Autowired的话,你只需要在UserService的实现类中声明即可。
@Autowired
private IUserDao userdao;
<context:component-scan base-package="dev.kyia.gameserver" />
@Component
使用@Component来注释一个类,效果上相当于将该类注册到spring容器中。@Component带有一个可选的参数,用于指定bean的名称,如@Component("boss"),则可以通过"boss"从容器中取得Boss类的实例。
为了使用@Component注释,需要在<beans>中引入如下配置:
1. <context:component-scan base-package="...">
spring会自动扫描base-package指定的包及子包下面所有标记了@Component的类并自动注册到容器中。
使用了上面的配置之后,就不必再有<context:annotation-config/>配置了,因为<context:component-scan>会自动隐式地注册AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor。
<context:component-scan>还可以指定要扫描的包、类的filter,如下:
1. <context:component-scan base-package="...">
2. <context:include-filter type="regex" expression="..."/>
3. <context:exclude-filter type="aspectj"expression="..."/>
4. </context:component-scan>
默认地,@Component标注的bean都是singleton的,可以通过@Scope("prototype")来改变,如下:
1. @Component("boss")
2. @Scope("prototype")
3. public class Boss
4. {
5. // ...
6. }
@Autowired 可以对 成员变量 、方法以及 构造函数 进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。
这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。
<bean id="userDao" class="..."/>
<bean id="userService" class="...">
<property name="userDao">
<ref bean="userDao"/>
</property>
</bean>
这样你在userService里面要做一个userDao的setter/getter方法。
但如果你用了@Autowired的话,你只需要在UserService的实现类中声明即可。
@Autowired
private IUserDao userdao;
@Component
使用@Component来注释一个类,效果上相当于将该类注册到spring容器中。@Component带有一个可选的参数,用于指定bean的名称,如@Component("boss"),则可以通过"boss"从容器中取得Boss类的实例。
为了使用@Component注释,需要在<beans>中引入如下配置:
1. <context:component-scan base-package="...">
spring会自动扫描base-package指定的包及子包下面所有标记了@Component的类并自动注册到容器中。
使用了上面的配置之后,就不必再有<context:annotation-config/>配置了,因为<context:component-scan>会自动隐式地注册AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor。
<context:component-scan>还可以指定要扫描的包、类的filter,如下:
1. <context:component-scan base-package="...">
2. <context:include-filter type="regex" expression="..."/>
3. <context:exclude-filter type="aspectj"expression="..."/>
4. </context:component-scan>
默认地,@Component标注的bean都是singleton的,可以通过@Scope("prototype")来改变,如下:
1. @Component("boss")
2. @Scope("prototype")
3. public class Boss
4. {
5. // ...
6. }