1、@Resource是由注释处理器CommonAnnotationBeanPostProcessor负责解析处理的。@Autowired是由注释处理器AutowiredAnnotationBeanPostProcessor 负责解析处理的。
2、@Resource默认情况下是按name匹配的,如果匹配失败,再按type匹配。比如ApplicationContext.xml中配置<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />。 如果@Resource ProcessEngine engine;则spring将查找beanId为“processEngine”的类,所以找不到,则继续按类型ProcessEngine.class继续寻找,so找到了,则将该实例赋值给engine。 如果@Resource(name="engine") ProcessEngine engine; 则按名字查找,so找不到,报错。如果@Resource(name="processEngine") ProcessEngine engine; 则可以找到,遂赋值给engine变量。如果@Resource(type=ProcessEngine.class) ProcessEngine engine;则能查到,正常赋值。
3、@Autowired ProcessEngine engine; 就相当于是先按 @Resource(type=ProcessEngine.class) 查找,如果找到多个,则匹配其中beanId是engine的,如果匹配失败,则抛异常。
4、综上所述,建议用@Resource,可以减少spring匹配查询次数(个人理解哈)
不对的地方,欢迎大家指正