文章目录

  • 前言
  • 一、创建两个组件
  • 二、使用传统方式
    • 源代码
    • 解释
  • 三、使用SpringBoot方法
    • 源代码
    • 解释
  • 四、查看是否添加到组件中
    • 查看
    • 自定义组件名
    • 配置类在容器中注册的是单实例组件
    • 配置类本身也是容器中的一个组件
    • Configuration的proxyBeanMethods属性:代理bean的方法
      • `proxyBeanMethods` 参数详解
      • 详细说明
      • 1. `proxyBeanMethods = true`(默认)
      • 2. `proxyBeanMethods = false`
      • 选择建议
  • 总结


前言

@Configuration // 告诉 SpringBoot 这是一个配置类 == 配置文件
@Bean // 给容器中添加组件。以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例
@Bean(“tom123”) // 给容器中添加组件。以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例

IOC 容器(Inversion of Control Container)是实现 控制反转 思想的一个运行期框架组件,用来集中创建、装配、管理对象(Bean)及其生命周期。
一句话:原来由程序代码 new 的对象,现在统一交给容器“注入”进来,代码只声明“我需要什么”,而不关心“怎么得到”。

  • 控制反转(IoC):对象创建与依赖绑定的“控制权”从业务代码反转到容器。
  • 依赖注入(DI):容器把依赖对象“注入”到需要它的地方,常见方式:
    • 构造函数注入
    • Setter 注入
    • 字段/注解注入
// 声明组件
@Component
public class OrderService { }@RestController
public class OrderController {@Autowired          // 容器注入private OrderService service;
}

启动 Spring 后,容器扫描注解 → 创建 OrderService → 注入 OrderController,全程无 new。

一、创建两个组件

我们先创建两个组件User和Pet,也就是两个类,放在bean包里面。

在这里插入图片描述

package com.hello.bean;/*** 用户*/public class User { // 要把这两个组件添加到容器中private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}// 添加带参数的构造方法public User(String name, Integer age){this.name = name;this.age = age;}@Overridepublic String toString() {return "User [name=" + name + ", age=" + age + "]";}}
package com.hello.bean;/*** 宠物*/
public class Pet {private String name;public String getName(){return name;};public void setName(String name){this.name = name;}// 添加构造器public Pet() { // 无参构造器}public Pet(String name) { // 带参构造器this.name = name;}@Overridepublic String toString() {return "Pet{" +"name='" + name + '\'' +'}';}
}

二、使用传统方式

要添加到容器中,首先在资源文件夹中新建beans.xml文件,然后进行组件的添加。

在这里插入图片描述

源代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.hello.bean.User"><property name="name" value="zhangsan"></property><property name="age" value="18"></property></bean><bean id="cat" class="com.hello.bean.Pet"><property name="name" value="tomcat"></property></bean>
</beans>

解释

这个XML文件是一个典型的Spring框架配置文件,用于定义和配置Spring容器中的Bean。下面是对这个配置文件的详细解释:

  1. XML声明和命名空间

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    • 第一行是标准的XML声明
    • 定义了beans根元素和Spring的命名空间
    • 指定了XML Schema定义文件的位置
  2. User Bean定义

    <bean id="user" class="com.hello.bean.User"><property name="name" value="zhangsan"></property><property name="age" value="18"></property>
    </bean>
    
    • 定义了一个ID为"user"的Bean
    • 类路径为com.hello.bean.User
    • 设置了两个属性:
      • name属性值为"zhangsan"
      • age属性值为18
  3. Pet Bean定义

    <bean id="cat" class="com.hello.bean.Pet"><property name="name" value="tomcat"></property>
    </bean>
    
    • 定义了一个ID为"cat"的Bean
    • 类路径为com.hello.bean.Pet
    • 设置了name属性值为"tomcat"
  4. 配置特点

    • 使用了setter注入方式(通过<property>元素)
    • 注入的都是简单值(String和int)
    • 没有定义Bean之间的依赖关系
  5. 对应的Java类结构
    假设的User类:

    package com.hello.bean;public class User {private String name;private int age;// 必须有setter方法public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
    }
    

    假设的Pet类:

    package com.hello.bean;public class Pet {private String name;public void setName(String name) {this.name = name;}
    }
    
  6. 使用场景

    • 这种配置方式在传统的Spring XML配置中很常见
    • 适用于简单的Bean定义和属性注入
    • 在现代Spring Boot应用中,这种配置方式通常被注解配置(如@Component@Configuration)取代

注意:要使这个配置正常工作,对应的Java类必须有无参构造函数和相应的setter方法,因为这里使用的是setter注入方式。

三、使用SpringBoot方法

新建config.MyConfig类,在其中写入代码:

源代码

package com.hello.config;import com.hello.bean.User;
import com.hello.bean.Pet;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration // 告诉 SpringBoot 这是一个配置类 == 配置文件
public class MyConfig {@Bean // 给容器中添加组件。以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例public User user01() {return new User("zhangsan", 18);}@Bean // 给容器中添加组件。以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例public Pet cat(){return new Pet("tomcat");}
}

解释

使用 Java 配置类替代 XML 配置的 Spring Boot 配置示例,下面是对这段代码的详细解释:

  1. 类级别注解
@Configuration // 告诉 SpringBoot 这是一个配置类 == 配置文件
public class MyConfig {
  • @Configuration 注解标识这是一个 Spring 配置类,相当于 XML 配置文件
  • 配置类中可以定义多个 @Bean 方法,用于向 Spring 容器注册组件
  1. User Bean 定义
@Bean // 给容器中添加组件
public User user01() {return new User("zhangsan", 18);
}
  • @Bean 注解表示该方法会返回一个对象,该对象要注册到 Spring 容器中
  • 默认情况下,Bean 的名称(ID)就是方法名 user01
  • 这里创建了一个 User 对象,使用构造器注入方式设置 name=“zhangsan” 和 age=18
  1. Pet Bean 定义
@Bean // 给容器中添加组件
public Pet cat(){return new Pet("tomcat");
}
  • 同样使用 @Bean 注解,Bean 的名称为 cat
  • 创建了一个 Pet 对象,设置 name=“tomcat”
  1. 与 XML 配置的对比

    • 等效于之前的 XML 配置,但使用了更现代的 Java 配置方式
    • 不需要 setter 方法,直接使用构造器注入
    • 类型安全,编译器可以检查类型错误
    • 可以方便地添加逻辑(如条件判断等)
  2. 对应的 Java 类结构
    假设的 User 类(需要对应的构造器):

package com.hello.bean;public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}
}

