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. 依赖注⼊的实现:
- 构造函数注⼊:通过构造函数参数注⼊依赖。
-
@Component public class MyService { private final MyRepository myRepository; @Autowired public MyService(MyRepository myRepository) { this.myRepository = myRepository; } }
- Setter⽅法注⼊:通过Setter⽅法参数注⼊依赖。
-
@Component public class MyService { private MyRepository myRepository; @Autowired public void setMyRepository(MyRepository myRepository) { this.myRepository = myRepository; } }
- 字段注⼊:直接在字段上注⼊依赖。
-
@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 中。