spring中的BeanFactory与ApplicationContext的作用和区别?

news/2024/12/13 13:10:45

BeanFactory类关系继承图

1. BeanFactory类结构体系:

BeanFactory接口及其子类定义了Spring IoC容器体系结构,由于BeanFactory体系非常的庞大和复杂,因此要理解Spring IoC,需要先理清BeanFactory的继承机构。

 

2. ApplicationContext的结构体系:

ApplicationContext接口是一个BeanFactory基础上封装了更多功能的,Spring中最为常用的IoC容器,其包含两个子接口:ConfigurableApplicationContext、WebApplicationContext。

ConfigurableApplicationContext其结构体系如下:

 

详细的结构体系如下:

a.AbstractApplicationContext结构体系如下:

 

b.ConfigurablePortletApplicationContext体系结构如下:

 

c.ConfigurableWebApplicationContext结构体系如下:

 

2).WebApplicationContext体系结构如下:

 

 

  1、容器是spring的核心,使IoC管理所有和组件
  2、spring的两种容器:a、BeanFactoy
                                b、ApplicationContext应用上下文
  3、BeanFactory:BeanhFactory使用延迟加载所有的Bean,为了从BeanhFactory得到一个Bean,只要调用getBean()方法,就能获得Bean

  4、ApplicationContext:a、提供文本信息解析,支持I18N
                         b、提供载入文件资源的通用方法
                         c、向注册为监听器的Bean发送事件
                         d、ApplicationContext接口扩展BeanFactory接口
                         e、ApplicationContext提供附加功能
  5、ApplicationContext的三个实现类:a、ClassPathXmlApplication:把上下文文件当成类路径资源
                                     b、FileSystemXmlApplication:从文件系统中的XML文件载入上下文定义信息

                                     c、XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息

  6、在默认情况下,Bean全都是单态,在<bean>中的singleton为false
  7、<bean>中的id属性必须遵循Java规范,而name属性可以不遵循
  8、Bean的实例化的时候需要一些初始化的动作,同样当不再使用的时候,需要从容器中将其销毁
  9、对象的初始化:<bean init-method="方法名">
  10、对象的销毁:<bean destroy-method="方法名">
      销毁对象的过程:a、主线程先被中断
                            b、Java虚拟机使用垃圾回收机制回收Bean对象
  11、Bean设置:设值注入:1)简单配置:<bean id="xxx" class="Bean的全称类名">
                                                 <property name="xx" value="xxxxx"></property>
                                             </bean>
                                      value中的值可以是基本数据类型或者String类型,spring将会自动判断设置的类型并且将其转换成合适的值

                          2)引用配置:<bean id="xxx" class="Bean的全称类名">
                                             <property name="xx" ref="xxxxx"></property>
                                         </bean>
                                      ref中的值是引用数据类型,spring容器会完成获取工作
                          3)List和数组:<bean id="xxx" class="Bean的全称类名">
                                           <property name="list">
                                               <list>
                                                <value></value>
                                                <ref bean=""/>
                                               </list>
                                           </property>
                                        </bean>
                                        list元素内可以是任何元素,但不能违背Bean所需要的对象类

                          4)Set配置:和<list>一样,将<list>改成<set>
                          5)Map配置:Map中的每条数据是由一个键和一个值组成,用<entry>元素来定

                                     <bean id="xxx" class="Bean的全称类名">
                                           <property name="list">
                                              <entry key="key1">
                                                  <value></value>
                                              </entry>
                                           </property>
                                        </bean>
                                     <bean id="xxx" class="Bean的全称类名">
                                           <property name="list">
                                              <entry key="key1">
                                                  <ref bean=""/>
                                              </entry>
                                           </property>
                                        </bean>
                                注意:配置entry时,属性key的值只能是String,因为Map通常用String作为主键

                          6)Properties配置:使用<props>和<map>相似,最大区别是<prop>的值都是String

                  注意:使用设值注入必须要有set方法,通过name属性找set方法

                  优势:a、通过set()方法设定更直观,更自然

                        b、当依赖关系较复杂时,使用set()方法更清晰
                构造子注入:必须要有无参和带参的构造方法,加上index(值从0开始)属性避免注入混

                           <constractor-arg>

               注意:设值注入可以和构造子注入混合使用。先调用构造方法产生对象,再调用set()方法赋值。但只使用设值注入时,会先调用无参的构造方法

               优势:a、依赖关系一次性设定,对外不准修改

                     b、无需关心方式

                     c、注入有先后顺序,防止注入失败

Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类。事实上,Spring提供了两种不同的容器:一种是最基本的BeanFactory,另一种是扩展的ApplicationContext。BeanFactory 仅提供了最基本的依赖注入支持,而 ApplicationContext 则扩展了BeanFactory ,提供了更多的额外功能。二者对Bean的初始化也有很大区别。BeanFactory当需要调用时读取配置信息,生成某个类的实例。如果读入的Bean配置正确,则其他的配置中有错误也不会影响程序的运行。而ApplicationContext 在初始化时就把 xml 的配置信息读入内存,对 XML 文件进行检验,如果配置文件没有错误,就创建所有的Bean ,直接为应用程序服务。相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。

