@Resource与@Autowired?
在开篇之前我假设你已经知道了他们的区别与作用。这篇文章会简要说明他们的区别(也是java标准与Spring实现的差异),并且我会给出我的主张与我主张的理由。最后总结依赖注入的标准替代注解。
他们的区别有以下三点:
- @Resource是JDK自带的注解,而@Autowired属于Spring框架。
- @Resource是按名注入,而@Autowired是按类型注入。
- @Resource设计初衷不是用来注入bean的,而是注入一个JNDI资源,这也是为什么@Resource是按名注入的。
一般来说,我们应该优先使用JDK自带的注解,这样在你不再使用Spring做依赖注入的时候也能得到支持。
不过我个人比较倾向@Autowired。
@Resource是JSR 330标准注解的一部分,用以注入一个资源,而Spring的所有资源都可以抽象为bean。@Autowired的JSR 330替代注解是@Inject。后者可以完全使用@Inject代替@Autowired,同时你也可以使用@Named代替@Component注解。这几个替代注解都是java标准里面的定义的标准注解。你可以看到他们有很多属性,这是为了兼容而做的全面考虑。
很显然java定义标准注解时,Spring已经有自己的一套东西了。实际上这个和IEEE定义网络结构的情形有点类似,虽然IEEE提出的结构更加工程化,更加明晰也更加合理,而事实上我们使用都是TCP/IP协议族,而这个java标准的DI注解也是后于实现定义的,这导致大部分程序员在使用的时候会以实际用到的为准,而非已标准为准,我敢打赌你在学习Spring的时候觉得没有看Java官方是怎么定义的标准,并且Spring提供的东西确实方便,毕竟在现有的东西已经满足需求的情况下谁会为了契合标准而专门导入一个javax.annotation包呢?
这也就引出了我主张你使用Spring注解第一个理由:其他人(尤其是与你合作的同事)可能不理解java官方定义的注解的作用是什么,并且就算是其他人知道这个注解的作用,他也会对Spring对该标准的实现情况感到疑虑。与他人合作最重要的就是降低沟通障碍,你要使用你们共同可以理解的沟通方式一起推进,你使用一些奇奇怪怪的东西会导致你们的合作走走停停,每用一些东西对方就得花时间去学习新的知识,这在实践中是不可取的。你可以在你们的项目达到一个里程碑后提出这些新东西。
第二个我主张你使用Spring注解的原因是:java标准与实现是有出入的,我们无法使用好合适的注解。前面有提到@Resource是用来注入资源的,而Spring中的一切资源都可以抽象为bean这导致当我们使用@Resource注入一个组件时也是可以的,并且是按名注入的。你完全可以使用@Autowired+@Qualifier做到按名限定。当然这是个小问题,如果过于拘泥于这些东西就过于死板了,做事不能脱离实践,如果大伙儿都这么用那你就一起这么用就ok了,这样大家有同意标准就行。
最后一个我主张你使用Spring注解的理由是:保持注解功能单一。比如@Autowired用来注入一个bean,@Qualifier用来对注入的bean做限定。你当然可以使用@Resource代替这俩个注解,特省事。但是实际上它不够简单,处理了俩个问题,一是注入bean二是限定注入的bean name。当然这依然是一个小问题,孰优孰劣就看你自己的喜好了。
附:SpringIOC注解在JSR 330(javax.inject.*)的替代注解
@Autowired对应@Inject,用来注入一个依赖。
@Component对应@Named / @ManagedBean,声明一个组件(也就是bean),将其交由容器处理。
@Scope("singleton")对应@Singleton,表明这是一个单例bean。
@Qualifier对应@Qualifier / @Named,在配合@Inject可以表示按名注入(就是提供一个限定名另外)。
另外Provider接口可以代替ObjectFactory接口。
注:如有错误请留言指出,转载请标明作者与出处。
牛啊牛啊
李哥牛逼