Spring boot 中的IOC容器对Bean的管理

Spring(Spring MVC、Spring Boot) Spring(Spring MVC、Spring Boot)相关面试题 阅读详情

Spring Boot 中 IOC 容器对 Bean 的管理,涵盖从容器启动到 Bean 的生命周期管理的全流程。现在有第三方工具类,我们是不知道内部是如何来写的有什么包等,通过注解的形式我们可以获取到对应第三方工具类里面的信息,调用里面的方法。来简化我们导入第三方工具包的一些方法。


步骤 1:理解 Spring Boot 的容器启动

Spring Boot 的 IOC 容器基于 ApplicationContext,在应用启动时自动初始化。

  1. 入口类:通过 @SpringBootApplication 注解标记主类,启动容器。

    @SpringBootApplication
    public class MyApp {
        public static void main(String[] args) {
            SpringApplication.run(MyApp.class, args); // 启动容器
        }
    }
    
    • @SpringBootApplication 组合了三个核心注解:
      • @Configuration:标记为配置类。
      • @ComponentScan:自动扫描当前包及子包的组件(@Component, @Service 等)。
      • @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。
  2. 容器初始化:

    • Spring Boot 启动时,创建 ApplicationContext(默认实现为 AnnotationConfigApplicationContext)。
    • 自动加载所有符合条件的 Bean(通过组件扫描和自动配置)。

步骤 2:注册 Bean 到容器

Bean 的注册主要有三种方式:

方式 1:组件扫描(自动注册)
  • 使用 @Component 及其派生注解标记类,容器自动扫描并注册为 Bean。
    @Service // 等价于 @Component,语义化标记为服务层
    public class UserService {
        // ...
    }
    
    • 其他派生注解:@Repository(DAO 层)、@Controller(Web 层)、@RestController。
方式 2:Java 配置类(显式注册)
  • 定义 @Configuration 类,通过 @Bean 方法显式注册 Bean。
    @Configuration
    public class AppConfig {
        @Bean // 方法返回的对象会被注册为 Bean
        public DataSource dataSource() {
            return new HikariDataSource(); // 例如配置数据源
        }
    }
    
方式 3:自动配置(Spring Boot 特有)
  • Spring Boot 根据类路径依赖自动注册 Bean(如引入 spring-boot-starter-web 会自动配置 Tomcat、Spring MVC 相关 Bean)。
  • 原理:通过 META-INF/spring.factories 文件定义自动配置类,结合条件注解(如 @ConditionalOnClass)判断是否生效。

步骤 3:依赖注入(DI)

容器负责将依赖的 Bean 注入到需要它们的对象中。

注入方式
  1. 构造器注入(推荐):

    @Service
    public class OrderService {
        private final UserService userService;
        
        @Autowired // Spring 4.3+ 后,如果只有一个构造器,可省略 @Autowired
        public OrderService(UserService userService) {
            this.userService = userService;
        }
    }
    
  2. Setter 注入:

    public class MyService {
        private MyRepository repository;
        
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    }
    
  3. 字段注入(不推荐,仅用于简单场景):

    @Service
    public class MyService {
        @Autowired
        private MyRepository repository;
    }
    

步骤 4:Bean 的作用域管理

通过 @Scope 注解指定 Bean 的作用域。

  1. 常用作用域:
    • Singleton(默认):整个容器中只有一个实例(从始至终只有这一个)。
      @Bean
      @Scope("singleton")
      public MyBean myBean() { return new MyBean(); }
      
    • Prototype:每次请求创建新实例(每次使用的时候都需要重新创建这个bean)。
      @Bean
      @Scope("prototype")
      public MyBean myBean() { return new MyBean(); }
      
    • Request(Web 环境):每个 HTTP 请求一个实例。
    • Session(Web 环境):每个用户会话一个实例。

步骤 5:Bean 的生命周期管理

通过注解或接口控制 Bean 的初始化和销毁逻辑。

  1. 初始化方法:

    @Component
    public class MyBean {
        @PostConstruct // 初始化完成后执行
        public void init() {
            System.out.println("Bean 初始化完成!");
        }
    }
    
  2. 销毁方法:

    @Component
    public class MyBean {
        @PreDestroy // 容器关闭前执行
        public void cleanup() {
            System.out.println("Bean 即将销毁!");
        }
    }
    