ApplicationContext会利用Java反射机制自动识别出配置文件中定义的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor,并自动将它们注册到应用上下文中;而BeanFactory需要在代码中通过手工调用addBeanPostProcessor()方法进行注册。

Bean装配实际上就是让容器知道程序中都有哪些Bean,可以通过以下两种方式实现:
配置文件(最为常用,体现了依赖注入DI的思想)
编程方式(写的过程中向BeanFactory去注册)

 

作用:

1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。
2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:

a. 国际化支持
b. 资源访问:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”
c. 事件传递:通过实现ApplicationContextAware接口
3. 常用的获取ApplicationContext的方法:
FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组
ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件
WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>

转载于:https://www.cnblogs.com/duanxz/p/4714891.html


https://dhexx.cn/news/show-17117.html

相关文章

jenkins持续集成入门21 - maven复合工程 , 多个子项目的工程 jenkins 可以勾选多个复选框,同时进行代码审查,代码编译

此案例的环境和配置信息,可查看如下文档,此案例在以下工程中升级,有此步骤省略jenkins持续集成入门20 - maven复合工程 , 多个子项目的工程 jenkins用下拉框筛选一个项目工程 , 代码审查 , 编译工程_小哇-CSDN博客 1 jenkins安装Extended Choice Parameter插件,支持多选框参数…

Windows 7系统安装MySQL5.5.21图解

Win7系统安装MySQL5.5.21图解 大家都知道MySQL是一款中、小型关系型数据库管理系统&#xff0c;非常具有有用性&#xff0c;对于我们学习非常多技术都有帮助&#xff0c;前几天我分别装了SQL Server 2008和Oracle 10g数据库&#xff0c;也用了JDBC去连接他们&#xff0c;都没有…

pythondir什么意思_python的dir()用法_python的dir()用法

1.dir(对象),查看该对象可以使用什么方法>>> aabc>>> dir(a)[__add__, __class__, __contains__, __delattr__, __doc__, __eq__, __ge__, __getattribute__, __getitem__, __getnewargs__, __getslice__, __gt__, __hash__, __init__, __le__, __len__, __l…

Python中xrange和range区别

这两个基本上都是在循环的时候用。 for i in range(0, 100): print i for i in xrange(0, 100): print i 这两个输出的结果都是一样的&#xff0c;实际上有很多不同&#xff0c;range会直接生成一个list对象&#xff1a; a range(0,100) print type(a) print a print a[0], a[…

Filebeat入门及使用-1 控制台输入,控制台输出

软件版本&#xff1a; CentOS 7.4 ES 7.6.1版&#xff0c;Filebeat7.6.1版ES7.6.1 安装&#xff0c;可参考博文【ElasticSearch】 ElasticSearch安装&#xff08;一&#xff09; - H__D - 博客园案例1, 控制台输入&#xff0c;控制台输出1 新建配置文件test.yml # 输入 filebe…

用python输出以元音字母_Leetcode练习(Python):第345题:反转字符串中的元音字母:编写一个函数,以字符串作为输入,反转该字符串中的元音字母。...

题目&#xff1a;反转字符串中的元音字母&#xff1a;编写一个函数&#xff0c;以字符串作为输入&#xff0c;反转该字符串中的元音字母。示例 1:输入: "hello"输出: "holle"示例 2:输入: "leetcode"输出: "leotcede"说明:元音字母不包…

在Servlet的GenericServlet类中为什么有两个init()方法

想要搞清楚这件事情&#xff0c;必须先了解Servlet容器调用Servlet的过程。调用过程如下 首次访问该Servlet1、调用init(ServletConfig config) 进行初始化&#xff0c;ServletConfig封装了web.xml中<init-param>配置的初始化参数&#xff0c;它由Servlet容器创建&#x…

基本的DMA控制器

DMA的基本概念     直接内存访问(DMA)是一种完全由硬件执行I/O交换的工作方式。在这种方式中&#xff0c;DMA控制器从CPU完全接管对总线的控制&#xff0c;数据交换不经过CPU&#xff0c;而直接在内存和I/O设备之间进行 。DMA方式一般用于高速传送成组数据。DMA控制器将向内…

Filebeat入门及使用-2 从文件读入,控制台输出

1 新建配置文件 a_1.yml # 输入 filebeat.inputs: - type: logenabled: truepaths:- /data/logs/test.log- /data/logs/2.log # 输出 output.console:pretty: trueenable: true 2 指定配置文件运行filebeat 命令&#xff1a;./filebeat -e -c a_1.yml 3 用另一个窗口&…

OC语言-02-OC语言-基础知识

一、基础语法 1> OC语言和C语言 C语言是面向过程的语言&#xff0c;OC语言是面向对象的语言OC语言继承了C语言&#xff0c;并增加了面向对象的思想以下内容只介绍OC语言与C语言的不同之处2> 关键字 OC语言的关键字大部分以开头&#xff0c;也有小部分一字母或下划线开头3…