当前位置: 首页 > article >正文

Spring IoC——依赖注入

1. 依赖注入的介绍

DI,也就是依赖注入,在容器中建立的 bean (对象)与 bean 之间是有依赖关系的,如果直接把对象存在 IoC 容器中,那么就都是一个独立的对象,通过建立他们的依赖关系,才能拿出一个对象,然后与它建立依赖关系的对象就也可以使用,在 Spring 的 IoC 容器中,通过配置可以明确各个 Bean之间的依赖关系当一个 Bean 需要另一个 Bean 时,IoC 容器会自动将依赖的 Bean 注入进来,这个过程就是依赖注入。

2. 三种注入方式

2.1. 属性注入

属性注入直接通过@Autowired来实现的,直接加在属性上就可以完成注入

@Controller
public class UserController {
    @Autowired
    private UserService userService;
    public void say(){
        System.out.println("UserController");
        userService.say();
    }
}

2.2. 构造方法注入

构造方法注入是通过在类的构造方法中完成注入

@Controller
public class UserController {
    private UserService userService;

    private UserController(UserService userService) {
        this.userService = userService;
    }

    public void say() {
        System.out.println("UserController");
        userService.say();
    }
}

如果说有多个构造方法的话,就需要指明需要使用哪个构造方法完成注入

为什么会空指针呢

如果有多个构造方法的话,默认是使用无参的构造方法的,可以通过@Autowired来指明使用哪个构造方法完成注入

@Controller
public class UserController {
    private UserService userService;

    private UserController(){
    }
    @Autowired
    private UserController(UserService userService) {
        this.userService = userService;
    }

    public void say() {
        System.out.println("UserController");
        userService.say();
    }
}

关于传参:

交给 Spring 管理的对象,如果有参数,可以自己指定参数,如果没有指定,Spring 就会根据名称或者类型,从容器中查找对象,并注入进来

2.3. setter 注入

setter 注入是需要在 set 方法上加上@Autowired的,不能省略

@Autowired
private void setUserService(UserService userService){
    this.userService = userService;
}

2.4. 三种方式的对比

属性注入:

优点:简洁,使用方便

缺点:不能注入一个 final 修饰的属性

构造方法注入:

优点:

  1. 可以注入 final 修饰的属性
  2. 注入的对象不会被修改
  3. 依赖对象在使用前一定会被初始化,构造方法是在类加载时就会执行的
  4. 通用性好,构造方法是 JDK 支持的,换任何框架都适用

setter 注入:

优点:方便在类实例之后,重新对该对象进行配置或者注入

缺点:

  1. 不能注入 final 修饰的属性
  2. 注入的对象可能会被改变,因为 setter 方法可能会被多次调用,就会有被修改的风险

3. @Autowired 存在的问题

Autowired 如果是同样类型有多个名称的对象时,按照名称来注入,如果只有一个对象,就直接注入,无论名称是否能对上

来看多个对象:

可以通过@Primary来指定默认使用哪个 bean 来装配

@Primary
@Bean
public UserInfo userInfo1(){
    return new UserInfo("lisi1",20);
}

还可以通过@Qualifier@Autowired配合使用来指定默认使用哪个 bean

当传入的参数也存在相同类型的对象时,也可以指定参数的默认值

@Bean
public UserInfo userInfo(@Qualifier("name1") String name3){
    return new UserInfo(name3,20);
}

如果不使用 @Autowired的话还可以使用 @Resource注解来指定

@Autowired@Resource的区别:

  1. @Autowired 是Spring 框架提供的注解,@Resource 是 JDK 提供的注解
  2. @Autowired 默认是按照类型注入,@Resource 默认是按照名称注入
  3. @Autowired 优先按照类型匹配,如果类型相同再看名称,@Resource 前提也是要类型匹配,只不过是名称匹配的优先级更高:例如,有一个UserService类,需要注入一个UserRepository,如果使用@Resource注解并且指定了一个名称(如@Resource(name = "userRepo")),Spring 会首先查找名称为userRepoUserRepository类型的 Bean。只有在找不到这个名称对应的 Bean 时,才会去查找类型为UserRepository的 Bean,而不管其名称是什么。

@Autowired 的装配顺序:

我的主页


http://www.kler.cn/a/380553.html

相关文章:

  • 在 Ubuntu 下使用 Tauri 打包 EXE 应用
  • MySQL数据库——复制表数据与结构
  • 利用.NET Upgrade Assitant对项目进行升级
  • Linux的VIM基本操作
  • 对于其他管理的理解(中)
  • Android Studio新建项目在源码中编译
  • 每日算法练习
  • 从 vue 源码看问题 — vue 如何进行异步更新?
  • 深入理解 Linux df 命令:用法详解与使用示例
  • 【Linux】从零开始使用多路转接IO --- epoll
  • 易盾增强版滑块识别/易盾识别/滑块识别/增强版滑块识别/易盾滑块本地识别
  • 前端通过nginx部署一个本地服务的方法
  • 关于 PDF 抽取的吐槽
  • 【LeetCode】每日一题 2024_11_5 求出硬币游戏的赢家(模拟/数学)
  • Node学习记录-events
  • 论文阅读-用于点云分析的自组织网络
  • TDengine数据备份与恢复
  • 【云备份项目】json以及jsoncpp库的使用
  • SpringBoot新闻稿件管理系统:架构与实现
  • 【零售和消费品&存货】快递包裹条形码与二维码识别系统源码&数据集全套:改进yolo11-RFCBAMConv
  • redis7学习笔记
  • nodejs入门教程12:nodejs url模块
  • WindowsDocker安装到D盘,C盘太占用空间了。
  • 确定性信道无损耗信道无用信道对称信道
  • mysql 8.0.39 Caused by: java.sql.SQLException: Illegal mix of collations 异常解决
  • 信而泰防火墙安全测试解决方案:为网络安全保驾护航