Spring中Bean的自动装配

news/2025/3/18 18:26:47/

1.自动装配的核心概念

  1. 定义: Bean的自动装配是Spring框架中用于自动满足Bean依赖的一种机制。通过自动装配,Spring容器会在应用上下文中为某个Bean寻找其依赖的Bean,从而减少手动配置的工作量。其核心目标是减少配置代码,通过类型或名称匹配实现依赖注入。

2.Spring Bean的装配机制

  1. 三种装配机制
    • XML显式配置:通过<bean>标签手动定义依赖。
    • Java显式配置:使用@Configuration@Bean注解。
    • 隐式自动装配:(重点):通过组件扫描(@ComponentScan)和自动注入(@Autowired等)实现

2.1 自动装配的四种模式(XML配置)

    <bean class="org.example.bean.*" id="...." autowire="byName/byType/constructor">
  1. byName
    • 规则:根据属性名与Bean的id匹配。
    • 示例:若属性名为cat,则寻找id="cat"的Bean。
    • 限制:需保证Bean的id与属性名一致,否则注入失败
  2. byType
    • 规则:根据属性类型匹配Bean的class
    • 示例:若属性类型为Cat,则容器中必须存在且仅有一个Cat类型的Bean。
    • 冲突处理:多个同类型Bean会抛出异常,需配合@Qualifier指定名称
  3. constructor
    • 规则:类似byType,但用于构造函数参数注入。
    • 适用场景:依赖必须通过构造器注入时
  4. 默认(no)
    • 不启用自动装配,需手动配置依赖。

2.2 Java显式配置

@Configuration:可以定义一个类为配置类,这个类中的方法可以帮助我们生成一个Bean对象,使用spring容器进行管理。

@Bean:用于方法前面,方法生成的对象作为容器管理的对象。

java">@Configuration
public class MyConfig {@Beanpublic Set<Integer> types() {Set<Integer> set = new HashSet<>();set.add(1);set.add(2);return set;}
}

2.3 隐式自动装配

  1. 核心注解

    • @Autowired:按类型自动注入,可标注字段、构造器、方法。若存在多个候选Bean,需配合@Qualifier("beanName")指定名称
    • @Resource:按名称注入(默认),属于JSR-250规范,支持name属性指定Bean的id,已经不再使用
    • @Inject:与@Autowired功能类似,属于JSR-330规范,需依赖javax.inject
  2. 配置支持

    • 启用注解扫描:在XML中添加<context:component-scan base-package="..."/>或通过@ComponentScan注解
    • spring.xml中开启注解扫描器
 <context:component-scan base-package="org.spring.bean"/><!--使用component-scan的时候,base-package包指定后,扫描的内容为org.example.spring.bean.**.*-->
  • 示例
java">     @Componentpublic class User {@Autowiredprivate Cat cat;}

3.自动装配的常见问题与解决

  1. 多个候选Bean冲突
    • 方案:使用@Primary标记优先Bean,或通过@Qualifier指定名称
  2. 循环依赖
    • 原因:Bean A依赖Bean B,Bean B也依赖Bean A。
    • 解决:优先使用构造器注入,或通过@Lazy延迟初始化
  3. 注入失败的可能原因
    • 未启用组件扫描(@ComponentScan缺失)。
    • Bean未注册到容器(如未加@Component或相关注解)。
    • 类型或名称匹配错误

4.推荐用法

  1. 推荐使用注解:减少XML配置,提升代码可读性
  2. 合理使用条件装配:通过@Conditional系列注解控制Bean的加载条件,避免冗余配置
  3. 结合显式配置:复杂依赖或第三方库集成时,可混合使用@Bean和自动装配

http://www.ppmy.cn/news/1580127.html

相关文章

jenkins 配置邮件问题整理

版本&#xff1a;Jenkins 2.492.1 插件&#xff1a; A.jenkins自带的&#xff0c; B.安装功能强大的插件 配置流程&#xff1a; 1. jenkins->系统配置->Jenkins Location 此处的”系统管理员邮件地址“&#xff0c;是配置之后发件人的email。 2.配置系统自带的邮件A…

学习threejs,使用MeshFaceMaterial面材质容器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshFaceMaterial 二…

便携版:随时随地,高效处理 PDF 文件

PDF-XChange Editor Plus 便携版是一款功能强大且极其实用的 PDF 阅读与编辑工具。它不仅支持快速浏览 PDF 文件&#xff0c;还提供了丰富的编辑功能&#xff0c;让用户可以轻松处理 PDF 文档。经过大神优化处理&#xff0c;这款软件已经变得十分轻便&#xff0c;非常适合需要随…

汽车PKE无钥匙进入系统一键启动系统定义与原理

汽车智能钥匙&#xff08;PKE无钥匙进入系统&#xff09;一键启动介绍 系统定义与原理 汽车无钥匙进入系统&#xff0c;简称PKE&#xff08;Passive Keyless Entry&#xff09;&#xff0c;该系统采用了RFID无线射频技术和车辆身份编码识别系统&#xff0c;率先应用小型化、小…

Linux中Tomcat、idea和MySQL的安装

一、tomcat安装 1.上传安装文件&#xff0c;并解压缩到 /opt/tomcat 2.进入解压目录 /bin &#xff0c;启动Tomcat&#xff0c; ./startup.sh 3. 开放端口 8080 4.测试是否成功&#xff0c;访问http://linuxip:8080 二、IDEA2020安装 1.上传安装文件到 /opt/idea&#xff0c;…

【cuda学习日记】8.1 GPU加速库 --cuSPARSE

8.1.1 cuSPARSE概念 cuSPARSE是一个线性代数库&#xff0c;内含很多通用的稀疏线性代数函数。 稠密存储方式&#xff08;dense&#xff09; 把矩阵中的每个元素都存储起来&#xff0c;不管它是否为零。 坐标稀疏矩阵格式&#xff08;COO&#xff09; 坐标稀疏矩阵格式&am…

Redis,从数据结构到集群的知识总结

Redis基础部分 2. 数据结构 redis底层使用C语言实现&#xff0c;这里主要分析底层数据结构 2.1 动态字符串(SDS) 由于C底层的字符串数组一旦遇到’\0’就会认为这个字符串数组已经结束&#xff0c;意味着无法存储二进制数据&#xff08;如图片、音频等&#xff09;&#xff…

Java0317初尝试与报错

支付模块&#xff1a;27min讲了打开神秘开关 在前面讲了Data&#xff0c;NoArgsConstructor&#xff0c;AllArgsConstructor lombok技术 报错1 package com.itheima.demo; public class GoldCard extends Card { Override public void cost(double money){ //消费八折 setM…