步骤 6:高级配置与条件化 Bean

通过条件注解控制 Bean 的注册。

  1. 条件注解示例:

    @Configuration
    public class MyConfig {
        @Bean
        @ConditionalOnClass(name = "com.example.ExternalLibrary") // 当类路径存在该类时注册
        public MyBean myBean() {
            return new MyBean();
        }
        
        @Bean
        @ConditionalOnMissingBean // 当容器中没有该类型 Bean 时注册
        public BackupBean backupBean() {
            return new BackupBean();
        }
    }
    
  2. Profile 环境隔离:

    @Bean
    @Profile("dev") // 仅在 dev 环境下激活
    public DataSource devDataSource() {
        return new EmbeddedDatabaseBuilder().build();
    }
    

步骤 7:解决常见问题

  1. 循环依赖:

    • 避免构造器注入循环,改用 Setter 或字段注入。
    • 重构代码,提取公共逻辑到第三方 Bean。
  2. Bean 冲突:

    • 使用 @Primary 标记首选 Bean:
      @Bean
      @Primary
      public MyService primaryService() {
          return new PrimaryService();
      }
      
    • 使用 @Qualifier 指定具体 Bean:
      @Autowired
      @Qualifier("secondaryService")
      private MyService myService;
      

步骤 8:测试与验证

  1. 集成测试:

    @SpringBootTest
    class UserServiceTest {
        @Autowired
        private UserService userService; // 注入真实 Bean
    }
    
  2. 单元测试(Mock 依赖):

    @SpringBootTest
    class OrderServiceTest {
        @MockBean
        private UserService userService; // 模拟 UserService
        
        @Autowired
        private OrderService orderService;
    }
    

总结

通过以上步骤,Spring Boot 的 IOC 容器完成了以下核心任务:

  1. 启动容器:基于 @SpringBootApplication 和 ApplicationContext。
  2. 注册 Bean:通过组件扫描、配置类、自动配置。
  3. 依赖注入:构造器注入(推荐)、Setter 注入、字段注入。
  4. 作用域管理:单例、原型、请求、会话等。
  5. 生命周期控制:@PostConstruct 和 @PreDestroy。
  6. 高级配置:条件化 Bean、Profile 隔离。
  7. 问题解决:循环依赖、Bean 冲突。
  8. 测试验证:集成测试与单元测试。

掌握这些步骤后,可以高效利用 Spring Boot 的 IOC 容器管理 Bean,构建松耦合、可维护的应用。

Spring-boot框架使用手册之一——Spring Ioc(基于注解) Spring-boot框架使用手册之一——Spring Ioc(基于注解) 快递100是专业的快递物流互联网平台,为数以亿记的用户提供快递物流的查、寄件服务。快递100的各种服务已经稳定高效的运行了多年,为中国的快递物流行业的快速发展做出了很大的贡献,这一切都离不开背后默默贡献的程序猿们。 从第一个独立站点上线至今,快递100已经走过了10个年头,10年沧海桑田,10年经历了一次又一次的技术、架构升级。今年来,由于spring-boot、spring-cloud技术的兴起,快递100技术团队也开... 阅读详情

相关推荐

(一篇即成功)Ubuntu下搭建qt环境和安装Qt Creator

只需一篇就成功搭建Ubuntu下的QT环境 你还在等什么

m0_73450461的博客 1万+

Spring Boot:深度解析 IoC 容器

Spring IoC 容器是整个框架中最核心、最关键的一部分内容,也是许多面试考察中的重要内容。今天我将从 Spring 接口源码入手,与大家一块学习下容器相关的内容。今天的内容包括三部分,第一部分是 Spring 中 BeanFactory 接口及其子类(接口)的梳理;第二部分是对 ApplicationContext 接口及其子类实现的梳理;最后一部分从应用的角度介绍容器的使用、配置、定制化等内容。

2301_76607156的博客 789

封神台靶场,为了小芳,冲之——cookie注入

第二个靶场 打开网站 找一下注入点 一般在新闻这种里面点开看看 先判断是否存在注入 有waf 尝试了很多方法绕过都没成功,/and/,aandnd,AnD等一系列都没绕过去,乌鸡鲅鱼 删掉id=169 发现 然后判断cookie注入 在搜索框输入 Javascript:alert(document.cookie=”id=”+escape(‘169’)); 然后弹窗了(其中 “id=” 取决URL中的id= escape中的数值也是URL中id=的值)返回刚刚的页面,把ID删除后一样能正常显示。说明服务器能

