Spring学习笔记_16——@Inject

1. 介绍

@Inject注解是JSR330规范中提供的注解,在@Inject注解中不提供任何属性,可以配合@Qualifier注解使用。

存在多个类型相同的Bean时,通过@Qualifier注解可以明确指定注入哪个Bean。

2. 场景

@Inject注解和@Autowired注解的使用场景基本相同,如果需要将Bean装配到类中的方法、构造方法和字段中,可以使用@Inject注解实现。

3. 源码

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

4. Demo

  • 构造器注入
import javax.inject.Inject;

public class UserService {
    private final UserRepository userRepository;

    @Inject
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void registerUser(String username) {
        userRepository.save(username);
    }
}
  • Setter方法注入
import javax.inject.Inject;

public class UserService {
    private UserRepository userRepository;

    @Inject
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void registerUser(String username) {
        userRepository.save(username);
    }
}
  • 字段注解
import javax.inject.Inject;

public class UserService {
    @Inject
    private UserRepository userRepository;

    public void registerUser(String username) {
        userRepository.save(username);
    }
}
  • 指定Bean名称
import javax.inject.Inject;
import javax.inject.Named;

public class PaymentService {
    private final PaymentGateway paymentGateway;

    @Inject
    public PaymentService(@Named("creditCardGateway") PaymentGateway paymentGateway) {
        this.paymentGateway = paymentGateway;
    }

    public void processPayment(double amount) {
        paymentGateway.charge(amount);
    }
}

5. @Inject && @Autowired && @Resource

@Inject
  • 来源: JSR 330 (Dependency Injection for Java)
  • 适用范围: 可以在Java EE和CDI(Contexts and Dependency Injection)环境中使用,也可以通过像Google Guice这样的库在独立的应用程序中使用。
  • 默认行为: 默认按照类型来注入依赖。如果存在多个相同类型的bean,则需要使用@Qualifier@Named等限定符来指定具体的bean。
  • 生命周期管理: 通常由CDI容器管理bean的生命周期。
@Resource
  • 来源: JSR 250 (Common Annotations for the Java Platform)
  • 适用范围: 主要用于Java EE环境,尤其是EJB和JPA。
  • 默认行为: 默认按照名称来查找资源。如果没有指定名称,它会尝试使用字段名或方法名作为默认名称。如果找不到匹配的名称,则按类型查找。
  • 生命周期管理: 通常由应用服务器提供的资源管理器来管理资源的生命周期。
@Autowired
  • 来源: Spring Framework
  • 适用范围: 专用于Spring框架。
  • 默认行为: 默认按照类型来注入依赖。如果存在多个相同类型的bean,则可以使用@Qualifier注解来指定具体的bean。如果只有一个构造函数,那么可以省略@Autowired注解,因为Spring会自动将其视为注入点。
  • 生命周期管理: 由Spring IoC容器管理bean的生命周期。
比较总结
  • 兼容性:
  • @Inject 是标准的一部分,因此更通用,可以在多种环境中使用。
  • @Resource 主要用于Java EE环境。
  • @Autowired 仅适用于Spring框架。
  • 查找策略:
  • @Inject 默认按类型查找。
  • @Resource 默认按名称查找,没有找到时再按类型查找。
  • @Autowired 默认按类型查找,如果有歧义则可以通过@Qualifier解决。
  • 灵活性:
  • @Inject@Autowired 提供了更多的灵活性,尤其是在处理复杂的依赖关系时。
  • @Resource 更加简单直接,但在某些情况下可能不够灵活。
  • 工具支持:
  • @Inject 得到了广泛的IDE和工具支持。
  • @Autowired 有强大的Spring生态系统的支持。
  • @Resource 也有良好的IDE支持,特别是在Java EE项目中。

6. 补充

JSR 175: A Metadata Facility for the Java Programming Language

  • @Override:标记方法重写了父类的方法。
  • @Deprecated:表示该元素已过时,不建议使用。
  • @SuppressWarnings:用于抑制编译器警告。

JSR 305: Annotations for Software Defect Detection

虽然这个JSR最终没有完成,但是它的注解被广泛采用,并且包含在一些库如FindBugs或Checker Framework中:

  • @Nullable
  • @Nonnull
  • @CheckForNull

JSR 308: Annotations on Java Types

