【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**
java 复制代码
import org.springframework.stereotype.Component;

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

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

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyClient {

    @Autowired
    private MyService myService;

    public void performAction() {
        myService.doSomething();
    }
}

setter方法注入

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyClient {

    private MyService myService;

    @Autowired
    public void setMyService(MyService myService) {
        this.myService = myService;
    }

    public void performAction() {
        myService.doSomething();
    }
}

构造函数注入

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyClient {

    private final MyService myService;

    @Autowired
    public MyClient(MyService myService) {
        this.myService = myService;
    }

    public void performAction() {
        myService.doSomething();
    }
}

方法参数注入

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyClient {

    private MyService myService;

    @Autowired
    public void init(MyService myService) {
        this.myService = myService;
    }

    public void performAction() {
        myService.doSomething();
    }
}

处理多个匹配的Bean

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

java 复制代码
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 属性。

java 复制代码
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的情况。
相关推荐
我星期八休息24 分钟前
C++智能指针全面解析:原理、使用场景与最佳实践
java·大数据·开发语言·jvm·c++·人工智能·python
摇滚侠24 分钟前
Spring Boot 3零基础教程,WEB 开发 整合 Thymeleaf 笔记36
java·spring boot·笔记
大猫会长29 分钟前
docker安装php+apache
java·开发语言
野生技术架构师31 分钟前
JAVA 架构师面试题含答案:JVM+spring+ 分布式 + 并发编程
java·jvm·spring
瑞士卷@43 分钟前
MyBatis入门到精通(Mybatis学习笔记)
java·数据库·后端·mybatis
梵得儿SHI1 小时前
Java 反射机制深度剖析:性能与安全性的那些坑
java·开发语言·安全·反射·动态代理·性能·反射机制
虫小宝1 小时前
Java分布式架构下的电商返利APP技术选型与架构设计实践
java·分布式·架构
007php0071 小时前
百度面试题解析:Zookeeper、ArrayList、生产者消费者模型及多线程(二)
java·分布式·zookeeper·云原生·职场和发展·eureka·java-zookeeper
唐僧洗头爱飘柔95271 小时前
【SpringCloud(6)】Gateway路由网关;zuul路由;gateway实现原理和架构概念;gateway工作流程;静态转发配置
spring·spring cloud·架构·gateway·请求转发·服务降级·服务雪崩
4Forsee2 小时前
【Android】浅析 Android 的 IPC 跨进程通信机制
android·java