SpringBoot中的bean注入方式和原理介绍

2023-11-14

Spring Boot是一个非常流行的Java框架,它可以帮助开发者快速地构建高效、健壮的应用程序。其中一个重要的功能就是依赖注入,也就是将一个对象注入到另一个对象中,以便它们可以相互协作。在Spring Boot中,依赖注入是通过bean实现的,本文将介绍Spring Boot中的bean注入方式和原理。

 

什么是Bean

在Spring Boot中,Bean是一个被Spring容器管理的Java对象。当Spring容器启动时,它会读取应用程序的配置文件(如application.properties或application.yml)并创建所有的Bean。开发者可以在配置文件中定义Bean,也可以使用注解的方式定义Bean。定义Bean的方式多种多样,包括XML配置文件、Java配置类、注解等。

Spring Boot的Bean是单例的,也就是说,只会创建一个实例,然后在需要的地方共享使用。当应用程序启动时,Spring容器会根据定义的规则来创建所有的Bean,并将它们存储在容器中。在应用程序运行期间,其他组件可以通过Spring容器获取这些Bean,并使用它们。

Bean注入方式

Spring Boot提供了多种方式来注入Bean,包括构造函数注入、Setter方法注入、字段注入、和方法注入等。不同的注入方式适用于不同的场景,下面我们将逐一介绍这些注入方式。

构造函数注入

构造函数注入是最常用的注入方式之一。开发者可以在Bean类的构造函数中声明需要注入的Bean,并在应用程序启动时,Spring容器会自动将这些Bean注入到构造函数中。下面是一个简单的示例:

@Service
public class UserServiceImpl implements UserService {
    private final UserRepository userRepository;
    
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    // ...
}

在上面的例子中,UserServiceImpl类的构造函数中包含了一个UserRepository类型的参数。在应用程序启动时,Spring容器会自动将UserRepository对象注入到构造函数中。这样,UserService就可以使用UserRepository对象了。

Setter方法注入

Setter方法注入是另一种常用的注入方式。开发者可以在Bean类中定义Setter方法,并使用@Autowired注解将需要注入的Bean作为参数传入。Spring容器会自动调用这些Setter方法,并将Bean注入到它们中。下面是一个示例:

typescriptCopy code@Service
public class UserServiceImpl implements UserService {
    private UserRepository userRepository;
    
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    // ...
}

在上面的例子中,UserServiceImpl类中包含了一个名为setUserRepository的Setter方法,并使用@Autowired注解将UserRepository对象作为参数传入。在应用程序启动时,Spring容器会自动调用setUserRepository方法,并将UserRepository对象注入到它中。

字段注入

字段注入是一种不太常用的注入方式,它使用@Autowired注解直接将需要注入的Bean注入到类的字段中。下面是一个示例:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;
    
    // ...
}

在上面的例子中,UserServiceImpl类中包含了一个UserRepository类型的字段,并使用@Autowired注解将UserRepository对象注入到它中。在应用程序启动时,Spring容器会自动将UserRepository对象注入到该字段中。

需要注意的是,字段注入有一定的限制,它不能注入final字段和静态字段。

方法注入

方法注入是一种比较灵活的注入方式,开发者可以在Bean类中定义一个方法,并使用@Autowired注解将需要注入的Bean作为参数传入。Spring容器会自动调用这个方法,并将Bean注入到它中。下面是一个示例:

@Service
public class UserServiceImpl implements UserService {
    private UserRepository userRepository;
    
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    @Autowired
    public void init() {
        // ...
    }
    
    // ...
}

在上面的例子中,UserServiceImpl类中定义了一个名为init的方法,并使用@Autowired注解将UserRepository对象作为参数传入。在应用程序启动时,Spring容器会自动调用这个方法,并将UserRepository对象注入到它中。

Bean注入原理

Spring Boot的Bean注入是通过反射机制实现的。在应用程序启动时,Spring容器会读取应用程序的配置文件,并根据配置文件中定义的规则来创建Bean。当容器创建Bean时,它会检查Bean类中是否包含被注入的属性或方法,并根据属性或方法的注解信息来确定要注入的对象。

