Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @资源vs@Autowired_Java_Spring_Dependency Injection_Annotations_Autowired - Fatal编程技术网

Java @资源vs@Autowired

Java @资源vs@Autowired,java,spring,dependency-injection,annotations,autowired,Java,Spring,Dependency Injection,Annotations,Autowired,我应该在DI中使用哪个注释,@Resource()或@Autowired(特定于Spring) 我在过去成功地使用了@Resource(name=“blah”)和@Autowired@Qualifier(“blah”) 我的直觉是坚持使用@Resource标记,因为它已经得到了jsr人员的批准。 有人对此有强烈的想法吗?他们两人都同样优秀。使用资源的好处是,如果将来您想使用spring以外的另一个DI框架,您的代码更改将简单得多。使用Autowired,您的代码与springs DI紧密耦合。主

我应该在DI中使用哪个注释,@Resource()或@Autowired(特定于Spring)

我在过去成功地使用了
@Resource(name=“blah”)
@Autowired@Qualifier(“blah”)

我的直觉是坚持使用
@Resource
标记,因为它已经得到了jsr人员的批准。

有人对此有强烈的想法吗?

他们两人都同样优秀。使用资源的好处是,如果将来您想使用spring以外的另一个DI框架,您的代码更改将简单得多。使用Autowired,您的代码与springs DI紧密耦合。

主要区别在于,
@Autowired
是spring注释。而
@Resource
是由JSR-250指定的,正如您自己指出的。因此,后者是Java的一部分,而前者是特定于Spring的


因此,从某种意义上说,你的建议是正确的。我发现人们使用
@Autowired
@Qualifier
是因为它更强大。从某个框架转移到另一个框架被认为是非常不可能的,如果不是神话的话,尤其是在Spring的情况下。

在Spring 3.0之前的版本中,哪一个框架并不重要

在Spring3.0中,支持标准()注释
@javax.inject.inject
——将其与
@Qualifier
组合使用。请注意,spring现在还支持
@javax.inject.Qualifier
元注释:

@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}
所以你可以

<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>
然后:

@Inject @YourQualifier private Foo foo;
这减少了字符串名称的使用,因为字符串名称可能拼写错误,并且更难维护


至于原始问题:两者都不指定注释的任何属性,而是按类型执行注入。区别在于:

  • @Resource
    允许您指定注入bean的名称
  • @Autowired
    允许您将其标记为非强制性

    • 自动连线(或
      @Inject
      )和
      @Resource
      都同样有效。但这是一个概念上的差异或意义上的差异

      • @Resource
        表示按名称给我一个已知资源。名称从带注释的setter或字段的名称中提取,或从name参数中提取
      • @Inject
        @Autowired
        尝试按类型连接合适的其他组件
      所以,基本上这是两个截然不同的概念。不幸的是,
      @Resource
      的Spring实现有一个内置的回退,当按名称解析失败时,该回退会启动。在这种情况下,它返回到按类型划分的
      @Autowired
      -种类解析。虽然这种回退方法很方便,但也会造成很多混乱,因为人们不知道概念上的差异,倾向于使用
      @Resource
      进行基于类型的自动布线。

      这里需要注意:
      SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext
      SpringBeanAutowiringSupport.processInjectionBasedOnServletContext
      不能与
      @Resource
      注释一起使用。所以,有区别。

      这是我从-

      小费

      如果您想用名称来表示注释驱动的注入,请执行以下操作 不主要使用@Autowired,即使在技术上能够 通过@Qualifier值引用bean名称。相反,使用 JSR-250@Resource注释,在语义上定义为 通过其唯一名称标识特定的目标组件,并使用 声明的类型与匹配过程无关

      这种语义差异的一个具体结果是 不能注入定义为集合或映射类型的自身 通过@Autowired,因为类型匹配不适用 对他们来说。为这些bean使用@Resource,参考特定的 集合或映射bean的唯一名称

      @自动连线适用于字段、构造函数和多参数 方法,允许在 参数级别。相比之下,@Resource仅支持字段 和具有单个参数的bean属性设置器方法。作为一个 因此,如果您的注射目标是 构造函数或多参数方法


      @Resource
      通常由通过JNDI定义的高级对象使用<代码>@Autowired或
      @Inject
      将被更多普通bean使用


      据我所知,这不是一个规范,甚至不是一个惯例。这更符合标准代码使用这些注释的逻辑方式。

      我想强调对这个问题的一点评论。该评论提供了一个有用的链接:。我鼓励您完整阅读,但以下是对其有用性的快速总结:

      注释如何选择正确的实现?
      @Autowired
      @Inject

    • 按类型匹配
    • 限定符限制
    • 按名称匹配
    • @Resource

    • 按名称匹配
    • 按类型匹配
    • 按限定符限制(如果按名称找到匹配项,则忽略)
    • 我应该使用哪种注释(或它们的组合)来注入bean?
    • 显式命名组件[@component(“beanName”)]

    • @Resource
      name
      属性[@Resource(name=“beanName”)]一起使用

    • 为什么我不应该使用
      @限定符
      ? 避免使用
      @Qualifier
      注释,除非您想创建类似bean的列表。例如,您可能希望使用特定的
      @限定符标记一组规则。这种方法使得将一组规则类注入到可用于处理数据的列表中变得简单

      bean注入会减慢我的程序吗? 扫描组件的特定包
      [上下文:组件扫描基本包=“com.sourcealliances.person”]
      。W
      @Inject @YourQualifier private Foo foo;
      
      interface parent {
      
      }
      @Service("actualService")
      class ActualService implements parent{
      
      }
      @Service("stubbedService")
      class SubbedService implements parent{
      
      }
      
      @Autowired
      @Qualifier("actualService") or 
      @Qualifier("stubbedService") 
      Parent object;
      
      @Resource(name="${service.name}")
      Parent object;  
      
      #service.name=actualService
       service.name=stubbedService
      
      @Autowired / @Inject
      
      @Resource