notes notes
首页
  • 主题初衷与诞生
  • 介绍
  • 快速上手
  • 目录结构
  • 相关文章

    • 使目录栏支持h2~h6标题
    • 如何让你的笔记更有表现力
    • 批量操作front matter工具
    • 部署
    • 关于写文章和H1标题
    • 关于博客搭建与管理
  • PostgreSQL 全文搜索
  • 依赖注入
  • 开发常见问题
  • 逻辑删除
  • TCP 粘包和拆包
  • netty 粘包和拆包
  • 在k8s集群中搭建一个harbor私有仓库
  • 优雅停机
  • helm 命令学习
  • yield 关键字
  • 不定参数
TODO
  • REST API
  • 使用 IntelliJ IDEA 反编译 jar
  • Spring Boot 删除前后空白字符
  • 设计模式

    • 装饰器模式
Docker
Tool Box (opens new window)
GitHub (opens new window)
首页
  • 主题初衷与诞生
  • 介绍
  • 快速上手
  • 目录结构
  • 相关文章

    • 使目录栏支持h2~h6标题
    • 如何让你的笔记更有表现力
    • 批量操作front matter工具
    • 部署
    • 关于写文章和H1标题
    • 关于博客搭建与管理
  • PostgreSQL 全文搜索
  • 依赖注入
  • 开发常见问题
  • 逻辑删除
  • TCP 粘包和拆包
  • netty 粘包和拆包
  • 在k8s集群中搭建一个harbor私有仓库
  • 优雅停机
  • helm 命令学习
  • yield 关键字
  • 不定参数
TODO
  • REST API
  • 使用 IntelliJ IDEA 反编译 jar
  • Spring Boot 删除前后空白字符
  • 设计模式

    • 装饰器模式
Docker
Tool Box (opens new window)
GitHub (opens new window)
  • 知识积累

    • PostgreSQL 全文搜索
    • @AutoWired VS @Resource VS @Inject
      • @AutoWired VS @Resource VS @Inject
      • 示例
        • @Resource
        • @Inject
        • AutoWired
    • 开发常见问题
    • 逻辑删除
    • TCP 粘包和拆包
    • netty 粘包和拆包
    • 在k8s集群中搭建一个harbor私有仓库
    • 优雅停机
    • helm 命令学习
目录

@AutoWired VS @Resource VS @Inject

# @AutoWired VS @Resource VS @Inject

本文只比较 Field Injection 和 Setter Injection 的方式,暂未比较构造函数注入的方式

Autowired @Resource @Inject
来源 Spring JSR-250 (opens new window) JSR-330 (opens new window)
作用范围 Field Injection
Setter Injection
Field Injection
Setter Injection
Field Injection
Setter Injection
注入规则
优先级由高到低
By Bean Type
By Qualifier
By Bean Name
By Bean Name
By Bean Type
by Qualifier
By Bean Type
By Qualifier
By Bean Name
注意事项 需要额外引入javax.inject依赖

# 示例

# @Resource

# 字段注入

// case1. Inject by Bean Name
// 上下文中必须有名为 `authService` 的 Bean, 否则将抛出 NoSuceBeanDefinitionException
@Resource(name="authService")
private AuthService authService;

// case2. Inject by Bean Type
@Resource
private AuthService authService;

// case3. Inject by Qualifier
// 适用于同一种类型的 Bean 有多个实例时,需要在 `Qualifier` 中指定 Bean Name
@Resource
@Qualifier("authService1")
private AuthService authService1;
@Resource
@Qualifier("authService2")
private AuthService authService2;

# Setter 注入

使用方法与 Field Injection 基本相同,唯一区别是注解加在 set 方法上,如:

@Resource(name="authService")
protected void setAuthService(AuthService authService) {
    this.authService = authService;
}

@Resource
@Qualifier("authService1")
public void setAuthService1(AuthService authService) {
    this.authService1 = authService1;
}

# @Inject

# 字段注入

与 Resource 的 Field Injection基本相同,区别在于 By Bean Name 注入时的需要另一个注解 Named,如:

@Inject
@Named("authService")
private AuthService authService;

# Setter 注入

与 Resource 的 Setter Injection相同

# AutoWired

# 字段注入

与 Resource 的 Field Injection基本相同,区别在于 By Bean Name 注入时变量名必须与 Bean Name 相同,如:

// AutoWired 先根据类型注入,当同一个类型有多个实例时,再根据 name 注入,此时变量名必须与Bean Name相同才能注入成功。
// 个人认为,此时用 `Qualifier` 更加直观,不易出错
@AutoWired
private AuthService authService;

# Setter 注入

与 Resource 的 Setter Injection相同

上次更新: 2023/12/08, 06:34:37
PostgreSQL 全文搜索
开发常见问题

← PostgreSQL 全文搜索 开发常见问题→

Theme by Vdoing | Copyright © 2023-2023
Powered by vuepress-theme-vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式