SpringBean加载完整过程
启动spring容器(创建beanfactory)->加载配置(注解、xml)->实例化bean(执行构造方法)->注入依赖->初始化bean(设置属性值)->使用->销毁
- 解析和读取 XML 配置文件或注解配置类,获取 Bean 定义信息。
- 根据 Bean 定义信息实例化 Bean 对象。根据不同的作用域(如 singleton、prototype 等),Spring 会采用相应的方式来创建 Bean 对象。
- 注入 Bean 的依赖关系。Spring 会检查 Bean 定义信息中所声明的属性或构造函数参数,并将对应的依赖对象注入到 Bean 中。
- 执行 Bean 的初始化操作。Spring 提供了多种方式来进行 Bean 的初始化,包括 InitializingBean 接口、@PostConstruct 注解、配置文件中的 init-method 等。
- 将 Bean 注册到 Spring 容器中,完成加载过程。
需要注意的是,Spring Bean 加载过程中还涉及到很多细节和扩展点,如 Bean 的后置处理器、AOP、条件装配等,这些内容可以进一步深入学习。
Spring Bean相关面试题
- Spring Bean 的加载过程包括哪些步骤?
答:Spring Bean 的加载过程主要包括解析和读取配置文件、实例化 Bean 对象、注入依赖关系、初始化 Bean 和使用、销毁等步骤。
- BeanFactory 和 ApplicationContext 有什么区别?它们在 Bean 加载过程中有何不同?
答:BeanFactory 是 Spring 容器中最基本的接口,提供了最简单的容器服务,仅支持延迟初始化。ApplicationContext 是 BeanFactory 的子接口,增加了更多的企业级功能,如事件发布、国际化消息处理等,并且预先实例化单例 Bean。
- Spring Bean 生命周期包括哪些阶段?如何在 Bean 生命周期的不同阶段进行操作?
答:Spring Bean 生命周期包括实例化、依赖注入、初始化、销毁等阶段,可以通过继承 InitializingBean 和 DisposableBean 接口、使用 @PostConstruct 和 @PreDestroy 注解、配置 XML 中的 init-method 和 destroy-method 方法来在 Bean 生命周期的不同阶段进行操作。
- Spring Bean 的作用域有哪些?它们在 Bean 加载和使用过程中有何不同?
答:Spring Bean 的作用域包括 singleton、prototype、request、session 和 global session 等,它们在 Bean 加载和使用过程中的主要区别在于是否共享 Bean 实例、生命周期长度及作用域范围。
- Spring 如何解决循环依赖问题?涉及哪些机制或实现原理?
答:Spring 通过提前暴露对象的实例化中介来解决循环依赖问题,主要涉及一级缓存和二级缓存机制以及后置处理器等实现原理。
- Spring 如何支持注解配置 Bean?常用的注解有哪些?
答:Spring 支持使用 @ComponentScan、@Configuration、@Bean、@Autowired 等注解进行 Bean 的自动扫描、注入和配置等操作。常用的注解还包括 @Service、@Controller、@Repository、@Qualifier 等。
- Spring 在 Bean 加载过程中如何进行属性注入?可以通过哪些方式来注入属性?
答:Spring 可以通过构造函数注入、setter 方法注入、字段注入、方法注入等方式来进行属性注入。可以使用 @Autowired、@Value 注解等。