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

【Spring】@Autowired注解自动装配的过程

@Autowired 注解是Spring框架中用于自动装配Bean的一个重要注解。它可以帮助开发者在无需手动编写setter方法或构造函数的情况下,自动注入依赖的Bean。下面是 @Autowired 注解自动装配的详细过程:

自动装配的过程
1、扫描和加载Bean定义:

  • Spring容器启动时,会扫描配置类或XML配置文件中的Bean定义。
  • 这些Bean定义会被加载到Spring容器中。

2、实例化Bean:

  • Spring容器根据Bean定义创建Bean实例。
  • 如果Bean定义中指定了构造函数或工厂方法,Spring会使用这些方法来创建Bean实例。

3、解析 @Autowired 注解:

  • Spring容器在创建Bean实例后,会解析该Bean类中的 @Autowired 注解。
  • @Autowired 注解可以用于字段、setter方法、构造函数或方法参数上。

4、查找匹配的Bean:

  • Spring容器会根据 @Autowired 注解的类型和名称,在容器中查找匹配的Bean。
  • 查找规则如下:

        类型匹配:Spring会查找与 @Autowired 注解指定的类型相匹配的Bean。
        名称匹配:如果 @Autowired 注解上有 @Qualifier 注解,Spring会根据 @Qualifier 指定的名称来查找Bean。
        默认名称匹配:如果 @Autowired 注解没有 @Qualifier 注解,Spring会尝试使用字段名或参数名作为Bean的名称来查找。


5、注入依赖:

  • 如果找到匹配的Bean,Spring会将该Bean注入到目标Bean中。
  • 如果找不到匹配的Bean,Spring会抛出 NoSuchBeanDefinitionException 异常。
  • 如果找到多个匹配的Bean,Spring会抛出 NoUniqueBeanDefinitionException 异常。


6、处理可选依赖:

  • 如果 @Autowired 注解上有 required=false 属性,Spring会允许找不到匹配的Bean的情况,不会抛出异常。

示例代码
1. 定义Bean

import org.springframework.stereotype.Component;@Component
public class MyService {public void doSomething() {System.out.println("Doing something...");}
}

2. 使用 @Autowired 注解
字段注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyClient {@Autowiredprivate MyService myService;public void performAction() {myService.doSomething();}
}

setter方法注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyClient {private MyService myService;@Autowiredpublic void setMyService(MyService myService) {this.myService = myService;}public void performAction() {myService.doSomething();}
}

构造函数注入 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyClient {private final MyService myService;@Autowiredpublic MyClient(MyService myService) {this.myService = myService;}public void performAction() {myService.doSomething();}
}

方法参数注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyClient {private MyService myService;@Autowiredpublic void init(MyService myService) {this.myService = myService;}public void performAction() {myService.doSomething();}
}

处理多个匹配的Bean
如果容器中有多个匹配的Bean,可以使用 @Qualifier 注解来指定具体的Bean。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;@Component
public class MyClient {@Autowired@Qualifier("myService1")private MyService myService;public void performAction() {myService.doSomething();}
}

可选依赖
如果依赖是可选的,可以使用 required=false 属性。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyClient {@Autowired(required = false)private MyService myService;public void performAction() {if (myService != null) {myService.doSomething();} else {System.out.println("MyService is not available.");}}
}

总结

  • 扫描和加载Bean定义:Spring容器扫描配置类或XML配置文件中的Bean定义。
  • 实例化Bean:Spring容器根据Bean定义创建Bean实例。
  • 解析 @Autowired 注解:Spring容器解析Bean类中的 @Autowired 注解。
  • 查找匹配的Bean:Spring容器根据类型和名称查找匹配的Bean。
  • 注入依赖:Spring容器将匹配的Bean注入到目标Bean中。
  • 处理可选依赖:如果依赖是可选的,Spring容器允许找不到匹配的Bean的情况。

http://www.mrgr.cn/news/47986.html

相关文章:

  • 如何在 Vue 中处理 API 请求?
  • MySQL数据库——数值函数
  • 内置ALC的前置放大器D2538A/D3308
  • MySQL知识大总结(进阶)
  • 新手SEO指南如何快速入门与提升网站排名
  • 【论文阅读笔记】Learning to sample
  • 2025届计算机保研经验贴(末九→浙江大学软件学院)
  • uniapp、微信小程序、Vue中使用nzh库实现数字转中文大写
  • 服务器部署‌Traefik 实现子级域名路由服务(对外子域名80,路由对内大端口)
  • STM32—SPI通信外设
  • 什么是毛利净利润
  • 【网络安全】CVE-2024-46990: Directus环回IP过滤器绕过实现SSRF
  • 【LeetCode】动态规划—646. 最长数对链(附完整Python/C++代码)
  • DIFY上使用多种大语言模型(MindCraft API)
  • 《Linux从小白到高手》综合应用篇:详解Linux系统调优之服务器硬件优化
  • BypassUAC
  • 深度学习之常用数据集下载
  • C# Json文件写入、读取 ,Json文件序列化、反序列化
  • 【Java 22 | 1】 深入解析Java 22 :增强的模式匹配特性
  • 2024下半年软考中级网络工程师,这100题,必做!
  • Once In My Life(除法,思维)
  • Harbor镜像仓库安装配置及使用
  • 递归专题BFS
  • HJ212-2017协议详解:工业物联网环境监测标准简单了解
  • PCL将深度图转化为点云并存储为pcd文件
  • Verdin AM62使用CODESYS