Wubuqing的博客 650

Spring Boot原理分析(二):IoC

IoC(Inversion of Control)容器是一个软件组件,用于管理和组织应用程序中的对象和依赖关系。它实现了控制反转(Inversion of Control)的概念,即将对象的创建和依赖关系的管理交给容器来完成,而不是由开发人员手动管理。通过使用IoC容器,开发者可以将关注点从对象的创建和依赖管理中解脱出来,更专注于业务逻辑的实现。同时,IoC容器也提供了更灵活的配置方式,可以根据不同的环境和需求进行配置,使系统更易于扩展和维护。

TracyCoder的博客 2340

STM32 使用IO口模拟I2C时序

上一篇《I2C协议详解》 我们了解了I2C的操作流程,这一篇,我们就使用I2C,来对EEPROM进行操作吧。 我们做两种选择: 1.时序由IO口模拟高低电平,需要了解协议并按照协议操作相应的IO口。 2.时序由硬件自行产生,不需要人工干预; 由硬件产生的I2C时序,我们借助Stm32Cube配置实现便可,我们这一篇,抛开Stm32Cube,手撕代码,根据I2C的时序,一步步地实现I2C对...

8936

Android音频学习(八)——AudioFlinger线程

在 PlaybackThread 的实现中,Flag 用于标识线程的特殊行为或配置。

miemie2014的博客 1399

一文了解SpringBoot中的IOC

SpringBoot中Ioc详解和使用

AndroidOrCsharp 1980

嵌入式开发实战:如何用cJSON库在STM32上实现轻量级JSON通信(附完整代码)

本文详细介绍了如何在STM32嵌入式系统中使用cJSON库实现高效的JSON通信方案。针对嵌入式环境的内存限制,提供了内存优化策略、cJSON库的深度定制方法以及完整的通信流程实现代码,帮助开发者解决JSON解析效率低下和跨平台兼容性等核心挑战。

star5的专栏 471

Spring Boot 扩展:深入分析 IoC 容器

Spring IoC 容器是整个框架中最核心、最关键的一部分内容,也是许多面试考察中的重要内容。今天我将从 Spring 接口源码入手,与大家一块学习下容器相关的内容。今天的内容包括三部分,第一部分是 Spring 中 BeanFactory 接口及其子类(接口)的梳理;第二部分是对 ApplicationContext 接口及其子类实现的梳理;最后一部分从应用的角度介绍容器的使用、配置、定制化等内容。

Java技术攻略的博客 313

Windows下用RKDevTool解包update.img的完整流程(含常见错误排查)

本文详细介绍了在Windows系统下使用RKDevTool工具解包update.img固件的完整流程。从工具准备、环境搭建到逐步解包操作,重点解析了输出文件结构,并提供了修改分区后重新打包的实战方法。文章还针对解包失败、打包错误等常见问题提供了详细的排查与解决方案,旨在帮助嵌入式开发者和爱好者高效完成固件分析与定制工作。

aa123的博客 715

避坑指南:Unity与Visual Studio开发环境配置中的5个常见问题及解决方案

本文针对Unity与Visual Studio开发环境配置中的5个常见问题,提供了详细的解决方案。重点解决了项目文件生成失败导致命名空间无法识别、调试器无法附加、包管理器与扩展安装混乱、脚本编译错误以及多版本环境冲突等核心痛点,帮助开发者构建稳定高效的开发调试环境。

weixin_27791839的博客 279

springboot深度解析IOC容器原理

IOC原理解析

weixin_68521938的博客 1187

基于深度学习的堰塞坝表层颗粒物质识别研究

本文提出一种基于深度学习的堰塞坝表层颗粒物质智能识别方法,针对颗粒分布散乱、背景复杂的问题,采用"大颗粒逐个识别、密集小颗粒分块识别"策略。结合Mask R-CNN、SLIC和AlexNet构建识别模型,通过无人机影像实现自动识别。实验表明该方法精度超过90%,具备迁移能力。文章提供了Python实现代码,涵盖数据预处理、SLIC分割、模型构建(Mask R-CNN和AlexNet)及训练流程,为堰塞坝应急抢险提供技术支持。