假设的 Pet 类:

package com.hello.bean;public class Pet {private String name;public Pet(String name) {this.name = name;}
}
  1. 使用特点

    • 这是 Spring Boot 推荐的首选配置方式
    • 配置类本身也是一个 Spring 组件(@Configuration@Component 的派生注解)
    • 可以方便地与其他 Spring 特性(如 @Profile, @Conditional 等)结合使用
    • 支持方法间调用(Spring 会拦截确保单例)
  2. 获取这些 Bean
    在应用中可以通过以下方式获取:

// 通过类型获取
User user = applicationContext.getBean(User.class);// 通过名称获取
Pet pet = (Pet) applicationContext.getBean("cat");

这种基于 Java 的配置方式比 XML 更类型安全、更灵活,是现代 Spring Boot 应用的主要配置方式。

四、查看是否添加到组件中

查看

在主程序中进行容器IOC中所有组件的输出。
在这里插入图片描述

可以搜到对应的组件,说明组件已经添加成功。
在这里插入图片描述

自定义组件名

可以通过@Bean(“tom123”) 这样的方式自定义组件名,这样添加组件名称就是不是默认的方法名。

  @Bean("tom123") // 给容器中添加组件。以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例public Pet cat(){return new Pet("tomcat");}

我们来进行组件名的输出,点启动项目。在控制台观察、搜索添加的组件。

 public static void main(String[] args) {// 1、返回我们IOC容器ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);// 2、查看容器里面的所有组件String[] names = run.getBeanDefinitionNames();for (String name : names){System.out.println(name);}// 3、从容器中获取组件// 拼接最终启动成功信息String successMessage ="🎉 **启动成功!** (ノ◕ヮ◕)ノ*:・゚✧\n" +"✨ *服务已就绪,端口 8083* ✨\n" +"💻 访问地址:`http://localhost:8083`\n" +"💪 **Go! Go! Go!** (ง •_•)ง";System.out.println(successMessage);}

在这里插入图片描述
这样我们就给容器中注入了两个组件。

配置类在容器中注册的是单实例组件

package com.hello.config;import com.hello.bean.User;
import com.hello.bean.Pet;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 配置类里面使用@Bean标注在方法上给容器中添加组件,默认是单实例的*/
@Configuration // 告诉 SpringBoot 这是一个配置类 == 配置文件
public class MyConfig {@Bean // 给容器中添加组件。以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例public User user01() {return new User("zhangsan", 18);}@Bean("tom123") // 给容器中添加组件。以方法名作为组件的id,返回类型就是组件类型。返回的值,就是组件在容器中的实例public Pet cat(){return new Pet("tomcat");}
}

我们可以来读取组件对象进行验证一下。

// 3、从容器中获取组件Pet tom1 = run.getBean("tom123", Pet.class);Pet tom2 = run.getBean("tom123", Pet.class);System.out.println("两个组件是否相同" + (tom1 == tom2));

在这里插入图片描述

配置类本身也是容器中的一个组件

当时一个类名上加了@Configuratio以后,这个类也会被加入到容器中,作为一个组件。

验证:

MyConfig bean = run.getBean(MyConfig.class);System.out.println(bean);

在这里插入图片描述

Configuration的proxyBeanMethods属性:代理bean的方法

应用场景:解决组件依赖问题。

 * 3、proxyBeanMethods:代理bean的方法*  full: 全量模式,IOC容器启动时,会创建所有的单实例Bean(true)*  light: 轻量模式,IOC容器启动时,不会创建单实例Bean,而是当调用getBean方法时,才会创建Bean(false)

proxyBeanMethods 参数详解

proxyBeanMethods@Configuration 注解中的一个重要属性,它决定了配置类中 @Bean 方法是否被代理。下面是它的取值含义表格:

含义适用场景性能影响容器行为
true (默认值)启用代理,确保 @Bean 方法调用总是返回相同的实例(单例)需要保证单例的场景,方法间有依赖关系时有轻微性能开销(CGLIB代理)Spring会拦截方法调用,检查容器中是否已存在该Bean
false禁用代理,直接调用方法不需要方法间依赖,或追求启动速度的场景无代理开销,启动更快每次调用方法都会真正执行,不保证单例

详细说明

1. proxyBeanMethods = true(默认)

@Configuration(proxyBeanMethods = true)
public class MyConfig {@Beanpublic User user() {return new User(pet()); // 无论调用多少次,返回的都是同一个Pet实例}@Bean public Pet pet() {return new Pet("tomcat");}
}
  • 特点:方法间调用会被Spring拦截,确保单例
  • 优点:保证Bean的单例性,方法间依赖安全
  • 缺点:有CGLIB代理开销

2. proxyBeanMethods = false

@Configuration(proxyBeanMethods = false)
public class MyConfig {@Beanpublic User user() {return new User(pet()); // 每次调用都会new新的Pet实例}@Bean public Pet pet() {return new Pet("tomcat");}
}
  • 特点:相当于普通Java方法调用
  • 优点:无代理开销,启动更快
  • 缺点:不能保证方法间调用的单例性

选择建议

考虑因素推荐设置
配置类中的@Bean方法需要相互调用true
需要严格的单例保证true
追求应用启动速度false
配置类中没有方法间调用false
Spring Boot 2.2+ 的@Configuration通常设为false

在Spring Boot 2.2+中,很多场景下推荐使用proxyBeanMethods = false以提高性能,特别是大型应用。

总结

本文全面对比了Spring Boot中两种主要的组件配置方式:传统XML配置和现代Java配置类方式,并深入分析了@Configuration@Bean注解的核心特性。

  1. 配置方式演进

    • XML配置是传统Spring的经典方式,通过<bean>标签定义组件,依赖setter注入
    • Java配置类是现代Spring Boot推荐方式,使用@Configuration@Bean注解,更类型安全灵活
  2. 注解核心功能

    • @Configuration标记配置类,替代XML配置文件
    • @Bean注解方法向容器注册组件,默认单例,方法名作为组件ID
    • 支持自定义组件名(@Bean("name"))和方法间依赖调用
  3. 高级特性

    • proxyBeanMethods参数控制代理行为,平衡单例保证与性能
    • 配置类本身也是容器组件,可通过上下文获取
    • 与各种条件注解(@Conditional等)无缝集成
  4. 实践建议

    • 新项目优先使用Java配置类方式
    • 简单场景可设置proxyBeanMethods=false提升性能
    • 需要严格单例和方法间依赖时保持默认true
    • 合理命名组件ID提高可读性

现代Spring Boot应用开发中,基于注解的配置方式凭借其类型安全、代码导航方便和与Java语言的天然契合等优势,已成为事实标准。理解这些核心配置机制,是掌握Spring Boot自动配置原理的基础,也是进行高效应用开发的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95246.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95246.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95246.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#联合Halcon进行OCR字符识别(含halcon-25.05 百度网盘)

1.下载安装halcon 通过网盘分享的文件&#xff1a;halcon-25.05.0.0-x64-win64 链接: https://pan.baidu.com/s/1XAx-8ZQM-ZHkgHIc-dhCYw 提取码: whek 2.c#环境配置 创建test_halcon_ocr项目 找到halcon的安装路径 我的&#xff1a; D:\halcon\HALCON-25.05-Progress\bin\x64…

丝杆支撑座怎样助力升降设备实现智能化?

丝杆支撑座作为传动系统中的关键支撑部件&#xff0c;凭借其高刚性、抗冲击及精准定位能力&#xff0c;广泛应用于重型机械与升降设备领域&#xff0c;为设备提供稳定可靠的轴向承载与径向支撑&#xff0c;确保高负荷工况下的安全运行。电梯 / 升降平台&#xff1a;液压电梯的辅…

Notta:高效智能的音频转文字工具

本文转载自&#xff1a;Notta&#xff1a;高效智能的音频转文字工具 - Hello123 ** 一、产品简介 Notta 是一款基于 AI 语音识别引擎的语音转文字工具&#xff0c;支持 58 种语言的转录和 42 种语言的翻译。用户可通过实时录音或上传音频 / 视频文件&#xff08;如 MP3、WAV …

Docker私有仓库创建及Docky存储与网络配置(小白的“升级打怪”成长之路)

目录 一、Docker私有仓库创建 1、在一台安装Docker私有仓库的主机上添加docker-compose 命令 2、安装docker-ce服务 3、Docker 镜像加速 4、安装Harbor仓库 5、使用脚本安装仓库 6、网站登陆 7、客户端使用Harbor仓库 二、Docky存储与网络配置 1、存储与网络 挂载主机…

谷歌ADK接入文件操作MCP

文章目录MCP基础概念文件操作服务器文件操作MCP接入谷歌ADK项目创建多轮对话代码MCP基础概念 MCP技术体系中&#xff0c;会将外部工具运行脚本称作服务器&#xff0c;而接入这些外部工具的大模型运行环境称作客户端。 一个客户端可以接入多个不同类型的服务器&#xff0c;但都…

高光谱技术的独特优势

高光谱技术凭借其‌纳米级连续光谱采集能力‌和‌图谱合一的探测模式‌&#xff0c;在多个领域展现出不可替代的独特优势&#xff1a;一、光谱维度&#xff1a;精细物质指纹识别‌纳米级连续光谱解析‌ 通过 ‌5-10nm带宽的数百个连续波段‌&#xff08;最高330个通道&#xff…

基于Vue+Element UI集成高德地图的完整实践指南

本次开发使用deepseek 简直如虎添翼得心应手 生成模拟数据、解决报错那真是嘎嘎地 在 Vue Element UI 项目中引入高德地图 具体实现步骤&#xff1a; 高德开放平台&#xff1a;注册账号 → 进入控制台 → 创建应用 → 获取 Web端(JS API)的Key https://lbs.amap.com/ 这里需要…

Day50--图论--98. 所有可达路径(卡码网),797. 所有可能的路径

Day50–图论–98. 所有可达路径&#xff08;卡码网&#xff09;&#xff0c;797. 所有可能的路径 刷今天的内容之前&#xff0c;要先去《代码随想录》网站&#xff0c;先看完&#xff1a;图论理论基础和深度优先搜索理论基础。做完之后可以看题解。有余力&#xff0c;把广度优先…

Python 异常捕获

一、获取未知错误try:# 相关处理逻辑 异常后面输出print(输入信息……) except Exception as e:print(未知错误,e)二、获取已知错误except 错误单词&#xff08;来源于错误信息的第一个单词&#xff09;多个已知错误使用 except XXXXX:try:# 相关处理逻辑 异常后面输出print…

RIOT、RT-Thread 和 FreeRTOS 是三种主流的实时操作系统

RIOT、RT-Thread 和 FreeRTOS 是三种主流的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;专为嵌入式系统和物联网&#xff08;IoT&#xff09;设备设计。它们在架构、功能、生态和应用场景上有显著差异&#xff0c;以下是详细对比&#xff1a;1. 架构与设计理念特性RI…

【FAQ】Win11创建资源不足绕开微软账号登录

Win11安装资源限制 因为 Windows 11 有两项强制检测 VMware 8 默认没提供&#xff1a; TPM 2.0&#xff08;可信平台模块&#xff09;Secure Boot&#xff08;安全启动&#xff09; 一步到位解决办法&#xff08;官方兼容方式&#xff09; 关闭虚拟机电源编辑虚拟机设置 选项 →…

Docker使用----(安装_Windows版)

一、Docker Docker 镜像就像是一个软件包&#xff0c;里面包括了应用程序的代码、运行所需的库和工具、配置文件等等&#xff0c;所有这些都打包在一起&#xff0c;以确保应用程序在不同的计算机上运行时&#xff0c;都能保持一致性。 可以把 Docker 镜像想象成一个软件安装文件…

91、23种经典设计模式

设计模式是软件设计中反复出现的解决方案的模板&#xff0c;用于解决特定问题并提高代码的可维护性、可扩展性和可复用性。23种经典设计模式可分为创建型、结构型和行为型三大类&#xff0c;以下是具体分类及模式概述&#xff1a; 一、创建型模式&#xff08;5种&#xff09; 关…

Illustrator总监级AI魔法:一键让低清logo变矢量高清,彻底告别手动描摹!

在海外从事设计十几年&#xff0c;我敢说&#xff0c;每个设计师都经历过一种“史诗级”的折磨&#xff1a;客户发来一个像素低得感人、边缘模糊不清的JPG格式Logo&#xff0c;然后要求你把它用在巨幅海报或者高清视频上。这意味着什么&#xff1f;意味着我们要打开Illustrator…

各种 dp 刷题下

6.#8518 杰瑞征途 / 洛谷 P4072 征途 题意 Pine 开始了从 SSS 地到 TTT 地的征途。从 SSS 地到 TTT 地的路可以划分成 nnn 段&#xff0c;相邻两段路的分界点设有休息站。Pine 计划用 mmm 天到达 TTT 地。除第 mmm 天外&#xff0c;每一天晚上 Pine 都必须在休息站过夜。所以…

本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕增加利用 Whisper 分段信息,全新 Prompt功能

1. 实现功能 M4-3: 智能后处理 - 停顿感知增强版 (终极版) 本脚本是 M4-3 的重大升级&#xff0c;引入了“停顿感知”能力&#xff1a; 利用 Whisper 分段信息: 将 Whisper 的 segments 间的自然停顿作为强信号 ([P]) 提供给 LLM。全新 Prompt: 设计了专门的 Prompt&#xff0c…

微算法科技(NASDAQ:MLGO)开发经典增强量子优化算法(CBQOA):开创组合优化新时代

近年来&#xff0c;量子计算在组合优化领域的应用日益受到关注&#xff0c;各类量子优化算法层出不穷。然而&#xff0c;由于现阶段量子硬件的局限性&#xff0c;如何充分利用已有的经典计算能力来增强量子优化算法的表现&#xff0c;成为当前研究的重要方向。基于此&#xff0…

功能、延迟、部署、成本全解析:本地化音视频 SDK 对比 云端方案

引言 在构建实时音视频系统时&#xff0c;技术选型往往决定了项目的天花板。开发者面临的第一个关键抉择&#xff0c;就是是选择完全可控的本地化音视频内核&#xff0c;还是依赖云厂商的实时音视频服务。 以大牛直播SDK&#xff08;SmartMediaKit&#xff09;为代表的本地部…

微调入门:为什么微调

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录1 什么时候我们需要微调呢&#xff1f;1.1 微调的…

3、匹配一组字符

在本章里&#xff0c;你将学习如何与字符集合打交道。与可以匹配任意单个字符的.字符&#xff08;参见第2章&#xff09;不同&#xff0c;字符集合能匹配特定的字符和字符区间。3.1 匹配多个字符中的某一个第2章介绍的.​字符&#xff0c;可以匹配任意单个字符。当时在最后一个…