允许将注解放置在任何类型使用的地方,而不仅仅是在声明上。这扩展了JSR 175的功能。尽管JSR 308本身并没有引入新的标准注解,但它使得像Checker Framework这样的工具能够创建和使用更复杂的类型注解。

JSR 250: Common Annotations for the Java Platform

  • @Resource:用来注入资源,比如DataSource等。
  • @PostConstruct:标记一个方法,在依赖注入完成后执行初始化工作。
  • @PreDestroy:标记一个方法,在Bean销毁之前执行清理工作。

JSR 330: Dependency Injection for Java

  • @Inject:标记构造函数、字段或者方法为需要依赖注入。
  • @Named:与@Inject一起使用,允许通过名称指定bean。
  • @Qualifier:用于区分多个相同类型的bean。
  • @Scope:定义bean的作用域。
  • @Singleton:表示bean是单例的。

JSR 349: Improved Reusability of JSR 330-based Dependency Injection APIs

增强了JSR 330定义的依赖注入API的可重用性,但没有引入新的注解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有序序列合并(c语言)

代码实例 int main() {int n 0;int m 0;scanf("%d %d", &n, &m);//n输入第一个升序数组中的元素个数//m输入第二个升序数组中的元素个数//创建数组//arr1为n对应的数组int arr1[1000];//arr2为m对应的数组int arr2[1000];//arr3为数组1与数组2结合后的数组…

Java审计对比工具JaVers使用

最近有个需求,需要将页面的内容生成excel或者word文档,而且每次的修改都需要生成新的版本,同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象,同时存储到数据库一条新数据,对应数据表一…

知识图谱:连接实体与关系的语义网络

知识图谱作为人工智能领域的核心技术之一,是一种通过三元组(实体关系属性)形式,结构化表达实体间关系的语义网络。这种网络不仅嵌入了丰富的语义和逻辑,还遵循一定的规则,使其成为人类进行推理、预测和分类…

免费PDF页面提取小工具

下载地址 https://download.csdn.net/download/woshichenpi/89922797 使用说明:PDF页面提取工具 1. 启动应用程序 双击程序的启动图标或者通过命令行运行程序。 2. 选择PDF文件 在应用程序窗口中找到“选择PDF”按钮并点击它。在弹出的文件选择对话框中&#x…

法律智能助手:开源NLP系统助力法律文件高效审查与检索

一、系统概述 思通数科AI平台是一款融合了自然语言处理和多标签分类技术的开源智能文档分类工具,特别适用于法律行业。平台采用深度学习的BERT模型来进行特征提取与关系抽取,实现了精准的文档分类和检索。用户可以在线训练和标注数据,使系统…

-XSS-

链接 https://github.com/do0dl3/xss-labs 搭建过程非常容易的 搭建好之后,就可以点击图片开始闯关了 第一关--JS弹窗函数alert() 显示payload的长度是4 level1.php?nametest level1.php?nametest1 发现只要改变name的值就显示什么在页面上 没有什么过滤的 …

Python | Leetcode Python题解之第522题最长特殊序列II

题目&#xff1a; 题解&#xff1a; class Solution:def findLUSlength(self, strs: List[str]) -> int:def is_subseq(s: str, t: str) -> bool:pt_s pt_t 0while pt_s < len(s) and pt_t < len(t):if s[pt_s] t[pt_t]:pt_s 1pt_t 1return pt_s len(s)ans …

VBto Converter是一款功能强大的工具,可让您快速轻松地将Microsoft Visual Basic 6.0项目转换

VBto Converter是一款功能强大的工具&#xff0c;可让您快速轻松地将Microsoft Visual Basic 6.0项目转换 1、简介2、官方网站3、本站下载&#xff08;已汉化&#xff09; 1、简介 VBto Converter V2.90 版本&#xff0c;是一款功能强大的工具&#xff0c;可让您快速轻松地将M…

勒索软件通过易受攻击的 Cyber​​Panel 实例攻击网络托管服务器

一个威胁行为者&#xff08;或可能多个&#xff09;使用 PSAUX 和其他勒索软件攻击了大约 22,000 个易受攻击的 Cyber​​Panel 实例以及运行该实例的服务器上的加密文件。 PSAUX 赎金记录&#xff08;来源&#xff1a;LeakIX&#xff09; Cyber​​Panel 漏洞 Cyber​​Pane…

创新业态下金融头部机构在 FICC 平台建设上的思考与实践

近年来&#xff0c;FICC 投资交易呈现活跃多元态势&#xff0c;创新转型稳步推进。FICC 平台电子化方兴未艾&#xff0c;是机构提升服务效率和质量的一大着力点。因此&#xff0c;在 FICC 平台建设上&#xff0c;许多机构都进行了深入研究&#xff0c;积累了丰富的实践经验。 …

RedisIO多路复用

一、多路复用要解决的问题: 并发多客户端连接&#xff0c;在多路复用之前的处理方案是同步阻塞网络IO模型&#xff0c;这种模型的特点就是用一个进程来处理一个网络连接。优点在于比较简单&#xff0c;缺点在于性能较差&#xff0c;每个用户请求到来都得占用一个进程来处理&am…

XML解析小坑记录[正则表达式解析]

一、问题描述 在做 SSO 单点登录时( 认证中为CAS服务对接 )。在完成对用户ticket票根校验后&#xff0c;返回了用户信息有关 XML 数据片段&#xff0c;例如下&#xff1a; <cas:serviceResponse xmlns:cas"http://www.xxx.xx/xx/cas"><cas:authentication…

人工智能与伦理:我们应该如何平衡科技与人性?

内容概要 在这个瞬息万变的时代&#xff0c;人工智能的迅猛发展让我们面对前所未有的伦理困境。科技进步带来了便利&#xff0c;但同时也亟需我们反思如何对待人性。尤其是在实现算法透明性时&#xff0c;我们要确保每一个决策背后都能被理解与追溯&#xff0c;这不仅是对技术…

electron展示下载进度条

我们使用electron下载文件时&#xff0c;会发现不像浏览器一样会有地方展示下载进度&#xff0c;这导致下载一些大文件时不知道下载进度到哪里了 下面我们通过electron提供的will-download监听和element-plus中的ElNotification和ElProgress组件实现这一功能 实现逻辑 触发…

【算法】(Python)回溯算法

回溯算法&#xff1a; 回溯算法是一种算法思想。采用“深度优先搜索&#xff08;dfs&#xff0c;depth first search&#xff09;”。采用“尝试”和“回溯”的策略。尝试搜索所有可能的解决方案&#xff0c;遇到不满足条件的撤销选择、回退到回溯点&#xff08;满足回溯条件的…

音视频入门基础:FLV专题(18)——Audio Tag简介

一、引言 根据《video_file_format_spec_v10_1.pdf》第75页&#xff0c;如果某个Tag的Tag header中的TagType值为8&#xff0c;表示该Tag为Audio Tag&#xff1a; 这时StreamID之后紧接着的就是AudioTagHeader&#xff0c;也就是说这时Tag header之后的就是AudioTagHeader&…

探索Python终端美化的终极利器:Rich库

文章目录 &#x1f680; 探索Python终端美化的终极利器&#xff1a;Rich库第一部分&#xff1a;背景介绍第二部分&#xff1a;Rich库是什么&#xff1f;第三部分&#xff1a;如何安装Rich库&#xff1f;第四部分&#xff1a;Rich库的简单函数使用方法第五部分&#xff1a;结合场…

【Java笔记】1-JDK/JRE/JVM是个啥?

JDK、JRE、JVM可以说是入门必须了解的三个词汇 先说全称 JDK&#xff1a;Java Development Kit&#xff0c;Java开发工具包 JRE&#xff1a;Java Runtime Environment&#xff0c;Java运行环境 JVM&#xff1a;Java Virtual Machine&#xff0c;Java虚拟机 再说关系 JVM⊆J…

视觉目标检测标注xml格式文件解析可视化 - python 实现

视觉目标检测任务&#xff0c;通常用 labelimage标注&#xff0c;对应的标注文件为xml。 该示例来源于开源项目&#xff1a;https://gitcode.com/DataBall/DataBall-detections-100s/overview 读取 xml 标注文件&#xff0c;并进行可视化示例如下&#xff1a; #-*-coding:ut…

金和OA-C6 ApproveRemindSetExec.aspx XXE漏洞复现(CNVD-2024-40568)

0x01 产品描述&#xff1a; 金和C6协同管理平台是以"精确管理思想"为灵魂&#xff0c;围绕“企业协同四层次理论”模型&#xff0c;并紧紧抓住现代企业管理的六个核心要素&#xff1a;文化 Culture、 沟通Communication 、 协作Collaboration 、创新 Creation、 控制…