Spring中@Autowired、@Resource和@Inject注解的使用和区别

做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!在使用Spring进行项目开发的时候,会大量使用到自动装配,那自动装配是什么呢?简单来说:Spring 利用依赖注入(DI)功能,完成SpringIOC容器中各个组件之间的依赖关系赋值管理。下面介绍和总结可以在在Spring使用的三种自动注入的注解。首先回顾一下最初使用xml进行是如何进行注入的。零、回顾:XML…

大家好,又见面了,我是全栈君。

做一个积极的人

编码、改bug、提升自己

我有一个乐园,面向编程,春暖花开!

在使用Spring进行项目开发的时候,会大量使用到自动装配,那自动装配是什么呢?简单来说:Spring 利用依赖注入(DI)功能,完成SpringIOC容器中各个组件之间的依赖关系赋值管理。

下面介绍和总结可以在在Spring使用的三种自动注入的注解。首先回顾一下最初使用xml进行是如何进行注入的。

零、回顾:XML方式注入

使用 property 或者 constructor-arg 属性。

<!-- 配置需要被Spring管理的Bean(创建,创建后放在了Spring IOC容器里面)-->
<bean id="superMan" class="org.annotation.autowried.SuperMan">
    <property name="car" ref="car"></property>
     <!--<constructor-arg ref="car"/>--> 
</bean>

<bean id="car" class="org.annotation.autowried.Car"/>
public class SuperMan { 
   

    private Car car;

   /* private SuperMan(Car car){ this.car = car; }*/

    public void setCar(Car car) { 
   
        this.car = car;
    }
}

public class Car { 
   
    private String brand = "喇嘛杀敌";
}

这样就能够将需要的组件注入到Spring中,并且进行组件中的依赖关系管理。回顾结束,通过这种方式来,配置比较繁琐,下面正式进入使用注解注入的主题。

一、@Autowired介绍

在Spring 2.5 引入了 @Autowired 注解!

