`

@Autowired 与@Resource

    博客分类:
  • J2EE
 
阅读更多
作者:wuxinliulei
链接:https://www.zhihu.com/question/39356740/answer/80926247
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

@Autowired 与@Resource:
1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。

2、@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:
@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
Java代码
@Autowired() @Qualifier("baseDao")    
private BaseDao baseDao;
3、@Resource 是JDK1.6支持的注解默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
<noscript>&lt;img src="https://pic3.zhimg.com/50/1d434624eb4918db0814529bbcfbc6b7_hd.jpg" data-rawwidth="201" data-rawheight="392" class="content_image" width="201"&gt;</noscript>
只不过注解处理器我们使用的是Spring提供的,是一样的,无所谓解耦不解耦的说法,两个在便利程度上是等同的。

Java代码
@Resource(name="baseDao")    
private BaseDao baseDao; 
他们的主要区别就是@Autowired是默认按照类型装配的 @Resource默认是按照名称装配的
byName 通过参数名 自动装配,如果一个bean的name 和另外一个bean的 property 相同,就自动装配。
byType 通过参数的数据类型自动自动装配,如果一个bean的数据类型和另外一个bean的property属性的数据类型兼容,就自动装配
-----------------------------------------------------------------------------------------------------------------------------------------
我们可以通过 @Autowired 或 @Resource 在 Bean 类中使用自动注入功能,但是 Bean 还是在 XML 文件中通过 <bean> 进行定义 —— 也就是说,在 XML 配置文件中定义 Bean,通过@Autowired 或 @Resource 为 Bean 的成员变量、方法入参或构造函数入参提供自动注入的功能。
比如下面的beans.xml
package com.wuxinliulei;

public class Boss {
    private Car car;
    private Office office;

    // 省略 get/setter

    @Override
    public String toString() {
        return "car:" + car + "\n" + "office:" + office;
    }
}


<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context 
 http://www.springframework.org/schema/context/spring-context-2.5.xsd">
 
    <context:annotation-config/> 

    <bean id="boss" class="com.wuxinliulei.Boss"/>
    <bean id="office" class="com.wuxinliulei.Office">
        <property name="officeNo" value="001"/>
    </bean>
    <bean id="car" class="com.wuxinliulei.Car" scope="singleton">
        <property name="brand" value=" 红旗 CA72"/>
        <property name="price" value="2000"/>
    </bean>
</beans>
定义了三个bean对象,但是没有了我们书序的ref指向的内容
比如
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    <bean id="boss" class="com.wuxinliulei.Boss">
        <property name="car" ref="car"/>
        <property name="office" ref="office" />
    </bean>
    <bean id="office" class="com.wuxinliulei.Office">
        <property name="officeNo" value="002"/>
    </bean>
    <bean id="car" class="com.wuxinliulei.Car" scope="singleton">
        <property name="brand" value=" 红旗 CA72"/>
        <property name="price" value="2000"/>
    </bean>
</beans>

-------------------------------------------------------------------------------------------------------

spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖。在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入。虽然@Resource和@Autowired都可以来完成注入依赖,但它们之间是有区 别的。首先来看一下:

a.@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
b.@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
c.@Resource注解是由JDK提供,而@Autowired是由Spring提供
 
@Resource的方式;
d. @Resource和@Autowired都可以书写标注在字段或者该字段的setter方法之上

2、使用注解的方式,我们需要修改spring配置文件的头信息,修改部分红色标注,如下

<?xml version="1.0" encoding="UTF-8"?>
<beans http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="Index of /schema/context"
       xsi:schemaLocation="Index of /schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
Index of /schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
               
<context:annotation-config/>
     
</beans>

PS:

----------------------PS开始-------------------------------

在基于主机方式配置Spring的配置文件中,你可能会见到

<context:annotation-config/>

这样一条配置,他的作用是式地向 Spring 容器注册

AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor

这 4 个BeanPostProcessor。

注册这4个BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。

例如:

如果你想使用@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。传统声明方式如下

<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

如果想使用@ Resource 、@ PostConstruct、@ PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor

<bean class="org.springframework.beans.factory.annotation. CommonAnnotationBeanPostProcessor"/> 

如果想使用@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor的Bean。

<bean class="org.springframework.beans.factory.annotation.PersistenceAnnotationBeanPostProcessor"/> 

如果想使用 @Required的注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean。

同样,传统的声明方式如下:

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 


一般来说,这些注解我们还是比较常用,尤其是Antowired的注解,在自动注入的时候更是经常使用,所以如果总是需要按照传统的方式一条一条配置显得有些繁琐和没有必要,于是spring给我们提供<context:annotation-config/>的简化配置方式,自动帮你完成声明。

不过,呵呵,我们使用注解一般都会配置扫描包路径选项

<context:component-scan base-package=”XX.XX”/>

该配置项其实也包含了自动注入上述processor的功能,因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。

比如:

<context:component-scan base-package="carPoolingController, carPoolingService, carPoolingDao" />

就把controller包下 service包下 dao包下的注解全部扫描了


----------------------------------------------PS结束------------------------------

3、修改以上配置文件的头信息后,我们就可以在Java代码通过注解方式来注入bean,看下面代码

(1)@Resource

public class StudentService3 implements IStudentService {
    //@Resource(name="studentDao")放在此处也是可行的
    private IStudentDao studentDao;

    private String id;


    public void setId(String id) {
    this.id = id;
    }

@Resource(name="studentDao") // 通过此注解完成从spring配置文件中查找名称为studentDao的bean来装配字段studentDao,如果spring配置文件中不存在 studentDao名称的bean则转向按照bean类型经行查找

public void setStudentDao(IStudentDao studentDao) {
        this.studentDao = studentDao;
}
public void saveStudent() {
        studentDao.saveStudent();
        System.out.print(",ID 为:"+id);
}
}
 

配置文件添加如下信息

<bean id="studentDao" class="com.wch.dao.impl.StudentDao">
</bean>

<bean id="studentService3" class="com.wch.service.impl.StudentService3"></bean>

(2)@Autowired

public class StudentService3 implements IStudentService {
  //@Autowired放在此处也是可行的
  private IStudentDao studentDao;

  private String id;
  
  public void setId(String id) {
       this.id = id;
   }

@Autowired

//通过此注解完成从spring配置文件中 查找满足studentDao类型的bean
//@Qualifier("studentDao")则按照名称经行来查找转配的
 public void setStudentDao(IStudentDao studentDao) {
       this.studentDao = studentDao;
  }


  public void saveStudent() {
       studentDao.saveStudent();
       System.out.print(",ID 为:"+id);
  }
}
 

配置文件添加如下信息

<bean id="studentDao" class="com.wch.dao.impl.StudentDao"></bean>
<bean id="studentService3" class="com.wch.service.impl.StudentService3" />

在java代码中可以使用@Autowire或者@Resource注解方式进行装配,这两个注解的区别是:
@Autowire 默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果我们想使用按照名称装配,可 以结合@Qualifier注解一起使用;


@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属 性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找 依赖对象.

注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖的对象时候,会回退到按照类型装配,但一旦指定了name属性,就只能按照名称 装配了.


--------------------------

当我们在xml里面为类配置注入对象时,会发现xml文件会越来越臃肿,维护起来很麻烦。这时候我们可以使用注解这种机制来为类配置注入对象。

java为我们提供了 javax.annotation.Resource这个注解。

spring框架提供了org.springframework.beans.factory.annotation.Autowired。

一般情况下我们使用 javax.annotation.Resource这个注解,因为这样我们就能实现和spring框架的解藕(不能认同,因为注解处理器还是Spring提供的)。

@Resource可以作用于字段和函数上。当作用于字段上的时候,如果我们只是简单的这样写

@Resource
PersonDao  p;

这时候spring注入p的过程是 1:先查找xml中是否有id为p的元素

2:如果没有找到,则看是否有name属性(@Resource name=“”),有则查找name

3:否则查找PersonDao类型的元素

@Resource可作用于set函数上。

例如:

@Resource
public void setP(PersonDao p) {
  this.p = p;
}

@Autowired注解是根据类型进行查找,比如PersonDao p,他会去xml文件里查找类型为PersonDao的元素

分享到:
评论

相关推荐

    (转)Spring中@Autowired注解和@Resource注解的区别

    与`@Autowired`不同,`@Resource`的`name`属性是其主要特性,可以明确指定要注入的bean的名称。 在实际应用中,通常推荐使用`@Autowired`,因为它提供了更强大的自动装配能力,包括基于类型、基于 Qualifier、基于...

    【Java面试】@Resource 和 @Autowired 的区别.doc

    @Resource 和 @Autowired 的区别 在 Spring 框架中,@Resource 和 @Autowired 是两种常用的依赖注入方式,但是它们之间存在着一些关键的区别。 首先,让我们来了解 @Autowired 注解。@Autowired 是 Spring 框架...

    Spring In Action 使用@Autowired 和@ Resource 自动装配Bean

    在Spring配置中,我们可以通过`@Configuration`和`@Bean`进一步定制Bean的创建和装配过程,与`@Autowired`和`@Resource`配合使用,实现更加灵活的依赖注入。 总之,`@Autowired`和`@Resource`都是Spring框架中的...

    Spring注解@Resource和@Autowired.doc

    Spring 注解@Resource 和@Autowired Spring 框架中提供了两个重要的注解,分别是@Resource 和@Autowired,它们都是用于 bean 的自动装配的。了解这两个注解的区别和使用场景是非常重要的。 首先,@Autowired 是 ...

    详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理

    Spring 依赖注入:@Autowired,@Resource 和@Inject 区别与实现原理 Spring 依赖注入是指在应用程序中将对象之间的依赖关系自动装配的过程。Spring 框架提供了多种依赖注入方式,包括 @Autowired、@Resource 和@...

    SSH笔记-通过@Autowired配置注入关系

    8. **`@Autowired`的替代品**:Spring还提供了一些其他的注解,如`@Resource`(基于名称的注入)和`@Value`(用于注入基本类型或属性值)作为`@Autowired`的补充。 结合前一篇文章中的注解笔记,我们可以推断出上一...

    Spring使用@Autowired注解自动装配

    `@Autowired`与`@Resource` `@Resource`注解同样用于注入,但它基于bean的名称,而非类型。在某些情况下,`@Resource`可能是更好的选择。 ### 7. 避免过度使用`@Autowired` 虽然`@Autowired`提供了便利,但过度...

    1.@Resource是按名称进行注入的,属于java自带的。@Autowired是按类型进行注入的,属于Spring。.pdf

    与`@Resource`不同,`@Autowired`主要通过类型匹配来找到合适的bean进行注入。例如: ```java @Autowired private DataSource dataSource; ``` 在这个例子中,Spring会查找类型为`DataSource`的bean,并将其注入到...

    Spring框架中 @Autowired 和 @Resource 注解的区别

    在Spring框架中,注解是实现依赖注入的重要方式,其中包括`@Autowired`和`@Resource`两个常用的注解。它们虽然都可以用来注入依赖,但在实际使用中存在一些区别。 首先,`@Autowired`注解是Spring框架特有的,主要...

    详解Spring注解--@Autowired、@Resource和@Service

    Spring注解详解 -- @Autowired、@Resource和@Service Spring框架中有三个非常重要的注解,即@Autowired、@Resource和@Service。这三个注解都是Spring框架中最常用的注解,它们都是用于解决Spring框架中的依赖注入...

    详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决

    SpringBoot 多线程处理任务中无法@Autowired注入bean问题解决 在 SpringBoot 应用程序中,多线程处理任务是一个常见的场景,但是,在多线程处理任务中无法使用 @Autowired 注入 bean,这是一个常见的问题。今天,...

    你所不知道的Spring的@Autowired实现细节分析

    8. **@Autowired与@Resource的区别** `@Autowired`主要基于类型匹配,而`@Resource`则优先基于名称匹配。`@Resource`是JSR-250规范的一部分,它的行为更接近于传统的J2EE资源注入。`@Autowired`提供了更灵活的依赖...

    Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    - @Autowired与@Resource:虽然两者都可以用来自动装配,但@Autowired默认按类型匹配,而@Resource默认按名字匹配。 总结,Spring的@Autowired自动装配机制极大地简化了bean之间的依赖管理,提高了代码的可维护性。...

    自动装配 AutoWire

    @Autowired与@Resource的区别 虽然@Autowired和@Resource都可以实现依赖注入,但它们有一些区别: - **@Autowired** 默认按类型匹配,可以与JSR-250规范结合使用,支持注解的属性(如required,默认为true)。 - ...

    学习Spring笔记_Annotation(注解)_Autowired_Qualifier

    除了`@Autowired`,Spring框架还提供了其他的依赖注入注解,如`@Resource`(主要用于JSR-250规范,基于名称的注入)和`@Inject`(JSR-330规范,基于类型和名称的注入)。这些注解在不同的场景下有不同的优势,开发者...

    spring框架的@Resource和@Component 程序和文档

    在Spring框架中,`@Resource`和`@Component`是两个重要的注解,它们用于不同的目的,但都与依赖注入(Dependency Injection,简称DI)息息相关。理解这两个注解的使用和区别是掌握Spring框架核心概念的关键。 首先...

    springMVC-annotation注解介绍

    3、@Resource和@Autowired @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。 1、共同点 两者都可以写...

    Autowired报错原因分析和4种解决方案.docx

    例如,当使用@Mapper注解的类与@Autowired一起使用时,IDEA可能无法正确判断@Mapper注解的类是否已经成功实例化,从而导致警告。 2. **@Autowired默认行为**:@Autowired默认要求注入的对象必须存在且不为空。如果...

    Spring注解@Resource和@Autowired区别对比详解

    主要介绍了Spring注解@Resource和@Autowired区别对比详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    springmvc @Resource 注解方式问题

    本文将深入探讨`@Resource`注解的用法、原理以及与`@Autowired`的区别,帮助开发者更好地理解和应用这一特性。 ### `@Resource`注解概述 `@Resource`是JSR-250规范的一部分,它主要用来标记JavaBean中的属性,由...

Global site tag (gtag.js) - Google Analytics