详细剖析SpringBoot控制反转和依赖注入以及Bean管理

1. 扫描和注册Bean:


当程序启动时,Spring会扫描指定的包及其⼦包中的类,寻找使⽤了@Component 、@Service 、@Repository 、@Controller 等注解的类。这些类会被Spring注册为Bean定义。这些Bean定义会被注册到Spring的IoC容器中,但此时并不⼀定会⽴即创建Bean的实例。


2. 创建Bean实例:


Spring容器在启动时,通常会创建所有单例(Singleton)作⽤域的Bean实例(除⾮使⽤了懒加载@Lazy )。对于⾮单例作⽤域(如Prototype作⽤域)的Bean实例,Spring容器会在每次请求时创建新的实例。


3. 依赖注⼊:


当Spring容器在创建⼀个Bean实例时,会检查该Bean的构造函数、Setter⽅法和字段,寻找@Autowired 注解。如果发现@Autowired 注解,Spring容器会尝试从容器中找到相应类型的Bean,并将其注⼊到⽬标Bean中。如果依赖的Bean还没有被创建,Spring容器会先创建并初始化依赖的Bean,然后再进⾏注⼊。

详细过程


1. 扫描和注册:


Spring启动时,通过组件扫描(Component Scanning)机制,扫描指定包中的类。找到使⽤了@Component 、@Service 、@Repository 、@Controller 等注解的类,将这些类的Bean定义注册到IoC容器中。


2. 创建和初始化Bean:


对于单例作⽤域的Bean,Spring容器会在启动时⽴即创建这些Bean的实例。对于每个Bean实例,Spring容器会检查其依赖(构造函数参数、Setter⽅法参数、字段)是否有@Autowired 注解。如果有@Autowired 注解,Spring容器会从容器中查找相应类型的Bean,并进⾏注⼊。

3. 依赖注⼊的实现:

  1. 构造函数注⼊:通过构造函数参数注⼊依赖。
  2. @Component
    public class MyService {
    private final MyRepository myRepository;
    @Autowired
    public MyService(MyRepository myRepository) {
    this.myRepository = myRepository;
    }
    }
  3. Setter⽅法注⼊:通过Setter⽅法参数注⼊依赖。
  4. @Component
    public class MyService {
    private MyRepository myRepository;
    @Autowired
    public void setMyRepository(MyRepository myRepository) {
    this.myRepository = myRepository;
    }
    }
  5. 字段注⼊:直接在字段上注⼊依赖。
  6. @Component
    public class MyService {
    @Autowired
    private MyRepository myRepository;
    }

 总结


扫描和注册:Spring容器启动时,会扫描指定包中的类,寻找使⽤了@Component 等注解的类,并将这些类注册为Bean定义。创建和初始化:对于单例作⽤域的Bean,Spring容器会在启动时⽴即创建这些Bean的实例,并进⾏依赖注⼊。依赖注⼊:当Spring容器创建⼀个Bean实例时,会检查其依赖(构造函数参数、Setter⽅法参数、字段)是否有@Autowired 注解,并从容器中查找相应类型的Bean进⾏注⼊。

依赖注⼊和 Bean 创建的关系

Bean 创建:

  • 当 Spring 容器启动时,它会根据配置(如 XML 配置⽂件、Java 配置类或注解)扫描和注册所有的 Bean 定义。
  • 对于单例(Singleton)作⽤域的 Bean,Spring 容器会在启动时⽴即创建这些Bean 的实例。
  • 对于其他作⽤域(如 Prototype 作⽤域)的 Bean,Spring 容器会在每次请求时创建新的实例。


依赖注⼊:

  • 在创建 Bean 实例时,Spring 容器会检查该 Bean 的构造函数、Setter ⽅法和字段,寻找 @Autowired 注解。
  • 如果发现 @Autowired 注解,Spring 容器会从容器中查找相应类型的 Bean,并将其注⼊到⽬标 Bean 中。

详细过程


1. 扫描和注册:


Spring 容器启动时,通过组件扫描(Component Scanning)机制,扫描指定包中的类,寻找使⽤了 @Component 、@Service 、@Repository 、@Controller 等注解的类,并将这些类注册为 Bean 定义。


2. 创建和初始化 Bean:


对于单例作⽤域的 Bean,Spring 容器会在启动时⽴即创建这些 Bean 的实例。在创建 Bean 实例时,Spring 容器会处理依赖注⼊。如果⼀个 Bean 依赖于其他 Bean(通过构造函数、Setter ⽅法或字段注⼊),Spring 容器会⾸先创建这些依赖的 Bean 实例(如果它们还没有被创建),然后将它们注⼊到⽬标 Bean 中。 

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值