@Target({ 
   ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired { 
   
    boolean required() default true;
}

从Autowired注解源码上看,可以使用在下面这些地方:

@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.ANNOTATION_TYPE)——注解

还有一个value属性,默认是true。

简单总结

1、@Autowired是Spring自带的注解,通过AutowiredAnnotationBeanPostProcessor 类实现的依赖注入

2、@Autowired可以作用在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE

3、@Autowired默认是根据类型(byType )进行自动装配的

4、如果有多个类型一样的Bean候选者,需要指定按照名称(byName )进行装配,则需要配合@Qualifier。

指定名称后,如果Spring IOC容器中没有对应的组件bean抛出NoSuchBeanDefinitionException。也可以将@Autowired中required配置为false,如果配置为false之后,当没有找到相应bean的时候,系统不会抛异常

简单使用代码

在字段属性上。

@Autowired
private HelloDao helloDao;

或者

private HelloDao helloDao;

public HelloDao getHelloDao() { 
   
    return helloDao;
}

@Autowired
public void setHelloDao(HelloDao helloDao) { 
   
    this.helloDao = helloDao;
}

或者

private HelloDao helloDao;

//@Autowired
public HelloServiceImpl(@Autowired HelloDao helloDao) { 
   
    this.helloDao = helloDao;
}
// 构造器注入也可不写@Autowired,也可以注入成功。

将@Autowired写在被注入的成员变量上,setter或者构造器上,就不用再xml文件中配置了。

如果有多个类型一样的Bean候选者,则默认根据设定的属性名称进行获取。如 HelloDao 在Spring中有 helloWorldDao 和 helloDao 两个Bean候选者。

@Autowired
private HelloDao helloDao;

首先根据类型获取,发现多个HelloDao,然后根据helloDao进行获取,如果要获取限定的其中一个候选者,结合@Qualifier进行注入。

@Autowired
@Qualifier("helloWorldDao")
private HelloDao helloDao;

注入名称为helloWorldDao 的Bean组件。@Qualifier(“XXX”) 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。

多个类型一样的Bean候选者,也可以@Primary进行使用,设置首选的组件,也就是默认优先使用哪一个。

注意:使用@Qualifier 时候,如何设置的指定名称的Bean不存在,则会抛出异常,如果防止抛出异常,可以使用:

@Qualifier("xxxxyyyy")
@Autowired(required = false)
private HelloDao helloDao;

在SpringBoot中也可以使用@Bean+@Autowired进行组件注入,将@Autowired加到参数上,其实也可以省略。

@Bean
public Person getPerson(@Autowired Car car){ 
   
    return new Person();
}
// @Autowired 其实也可以省略

二、@Resource介绍

@Target({ 
   TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource { 
   

    String name() default "";
    // 其他省略
}

从Resource注解源码上看,可以使用在下面这些地方:

@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法

name 指定注入指定名称的组件。

简单总结

1、@Resource是JSR250规范的实现,在javax.annotation包下

2、@Resource可以作用TYPE、FIELD、METHOD上

3、@Resource是默认根据属性名称进行自动装配的,如果有多个类型一样的Bean候选者,则可以通过name进行指定进行注入

简单使用代码

@Component
public class SuperMan { 
   
    @Resource
    private Car car;
}

按照属性名称 car 注入容器中的组件。如果容器中BMW还有BYD两种类型组件。指定加入BMW。如下代码:

@Component
public class SuperMan { 
   
    @Resource(name = "BMW")
    private Car car;
}

name 的作用类似 @Qualifier!

三、@Inject介绍

@Target({ 
    METHOD, CONSTRUCTOR, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Inject { 
   }

从Resource注解源码上看,可以使用在下面这些地方:

@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.METHOD)——方法
@Target(ElementType.FIELD)——字段、枚举的常量

简单总结

1、@Inject是JSR330 (Dependency Injection for Java)中的规范,需要导入javax.inject.Inject jar包 ,才能实现注入

2、@Inject可以作用CONSTRUCTOR、METHOD、FIELD上

3、@Inject是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Named;

简单使用代码

@Inject
private Car car;

指定加入BMW组件。

@Inject
@Named("BMW")
private Car car;

@Named 的作用类似 @Qualifier!

四、总结

1、@Autowired是Spring自带的,@Resource是JSR250规范实现的,@Inject是JSR330规范实现的

2、@Autowired、@Inject用法基本一样,不同的是@Inject没有一个request属性

3、@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的

4、@Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用,@Resource则通过name进行指定

备注: 由于本人能力有限,文中若有错误之处,欢迎指正。


谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!



Java编程技术乐园:一个分享编程知识的公众号。跟着老司机一起学习干货技术知识,每天进步一点点,让小的积累,带来大的改变!


扫描关注,后台回复【资源】,获取珍藏干货! 99.9%的伙伴都很喜欢

image.png | center| 747x519


©
每天都在变得更好的阿飞云

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120997.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SSL协议原理详解

    SSL协议原理详解SSL可参考:SSL技术原理SSL简介SSL和TLS:SSL(SecureSocketsLayer)安全套接层。是由Netscape公司于1990年开发,用于保障WordWideWeb(WWW)通讯的安全。主要任务是提供私密性,信息完整性和身份认证。1994年改版为SSLv2,1995年改版为SSLv3.TLS(TransportLayerSecurity)安全传输层协…

  • QTcpSocket 内存问题「建议收藏」

    QTcpSocket 内存问题「建议收藏」我自己测试也发现反复的connectToHost会有内存泄露,建议谨慎的使用!////////////////////////////////////////////////QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险。必须控制connectToH…

  • 小白都能看懂 XAMPP的下载安装配置详细教程(含拒绝访问坑)[通俗易懂]

    小白都能看懂 XAMPP的下载安装配置详细教程(含拒绝访问坑)[通俗易懂]话不相瞒,当初为了在xampp里面配置phpwind,我在卸载与安装之间来回了不下10次,而且我可能招坑体质,回想起来真是一把泪了。但是我的phpwind始终还是安装不成功,真的很无奈。最终,byebye了您。废话不说,直接干了。文章目录一、下载(三步)第一步:找对应的操作系统版本第二步:选一个迭代版本第三步:找到安装包二、安装三、配置第一步:配置Apace第一个文件(httpd.conf),需要修改两个地方。第二个文件(http-ssl.conf),需修改三个地方。第二步:配置MySQL第三步:配置S

  • Docker安装RabbitMQ并安装延时队列插件

    Docker安装RabbitMQ并安装延时队列插件一、RabbitMQ简介RabbitMQ是由erlang语言开发,基于AMQP(AdvancedMessageQueue高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。二、docker安装RabbitMQ1、搜索镜像dockersearchrabbitmq2、拉取并运行容器dockerrun-dit–namerabbitmq-eRABBITMQ_DEFAULT_USER=guest-eR

  • fpga流水线设计思想_fpga视频容易入门

    fpga流水线设计思想_fpga视频容易入门流水线设计的思想来源是高流量,也就是说时间延迟固定的情况下尽可能的产生高的流量,使得整体的信号传输速率得到提升。这一概念我是最早在《高级FPGA设计——结构、实现和优化》(SteveKilts)一书中接触到的。作者在书中提到,高流量设计的抽象术语就是“流水线”。作者指出:流水线设计的优越性是新数据在前面的数据完成之前就可以进行处理。并给出一个例子,硬件实现计算一个数的三次方。这给出设计代码,用于下文分析比较。1.类似于软件的递归算法实现(非流水线结构)`timescale1ns/

  • ubuntu安装后如何配置_ubuntu device for boot loader

    ubuntu安装后如何配置_ubuntu device for boot loader一、安装软件包#aptinstallcoturn二、配置coturn1、复制DTLS、TLS支持的证书文件:#cp/usr/share/coturn/examples/etc/turn_server_cert.pem/etc/turn_server_cert.pem#cp/usr/share/coturn/examples/etc/turn_server_pkey.pem/etc/t…

    2022年10月31日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号