ApplicationContex应用上下文容器中获取bean和从bean工厂容器的区别

部署运行你感兴趣的模型镜像

从ApplicationContext中取bean:

ApplicationContext ac = new ClassPathXmlApplicationContext("com/hsp/ioc/beans.xml");

当我们去实例化beans.xml,该文件中配置的bean被实例(该bean scope是 singleton)从bean中取出student

             

如果我们使用beanfactory去获取bean,当你只是实例化该容器, 那么

容器的bean不被实例化,只有当你去使用getBean某个bean时,才会实时的创建.

BeanFactory  factory = new XmlBeanFactory(newClassPathResource("com/hsp/ioc/beans.xml"));

factory.getBean("student");


结论:

1.如果使用ApplicationContext ,则配置的bean如果是 singlton不管你用不用,都被实例化.(好处就是可以预先加载,缺点就是耗内存)

2.如果是 BeanFactory ,则当你获取beanfacotry时候,配置的bean不会被马上实例化,当你使用的时候,才被实例(好处节约内存,缺点就是速度)

3.规定: 一般没有特殊要求,应当使用ApplicatioContext完成(90%)


您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

<think>好的,我现在需要回答用户关于Spring Boot应用上下文Bean加载机制过程的问题。首先,我需要回顾一下自己对Spring Boot的理解,尤其是应用上下文Bean加载的流程。 用户的问题集中在“应用上下文阶段”的Bean加载机制,所以需要明确应用上下文的不同阶段,比如启动、准备、刷新等。Spring Boot的应用上下文通常是在启动时通过SpringApplication.run()方法创建的,这里会涉及到ConfigurableApplicationContext的初始化。 我记得应用上下文的初始化过程中,Bean的加载主要是在容器的刷新阶段进行的,也就是调用AbstractApplicationContext的refresh()方法时。这个阶段会执行多个步骤,包括BeanFactory的准备、Bean定义的加载、Bean的后置处理、Bean的实例化初始化等。 接下来需要分步骤详细说明这个过程。首先,Bean定义的加载可能涉及到各种配置源,比如XML、Java配置类、组件扫描等。在Spring Boot中,BeanDefinitionLoader负责加载这些配置源,将Bean定义注册到BeanFactory中。这里可能需要引用到相关的源码,比如BeanDefinitionLoader的load方法遍历所有配置源并加载每个源。 然后,在BeanFactory准备阶段,会创建BeanFactory实例,通常是DefaultListableBeanFactory。之后,应用上下文会加载Bean定义到BeanFactory中,这包括通过@Configuration类、@Component扫描、或者手动注册的Bean。 之后是BeanFactory的后置处理,这里会执行所有的BeanFactoryPostProcessor,例如处理@PropertySource,解析@Configuration类中的@Bean方法,处理占位符等。特别是ConfigurationClassPostProcessor,它负责处理配置类,可能会递归解析导入的其他配置类。 然后是注册BeanPostProcessor,这些处理器会在Bean的初始化前后执行自定义逻辑,比如处理@Autowired注解,@PostConstruct方法等。 接下来是Bean的实例化阶段,容器会根据Bean定义创建Bean实例,这里涉及到依赖注入,比如通过构造器注入或者setter注入。之后是初始化阶段,执行初始化方法,比如InitializingBean的afterPropertiesSet方法,或者@PostConstruct注解的方法。 最后是完成阶段,容器完成刷新,所有的单例Bean都会被实例化,应用上下文就处于可用状态了。 需要注意的是,用户提到的引用中有提到BeanDefinitionLoader,这是Spring Boot用来加载不同配置源的类,比如从主配置类、XML、Groovy等加载Bean定义。另外,引用[5]中提到可以在容器初始化后手动注册Bean,这属于编程式加载,可能在refresh()之后通过register方法添加。 需要确保回答中涵盖这些步骤,并引用相关的引用资料,比如引用[3]提到ConfigurableApplicationContext包含所有由Spring管理的Bean,引用[4]提到BeanDefinitionLoader的加载过程,引用[5]提到手动加载Bean的方式。 另外,用户可能希望了解整个过程的顺序关键点,所以需要结构清晰,分阶段说明。同时,生成的相关问题需要Bean加载机制相关,比如生命周期、自定义Bean加载、配置类处理等。 现在需要组织这些信息,用中文清晰表达,确保符合系统级指令中的格式要求,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不太需要数学公式。同时,生成相关问题,并在回答中适当添加引用标识。</think>### Spring Boot应用上下文Bean加载机制及过程 Spring Boot的Bean加载机制是**容器初始化过程的核心**,主要发生在应用上下文刷新阶段(`AbstractApplicationContext#refresh()`)。整个过程分为多个关键步骤[^3][^4]: #### 一、Bean定义加载阶段 1. **BeanDefinitionLoader启动** Spring Boot通过`BeanDefinitionLoader`加载配置源(主类、XML、Groovy等),遍历所有配置源并解析成Bean定义: ```java void load() { for (Object source : this.sources) { load(source); // 加载单个配置源 } } ``` 此阶段将`@SpringBootApplication`标注的主类作为入口,触发组件扫描配置类解析[^4]。 2. **Bean定义注册** 解析后的Bean定义(如`@Component`类、`@Bean`方法)会注册到`DefaultListableBeanFactory`中,生成`BeanDefinition`对象存储元数据。 #### 二、BeanFactory后置处理 1. **BeanFactoryPostProcessor执行** 调用所有`BeanFactoryPostProcessor`实现类(如`ConfigurationClassPostProcessor`),完成以下操作: - 解析`@Configuration`类中的`@Bean`方法 - 处理`@PropertySource`、`@Import`等注解 - 合并外部属性配置到环境变量[^3] 2. **配置类递归解析** ```java // ConfigurationClassPostProcessor处理逻辑示例 public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) { // 解析配置类及其导入的其他配置类 } ``` #### 三、Bean实例化初始化 1. **BeanPostProcessor注册** 注册所有`BeanPostProcessor`(如`AutowiredAnnotationBeanPostProcessor`),用于后续依赖注入生命周期回调。 2. **单例Bean预实例化** 容器通过**依赖查找****依赖注入**创建Bean实例: ```java // AbstractAutowireCapableBeanFactory#doCreateBean protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { // 1. 实例化(通过构造器或工厂方法) // 2. 属性注入(@Autowired/@Resource) // 3. 初始化(@PostConstruct、InitializingBean) } ``` #### 四、上下文完成阶段 1. **完成刷新** 调用`finishRefresh()`发布`ContextRefreshedEvent`事件,标志应用上下文就绪[^3]。 2. **延迟初始化支持** 若开启`spring.main.lazy-initialization=true`,Bean将在首次请求时创建。 #### 五、特殊加载方式 - **编程式注册**:上下文初始化后可通过`ctx.register(MyBean.class)`手动加载Bean[^5]。 - **条件化加载**:通过`@Conditional`系列注解控制Bean的注册条件。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHOU_VIP

您的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值