Spring 三种依赖注入写法

Spring 三种依赖注入完整示例

字段注入、setter 注入、构造器注入;同时包含 lombok 简化版本

1、字段注入(不推荐,@Resource / @Autowired)

java 复制代码
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class InjectDemoService {

    // ===================== 1、字段注入(不推荐,@Resource / @Autowired) =====================
    // @Resource 优先按名字匹配,javax包;@Autowired优先按类型匹配,spring包
    @Resource
    private RedisCache redisCache1;

}

2、Setter设值注入

java 复制代码
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class InjectDemoService {


    // ===================== 2、Setter设值注入 =====================
    private RedisCache redisCache2;

    @Autowired
    public void setRedisCache2(RedisCache redisCache2) {
        this.redisCache2 = redisCache2;
    }

}

3、构造器注入(官方推荐,手写构造)

java 复制代码
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class InjectDemoService {


    // ===================== 3、构造器注入(官方推荐,手写构造) =====================
    private final RedisCache redisCache3;

    // 只有一个构造方法,Spring4.3+ 可以省略@Autowired;多个构造必须加@Autowired
    @Autowired
    public InjectDemoService(RedisCache redisCache3) {
        this.redisCache3 = redisCache3;
    }

}

Lombok 简化构造器注入(实际项目最常用)

不需要手写构造函数,@RequiredArgsConstructor自动生成 final 字段构造

java 复制代码
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class InjectLombokDemoService {
    // final修饰,lombok自动生成构造参数完成注入
    private final RedisCache redisCache;
}

区分另外两个 lombok 构造注解

  1. @NoArgsConstructor:生成无参构造
  2. @AllArgsConstructor:生成全部字段的构造,不管是不是 final
  3. @RequiredArgsConstructor:只对 final@NonNull 字段生成构造,业务开发首选

注意:需要项目引入 lombok 依赖,IDEA 安装 lombok 插件,否则代码爆红。

面试一句话记忆

@RequiredArgsConstructor + private final = 优雅构造器注入,替代字段上的@Resource/@Autowired

三种注入对比总结

注入方式 注解位置 能否使用 final 推荐度
字段注入 写在成员变量上@Resource ❌不能 final 不推荐
Setter 注入 写在 set 方法上@Autowired ❌不能 final 少用
构造器注入 构造方法(或 lombok @RequiredArgsConstructor ✅支持 final ✅官方推荐

面试要点

  1. final 成员变量只能构造器注入,字段注入、setter 注入都无法赋值 final。
  2. 构造注入可以保证依赖不为空,对象创建时依赖就必须装配完成。
  3. @RequiredArgsConstructor只会处理final@NonNull修饰的字段。

注意:RedisCache 必须交给 Spring 管理(加@Component/@Service),否则注入报错。

相关推荐
猿长大人10 天前
C# | Autofac 新手指南:从零理解依赖注入与组件装配
c#·.net·di·依赖注入
河西石头21 天前
再谈C#的抽象类和接口:从“适配器”到“毛坯房”的设计哲学
开发语言·c#·接口·依赖注入·抽象类·依赖倒挂
长谷深风11123 天前
Java基础知识梳理(五):泛型、反射、注解与Spring底层机制
依赖注入·java反射·spring框架·java泛型·类型擦除·java注解·面向切面编程(aop)
时代的狂1 个月前
如何理解 C#/.NET 的依赖注入与生命周期
c#·.net·依赖注入·控制反转
Denuin多啦咧梦1 个月前
玩转 .NET 依赖注入:Microsoft.Extensions.DependencyInjection 深度指南
c#·.net·依赖注入
zhuzicc2 个月前
Dubbo @Autowired 注入同模块接口,到底走的是本地调用还是 RPC?源码给你答案(Dubbo @Service注解的双重注册机制)
rpc·autowired·dubbo·依赖注入·java面试·spring ioc·dubbo源码分析
.NET修仙日记2 个月前
Scrutor:.NET 依赖注入自动化的优雅实现
c#·.net·.net core·微软技术·依赖注入·scrutor
小满Autumn3 个月前
依赖注入设计模式速查手册
开发语言·c#·wpf·mvvm·依赖注入
我叫张小白。3 个月前
基于Redis与FastAPI的分布式共享会话体系
数据库·redis·分布式·缓存·中间件·fastapi·依赖注入