@Autowired 和 @Resource的区别
如何配置Bean的作用域
用@Scope注解 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Bean的生命周期
1.实例化
(1)通过反射去推断构造函数进行实例化
(2)实例工厂、静态工厂
2.属性赋值
(1)解析自动装配(@Autowired)
(2)可能出现循环依赖问题 a和b 互相@Autowired
3.初始化
(1)调用XXXAware回调方法
(2)调用初始化生命周期回调a
(3)如果bean实现aop,创建动态代理
4.销毁
(1)在spring容器关闭的时候进行调用
(2)调用初始生命周期回调a
SpringBoot自动配置原理
启动类@SpringBootApplication中包含@EnableAutoConfiguration注解,该注解会扫描 META-INF/spring-factories 文件,这个文件包含一系列的自动配置类名,这些自动配置类会依据类路径中的依赖和配置,自动配置相应的 Bean。
自动配置类是带有 @Configuration 注解的类,它们会依据特定的条件来决定是否进行配置。常见的条件注解有:
- @ConditionalOnClass:当类路径中存在指定的类时,才会进行配置。
- @ConditionalOnMissingBean:当 Spring 容器中不存在指定类型的 Bean 时,才会进行配置。
- @ConditionalOnProperty:当配置文件中存在指定的属性,并且属性值满足条件时,才会进行配置。
工作流程
- 启动 Spring Boot 应用:当启动 Spring Boot 应用时,@SpringBootApplication 注解中的 @EnableAutoConfiguration 会被处理。
- 加载 spring.factories 文件:Spring Boot 会从类路径下的所有 META - INF/spring.factories 文件中加载 org.springframework.boot.autoconfigure.EnableAutoConfiguration 对应的自动配置类列表。
- 筛选自动配置类:根据各种条件注解对自动配置类进行筛选,只有满足条件的自动配置类才会被应用。例如,如果类路径中没有包含 tomcat 相关的类,那么与 Tomcat 服务器配置相关的自动配置类就不会被应用。
- 配置 Bean:对于通过筛选的自动配置类,Spring Boot 会将其中定义的 Bean 注册到 Spring 容器中。
示例分析
以 spring - boot - starter - web 为例,当在项目中添加该依赖时:
- spring - boot - starter - web 依赖包含 META - INF/spring.factories 文件,其中列出了多个与 Web 应用相关的自动配置类,如 WebMvcAutoConfiguration。
- WebMvcAutoConfiguration 类带有多个条件注解,例如 @ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class}),表示只有当类路径中存在 Servlet、DispatcherServlet 和 WebMvcConfigurer 类时,该自动配置类才会生效。
- 当满足条件时,WebMvcAutoConfiguration 会自动配置 Spring MVC 的相关组件,如 DispatcherServlet、RequestMappingHandlerMapping 等,并将它们注册到 Spring 容器中。