huanghm88的专栏 181

第3篇:Spring Boot Ioc容器与Bean管理

本文介绍了Spring Boot的核心概念IoC(控制反转)和DI(依赖注入),详细讲解了Spring IoC容器如何管理Bean的生命周期、作用域以及多种依赖注入方式(构造器注入、字段注入等)。文章还提供了手动注册Bean的方法和动手练习题,帮助读者深入理解Spring Boot的自动装配机制。作为Spring Boot学习系列的第二篇,本文为后续的配置文件和多环境配置打下基础,建议通过实践掌握各种注入方式。

林三的专栏 1019

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Boot 入门(一):理解 IoC 容器与 Bean 管理(附图解)

本篇博客通过简单易懂的 Spring Boot 示例,带你深入理解 IoC(控制反转) 和 DI(依赖注入) 的核心原理。文章展示了 IoC 容器的创建、Bean 的注册与获取方式,并通过多张文字图示清晰解释了 Bean 的装配与依赖注入过程。适合正在学习 Spring Boot 基础或想搞清楚容器到底“帮我们做了什么”的开发者阅读。

2401_83289506的博客 255

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring Boot IoC 实践(二):理解 Bean 的创建与容器管理过程

在上一篇文章中,我们初步了解了 Spring Boot 启动时如何创建 IoC(控制反转)容器。Spring Boot 在何时创建 Bean?IoC 容器如何管理 Bean?Bean 是否真的单例?内容说明Bean 创建时机容器启动时创建(单例模式)是否单例是(默认singleton验证方式查看构造方法输出与对象地址获取方式。

2401_83289506的博客 318

JavaWeb——24 Bean管理

讲解了SpringBoot的Bean管理——获取Bean、Bean的作用域和第三方Bean的使用。

念头通达 1039

Javaweb之SpringBootWeb案例之 Bean管理的获取Bean详细的解析

2. Bean管理在前面的课程当中,我们已经讲过了我们可以通过Spring当中提供的注解@Component以及它的三个衍生注解(@Controller、@Service、@Repository)来声明IOC容器中的bean对象,同时我们也学习了如何为应用程序注入运行时所需要依赖的bean对象,也就是依赖注入DI。我们今天...

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 777

Spring、Spring Boot、Spring MVC 到底是不是一个容器?一次说清楚

在实际开发中,“Spring 容器”“Spring Boot 容器”“Spring MVC 容器”这些说法经常被混在一起使用,甚至被当作同一个概念来理解。事实上,三者并不是并列的容器实现,而是围绕 Spring IoC 容器在不同层面上的分工与封装。

稳扎稳打,持续进步 633

第四节:如何使用注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)

大家好,我是,上一节学习了,这一节来基于上节的内容进行一个简单实践。这节要实现的效果是通过IOC容器获取到Bean,并且将Bean的属性显示打印出来。

Mero技术博客 732

黑马javaWeb笔记重点备份6:配置优先级和(第三方)bean管理

springboot原理篇,主要偏向于底层原理。

qq_61814350的博客 1671

Spring容器获取Bean的9种方式

随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对应的Bean。本文为大家整理汇总了常见的获取Bean的方式,并提供一些优劣分析,方便大家在使用到时有更好的选择。同时,也会为大家适当的普及和拓展一些相关知识。

tangjieqing的博客 2410

Spring Boot-5-DefaultListableBeanFactory

Spring IoC作用是管理Bean的生命周期并提供用户使用bean,所以我们有必要来看看Spring如何管理这些Bean的,前面我们提到IoC基本功能由BeanFactory系列类型实现,BeanFactory系列中就是DefaultListableBeanFactory这个类型完成的BeanFactory的基本功能。

诗人不写诗 715

【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)

在项目中,我们自定义一个类,如果我们想把这个类交给ioc容器管理,加上@Component衍生注解即可,如果这个类不是我们自己自定义的,是我们引入第三方依赖中的,而且我们还想把这个类交给ioc容器管理,那么我们应该定义一个方法,在这个方法上加上@Bean在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

2509_94202056的博客 1031

Bean管理

如果需要定义第三方Bean时, 通常会单独定义一个配置类。

Very_a的博客 1510
上一篇: ThreadLocal线程本地量
下一篇: Bean存在的意义和IOC容器管理
小李不秃头♛
博客等级 码龄2年 619粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值