草庐IT

@Autowired和@Resouce的区【转】

小源博客 2023-04-16 原文

@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

1、共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

2、不同点

(1)@Autowired

@Autowired是Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:

public class TestServiceImpl {

  @Autowired

  @Qualifier("userService")

  private UserService userService;

}

@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

@Autowired功能虽说非常强大,但是也有些不足之处。比如:比如它跟spring强耦合了,如果换成了JFinal等其他框架,功能就会失效。而@Resource是JSR-250提供的,它是Java标准,绝大部分框架都支持。

除此之外,有些场景使用@Autowired无法满足的要求,改成@Resource却能解决问题。接下来,我们重点看看@Autowired和@Resource的区别。

@Autowired默认按byType自动装配,而@Resource默认byName自动装配。
@Autowired只包含一个参数:required,表示是否开启自动准入,默认是true。而@Resource包含七个参数,其中最重要的两个参数是:name 和 type。
@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。
@Autowired能够用在:构造器、方法、参数、成员变量和注解上,而@Resource能用在:类、成员变量和方法上。
@Autowired是spring定义的注解,而@Resource是JSR-250定义的注解。
此外,它们的装配顺序不同,还有就是在idea中 对@Autowired注解无法去识别到bean对象,提示波浪线警告,@Resource可以避免。

图解@Autowired的装配顺序

@Resource的装配顺序如下:

如果同时指定了name和type:

如果指定了name:

如果指定了type:

如果既没有指定name,也没有指定type:

有关@Autowired和@Resouce的区【转】的更多相关文章

  1. javascript - 什么是模块,module.exports与export之间的区别是什么? - 2

    我已经读了几个小时的关于这个话题的书,只是没有发现任何东西可以帮助你坚持下去。一个模块只是Node中具有一些属性的对象,一个是引用对象的导出属性。“导出”变量为varexports=module.exports这是一个变量,指向module.exports所引用的对象。我正在努力的是可视化模块是什么。我知道这是一个对象,但是只有一个吗?我知道这不是Node实现模块的确切方式,但我正在将其可视化,如下所示:varmodule={}module.exports={}//nowmodulehasapropertymodule.exportsvarexports=module.exports现

  2. javascript - jQuery 和 Prototype 目前的区别是什么? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭7年前。Improvethisquestion最近几个月我一直在构建一个RubyonRails网站,我只使用了少量的内置JavaScript函数。然而,在接下来的几周和几个月里,我将进行更多的JavaScript开发,并且我正在考虑使用哪个JavaScript框架。一方面,jQuery似乎是更流行的一种,但另一方面,Prototype已经内置到Rails中。几年前我也在网上看了一堆文章,谈论jQuery如何在某些事情上更简洁但在其他事

  3. c# - QueueUserWorkItem() 和 BeginInvoke() 之间的区别是什么,用于执行不需要返回类型的异步事件 - 2

    根据我的BeginInvoke()/EndInvoke()问题,Delegate.BeginInvoke()和使用QueueUserWorkItem()异步调用委托(delegate)之间在性能/其他方面是否存在重大差异? 最佳答案 我能想到的关于QueueUserWorkItem的主要事情是你必须使用WaitCallback委托(delegate)类型,如果你已经有一个SomeRandomDelegate实例和一些参数。好消息是你可以用闭包来解决这个问题:ThreadPool.QueueUserWorkItem(delegate{

  4. javascript - Highland.js、Kefir.js 和 Rx.js 之间的区别是什么? - 2

    由于在SO上要避免主观回答,我特别想问:这三个功能/响应式库之间的功能和/或性能差异是什么会让我选择其中一个而不是其他库?我已经淘汰了BaconJS,因为它依赖于jQuery。我是JS流的新手,主要感兴趣的是首先在NodeJS中熟悉它们,然后在AngularJS上下文中熟悉它们。如果您选择了其中之一而不是其他,那么选择的标准是什么? 最佳答案 下面的一切都是相当主观的:)RxJS优点:文档和大型社区。与Rx*系列共享接口(interface)。这是一个很大的优势,因为您可以采用来自RxJava社区的示例。库中有很多原语和一些如何使用

  5. javascript - JavaScript 中 + 运算符和 concat() 方法的区别是什么 - 2

    加号(+)运算符和String.concat()方法给出相同的结果。加号(+)运算符;str1+str2;字符串concat()方法;str1.concat(str2);另外,它写在w3schools中;ButwithJavaScript,methodsandpropertiesarealsoavailabletoprimitivevalues,becauseJavaScripttreatsprimitivevaluesasobjectswhenexecutingmethodsandproperties.那么JS中无论是在基元上还是在String对象上使用哪种方式组合比较好,如果有的话

  6. javascript - javascript中带标签和不带标签的区别是什么 - 2

    varnum=0;for(vari=0;i在上面的代码中,我期望结果是55,但为什么结果是95。但为什么如果我添加标签,结果会变成55?varnum=0;outermost:for(vari=0;i 最佳答案 在没有标签的情况下使用时,break只会中断当前循环,在您的情况下是最内层的for。所以现在j=6,条件现在是错误的,循环继续进行40次递增。当你放一个标签时,break转到标签的“级别”,所以两个for循环被跳过。 关于javascript-javascript中带标签和不带标签

  7. php - OpenID 与 Oauth(v1 和 v2)的区别是什么? - 2

    我注意到所有的大网站都在使用Openid而不是Oauth。我为Google和Facebook实现了oauth。我的要求:使用Google/Facebook对用户进行身份验证为我网站上的用户管理简单的用户配置文件,这些配置文件是从Google/Facebook预先填充的。我应该为Oauth或Openid做什么?什么时候遵循oauth? 最佳答案 它们用于不同的目标。OpenID用于验证您站点上的SomeUser,向其他站点请求用户身份证明。OAuth用于授予SomeOtherParty(例如其他网站或应用程序)代表SomeUser在您

  8. java - @Autowired 和 default-autowire 可以共存吗? - 2

    意味着如果具有所需类型的bean不超过1个,bean的所有字段将自动注入(inject)依赖项。问题是当使用注解时它是如何工作的,它到底能不能工作。我的测试表明即使我使用@Resource(name="someConcreteFoo")privateFoofoo;如果Foo有多个实现,上下文会尝试按类型Autowiring字段,但会失败.所以,就我所见,default-autowire不与注释混合。我在文档中找不到任何具体内容。扩展问题-当使用xml-only时,spring如何使用默认Autowiring。IE。如果你有.属性注入(inject)是否覆盖默认值(应该是)。我可以做更多

  9. java - Spring @autowired 不起作用 - 2

    我在通过注解使用springDI时遇到问题,这是我的应用程序:@ServicepublicclassTest{@AutowiredprivateGpsPointEntityDaogpsPointEntityDao;publicvoidtest(){if(gpsPointEntityDao==null)System.out.println("It'snull!\n"+gpsPointEntityDao);}}通用接口(interface):publicinterfaceGenericDao{publicTfind(longid);publicListgetAll();publicvoid

  10. java - 为什么 Spring 不将我的 @Autowired 成员连接到依赖的 jar 中? - 2

    我正在使用Spring3.1构建一个GoogleAppEngine应用程序,但在我的一个jar中获取成员时遇到了问题。我有三个项目:服务器server.modelserver.persistence我有一个ant构建脚本,这样当我的工作区构建时,它会为server.model和server.persistence创建jar,并将它们放在正确的lib目录中对于server项目。在server中,我可以从server.model和server.persistence中Autowiring东西,但在server.model我的server.persistencebean没有连接,即使它们与s

随机推荐