Spring学习第一周-Spring核心容器

Spring框架的主要功能是通过其核心容器来实现的。Sping框架提高了两种核心容器,分别为BeanFactory和ApplicationContext

BeanFactory

BeanFactory由org.springframework.beans.facytory.BeanFactory接口定义,是基础类型的IoC容器,它提供了完整的IoC服务支持。简单来说,BeanFactory就是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法。
BeanFactory接口提供了几个实现类,其中最常用的是org.springframework.beans. factory.xml.XmlBeanFactory,该类会根据XML配置文件中的定义来装配Bean。
创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,其加载配置信息的语法如下。

BeanFactory beanFactory=new XmlBeanFactory(new FileSystemResource("F:/applicationContext.xml"))

ApplicationContext

ApplicationContext是BeanFactory的子接口,也被称为应用上下文,是另一种常用的Spring核心容器。它由org.springframework.context. ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。
创建ApplicationContext接口实例,通常采用两种方法,具体如下。

通过ClassPathXmlApplicationContext创建

ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作,其使用语法如下。

ApplicationContext applicationContext =new ClassPathXmlApplicationContext(String configLocation);

上述代码中,configLocation参数用于指定Spring配置文件的名称和位置。如果其值为“applicationContext.xml”,则Spring会去类路径中查找名称为applicationContext.xml的配置文件。

通过FileSystemXmlApplicationContext创建

FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作,其使用语法如下。

ApplicationContext applicationContext =new FileSystemXmlApplicationContext(String configLocation);

与ClassPathXmlApplicationContext有所不同的是,在读取Spring的配置文件时,FileSystemXmlApplicationContext不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,例如“D:/workspaces/applicationContext.xml”。如果在参数中写的不是绝对路径,那么方法调用的时候,会默认用绝对路径来找。这种采用绝对路径的方式,会导致程序的灵活性变差,所以这个方法一般不推荐使用。
在使用Spring框架时,可以通过实例化其中任何一个类来创建ApplicationContext容器。通常在Java项目中,会采用通过ClassPathXmlApplicationContext类来实例化ApplicationContext容器的方式,而在Web项目中,ApplicationContext容器的实例化工作会交由Web服务器来完成。Web服务器实例化ApplicationContext容器时,通常会使用基于ContextLoaderListener实现的方式,此种方式只需要在web.xml中添加如下代码。

<! --  指定Spring配置文件的位置,多个配置文件时,以逗号分隔-->  
<context-param>    
  <param-name>contextConfigLocation</param-name> 
  <! --  Spring将加载spring目录下的applicationContext.xml文件 --> 
      <param-value>
           classpath:spring/applicationContext.xml  
      </param-value>
</context-param> 
<! --  指定以ContextLoaderListener方式启动Spring容器 --> 
<listener>
    <listener-class>        
    org.springframework.web.context.ContextLoaderListener
</listener-class> </listener>

创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种方法。

  • Object getBean(String name):根据容器中Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换。
  • T getBean(Class requiredType):根据类的类型来获取Bean的实例。由于此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换。

注:
BeanFactory和ApplicationContext两种容器都是通过XML配置文件加载Bean的。二者的主要区别在于,如果Bean的某一个属性没有注入,使用BeanFacotry加载后,在第一次调用getBean()方法时会抛出异常,而ApplicationContext则在初始化时自检,这样有利于检查所依赖属性是否注入。因此,在实际开发中,通常都优先选择使用ApplicationContext,而只有在系统资源较少时,才考虑使用BeanFactory。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring容器的立即初始化是指在容器启动时立即创建并初始化所有的bean。在Spring容器的初始化过程中,会调用refresh()方法来完成容器的初始化工作。\[2\]在refresh()方法中,会依次执行一系列的步骤,包括加载bean的定义、创建bean实例、依赖注入、初始化bean等。其中,初始化bean的过程就是将bean的定义转化为实际的对象,并对其进行属性设置、初始化方法调用等操作。\[2\] 在初始化bean的过程中,Spring容器会根据bean的定义信息创建bean的实例,并将其放入容器中。然后,容器会对这些bean进行属性注入,即将依赖的其他bean注入到当前bean中。接着,容器会调用bean的初始化方法,执行一些自定义的初始化逻辑。最后,初始化完成后,这些bean就可以被其他bean或者应用程序使用了。\[2\] 需要注意的是,Spring容器的立即初始化可能会导致启动时间较长,尤其是当容器中包含大量的bean时。因此,在实际应用中,可以根据需要选择延迟初始化某些bean,以提高应用的启动性能。可以通过设置lazy-init属性为true来延迟初始化bean,只有在第一次使用时才会进行初始化操作。\[2\] 总结起来,Spring容器的立即初始化是指在容器启动时立即创建并初始化所有的bean,包括加载bean的定义、创建bean实例、依赖注入、初始化方法调用等操作。通过延迟初始化某些bean,可以提高应用的启动性能。\[2\] #### 引用[.reference_title] - *1* *2* *3* [Spring容器是怎么初始化的](https://blog.csdn.net/qq_64513388/article/details/121567916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值