讨论spring2.5的注解问题

我们的项目是mvc架构,在action层有这样的一段代码:
@Autowired
private AccountService accountService;

我觉得这样的话,是把AccountService注入到了AccountAction,怎么会是把AccountService的实现AccountServiceImpl注入给了AccountAction呢?
因为@Autowired这个注解就是根据类型来匹配的啊,匹配的也就是应该AccountService啊?
[b]问题补充:[/b]
晕,既然是注解了,在xml里就没有(或者不需要)配AccountServiceImpl了啊
[b]问题补充:[/b]
对,这些我都清楚,我的意思是spring容器怎么就会去找AccountServiceImpl,而不是去找其他呢?根据是什么呢?

或者说我再给它一个注解:Qualifier("accountServiceImpl"),spring容器怎么就会把AccountServiceImpl自动注入给AccountAction了,就是说这个名称(accountServiceImpl)是怎么跟AccountServiceImpl关联起来的?而不去关联其他的:比如AccountServiceImpl1、AccountServiceImpl2等等。

[quote="cxh8318"]你好,谢谢你的答复,不过我还没真正明白。
再举个例子:AccountService有3个实现:分别是AccountServiceImpl、AccountServiceImpl1、AccountServiceImpl2,为什么spring容器根据@Autowired这个注解就会注入AccountServiceImpl了,而不是注入AccountServiceImpl1或者AccountServiceImpl2。[/quote]

首先你要明确你当前的bean的注入方式(默认是按类型匹配),如果是按类型匹配,那么你这种情况肯定就是受spring管理的AccountService类型只有一个而且一定是AccountServiceImpl(也就是在xml里配置了这个bean),如果你还在xml里配置了其他的比如AccountServiceImpl2,那么按类型匹配注入就会报错,因为spring无法确定你要注入的是哪个。

如果是按名称匹配,那么,你的这个声明@Autowired
private AccountService accountService; 就表示受spring管理的bean的id有一个叫accountService,而且指向的class是AccountServiceImpl。

不知道我这样说你明白不明白?

因为你在xml里面配的是AccountServiceImpl

Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入。用@Autowired并不是说不需要xml配置你的bean了,只是让你可以省略set方法而已。所以注入的bean包括被注入的bean都是要受spring管理的。

你的Spring上下文中必然会有AccountServiceImpl,才能注入到AccountAction中实例,这个AccountServiceImpl应该使用@Service或@Component来注解,如果你这个AccountServiceImpl上没有以上任何注解,Spring也无法完成注入的,用注解标识和在xml中配置其实都是一样的,Spring上下文启动的时候都会发现这些Bean并注册到自己的BeanFactory中。

[quote="cxh8318"]或者说我再给它一个注解:Qualifier("accountServiceImpl"),spring容器怎么就会把AccountServiceImpl自动注入给AccountAction了,就是说这个名称(accountServiceImpl)是怎么跟AccountServiceImpl关联起来的?而不去关联其他的:比如AccountServiceImpl1、AccountServiceImpl2等等。[/quote]

那是因为目前你项目里受spring管理的并且实现AccountService接口的bean只有accountServiceImpl,如果你多几个实现并且都受spring管理(也就是在xml文件里面配置了这些bean),那按默认的注入方式(默认按类型匹配)就会出错,因为找到了两个以上的accountService,spring就不知道应该注入哪个。这时候就需要改变匹配策略,可以按名称匹配,这样就要求你在xml里面配置bean的时候要给它一个唯一的id。