在注入对象时,Spring容器首先会查找与该对象类型匹配的Bean,如果找到了多个匹配的Bean,则会根据被注入的属性或方法上的@Qualifier注解来确定要注入的Bean。如果没有找到匹配的Bean,则会抛出NoSuchBeanDefinitionException异常。

需要注意的是,Spring容器中的Bean是单例的,也就是说,只会创建一个实例,并在需要的地方共享使用。当一个Bean被注入到另一个Bean中时,它实际上是将这个Bean的引用注入到另一个Bean中,而不是创建一个新的实例。

总结

Spring Boot的Bean注入是一个非常重要的功能,它可以帮助开发者快速地构建高效、健壮的应用程序。本文介绍了Spring Boot中的Bean注入方式和原理,包括构造函数注入、Setter方法注入、字段注入和方法注入等。了解这些注入方式和原理,可以帮助开发者更好地理解Spring Boot的Bean注入机制,从而在开发过程中更加灵活地使用它。

需要注意的是,在使用Bean注入时,开发者应该注意Bean的作用域和生命周期。Spring Boot中默认的作用域是单例模式,也就是说,一个Bean在容器中只有一个实例。如果需要使用其他作用域,例如原型模式或会话作用域等,需要使用@Scope注解来指定。

另外,在应用程序关闭时,Spring容器会自动销毁所有的Bean。如果开发者需要在销毁Bean之前执行某些操作,例如释放资源或关闭连接等,可以使用@PreDestroy注解来标注一个方法,该方法会在Bean销毁之前被调用。

最后,需要注意的是,Bean注入只是Spring Boot中的一个小功能,要想充分发挥Spring Boot的优势,还需要掌握其他重要的功能,例如AOP、事务管理、消息队列等。只有掌握了这些功能,才能开发出高效、健壮的应用程序。

结论

在Spring Boot中,Bean注入是一种非常重要的功能,它可以帮助开发者快速构建高效、健壮的应用程序。本文介绍了Spring Boot中Bean注入的基本概念、注入方式和原理,包括构造函数注入、Setter方法注入、字段注入和方法注入等。同时,本文还介绍了Bean的作用域和生命周期等相关知识。通过本文的学习,相信读者已经对Spring Boot中的Bean注入有了更深入的了解,能够更加灵活地使用Bean注入来开发高效、健壮的应用程序。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot中的bean注入方式和原理介绍 的相关文章

