这里先说一下 @Autowired/@Resource的注入原理:
@Autowired是Spring的注解,Autowired默认先按 byType,如果发现找到多个 bean,则,又按照 byName方式比对,如果还有多个,则报出异常;
@Resource 是JDK1.6支持的注解,默认按照名称( Byname)进行装配, 如果没有指定 name属性,当注解写在字段上时,默认取字段名,按照名称查找,如果注解写在 setter方法上默认取属性名进行装配。当找不到与名称匹配的 bean时才按照类型进行装配。但是需要注意的是,如果 name属性一旦指定,就只会按照名称进行装配。
再来说Controller获取实例的过程:使用 @Autowired,程序在 spring的容器中查找类型是 TestService的 bean,刚好找到有且只有一个此类型的 bean,即 testServiceImpl,所以就把 testServiceImpl自动装配到了 controller的实例 testService中, testService其实就是 TestServiceImpl实现类;
如果使用的是 @Resource,则是先在容器中查找名字为 testService的 bean,但并没有找到,因为容器中的 bean名字是 TestServiceImpl(如果 @Service没指定 bean的 value属性,则注入 bean的名字就是类名,如果指定了则是指定的名字),然后再通过类型查找 TestService类型的 bean,找到唯一的了个 TestService类型 bean(即 TestServiceImpl),所以就自动装配实例成功了。