随机推荐

  • OpenStack--实现内外网结构

    类似于阿里云 ECS 主机的内外网 双网卡不通网段 的结构 最终实现内外网区分隔离 https www aliyun com product ecs utm medium text utm source baidu utm campaign
  • STM32低速时钟频率校准方法

    RT Thread的PM组件利用LPTIM来实现低功耗唤醒和系统tick补偿 而LPTIM的时钟源一般会选择LSI LSI这玩意儿功耗虽然只有几百nA 但是频偏非常大 例如STML051手册上就说LSI的频率在26kHz 56kHz之间 典
  • STL-stack容器和queue容器

    stack概念 stack是一种先进后出 First In Last Out FILO 的数据结构 它只有一个出口 栈中只有顶端的元素才可以被外界使用 因此栈不允许有遍历行为 与queue相似 stack也是一个适配器类 它给底层vecto
  • %d %ld %lld

    因特网 互联网 以太网 局域网的区别 相信下面几个表达方式 就能说明问题吧 d int ld long lld long long 在32位编译器上 int long 32bit long long 64bit
  • 心得:Javascript的内存释放实验

    我以前也看过关于javascript的内存释放的文章 但我从来也没仔细看过 原因 一来我觉得这个东西可有可无 二来 鬼知道这些理论到底有没有科学根据 今天我做了一个小小的实验 证实内存释放还是有用的 比如有如下程序 var a new Ar
  • 一个三节点的PVE 6.1+CEPH集群,因为系统损坏,全部重新安装。

    注意 逐一重装系统 重新加入PVE集群 重新加入CEPH集群 先禁用ceph的recover 避免其因OSD丢失重建 任一节点执行 for i in noout nobackfill norecover do ceph osd set i
  • windows上面运行jar文件

    1 ctrl r进入CMD模式 2 切换到jar所在的目录 我的XXX jar在D workspace下面 3 运行jar java jar XXX jar
  • Redis过期策略与淘汰策略

    redis为什么这么快 原因之一就是Redis操作都是基于内存的 既然是基于内存的 而内存的大小是有限的 当内存不足或占用过高时 Redis会采用内存淘汰机制进行数据淘汰 一 Redis的过期策略 Redis在设置缓存数据时指定了过期时间
  • 前端常用第三方库

    常用功能的第三方插件集合 一 下载 1 原生 1 a 标签 只能同源下载 2 iframe 下载 支持跨域get请求 3 Form 表单下载 支持跨域get和post请求 2 第三方插件 1 FileSaver js 2 StreamSav
  • [leetcode] 358. Rearrange String k Distance Apart 解题报告

    题目链接 https leetcode com problems rearrange string k distance apart Given a non empty string str and an integer k rearran
  • lock与unlock用法(简单易懂)

    lock最简单的用法就是 在多线程中 我们往往要操作同一块内存 但是同一时间只允许一个线程操作 其他想要操作 只能等到被释放 这个时候就可以用到lock 文件共享锁 用法 mutex 名称 例如 mutex testlock 举个例子 例如
  • 笔记--Ubuntu18.04安装Deepstream 6.0

    目录 1 安装依赖 2 安装Cuda Toolkit 11 4 1 3 安装cudnn 8 2 4 安装TensorRT 8 0 1 5 安装librdkafka 6 安装 deepstream sdk 7 验证与测试 8 问题记录 参考
  • ChatGPT是如何辅助高效撰写论文及使用ChatGPT注意事项

    ChatGPT发布近1年 各大高校对它的态度也发生了极大转变 今年3月发布ChatGPT禁令的牛剑等世界顶级名校也在近期解除了ChatGPT禁令 发布了生成式人工智能使用指南 ChatGPT一定程度上可以解放科研人员的劳动力 与其直接禁止不
  • IDEA 导入依赖,还是报java.lang.NoClassDefFoundError

    java lang NoClassDefFoundError net coobird thumbnailator Thumbnails IDEA 导入依赖 还是报java lang NoClassDefFoundError maven 里面
  • Powershell简介

    Powershell简介 PowerShell是一种功能强大的脚本语言和shell程序框架 主要用于Windows计算机方便管理员进行系统管理并有可能在未来取代Windows上的默认命令提示符 PowerShell脚本因其良好的功能特性常用
  • IPsec over GRE 和GRE over IPsec比较和区别与配置

    GRE over IPsec IPsec over GRE I PSec Over GRE是先ipsec后gre 这种我没用过 GRE Over IPSec 是先gre后ipsec 也就是说ipsec是最后的承载方式 一般常用的就是这种 解
  • webpack4+动态导入(按需加载方式)

    此文为复习或升级webpack过程中的总结 webpack版本为4 29 5 webpack4 动态导入 目的 减少包体积 按需加载 常见使用情况有以下3中 1 使用import 的情况 output filename bundle js
  • $‘\r‘: 未找到命令的解决办法

    前言 有时我们在执行shell脚本的时候 会出现 r 未找到命令 错误 绝大多数情况下是因为在window系统中写的shell脚本 然后上传到服务器执行造成的 解决办法如下 1 安装dos2unix yum install dos2unix
  • 用汇编语言实现从键盘输入一个字符,在下一行上以十六进制形式输出它的ASCII码。

    在我之前的一篇博客里已经写过如何输出一个字符的ASCII码的十进制形式 以十六进制形式输出的方法与其相差不多 详情可查看我的专栏 汇编语言 里的第一篇博客 要求如下 代码如下 data segment string1 db 5 dup st
  • SpringBoot中的bean注入方式和原理介绍

    Spring Boot是一个非常流行的Java框架 它可以帮助开发者快速地构建高效 健壮的应用程序 其中一个重要的功能就是依赖注入 也就是将一个对象注入到另一个对象中 以便它们可以相互协作 在Spring Boot中 依赖注入是通过bean