Spring 的两个配置容器的讲解
容器 是Spring框架的核心,是组件存活的地方。Spring容器使用DI管理所有组成应用系统的组件,协作组件之间建立联。而且,
这些对象简洁易懂,降低耦合性,支持重用,容易被测试。
Spring提供了多种容器实现,可分为两类:Bean工厂 和应用上下文 。
1. BeanFactory :由org.springframework.beans.factory.BeanFactory接口定义,是最简单的容器,提供了基础的依赖注入支持。
BeanFactory采用了工厂设计模式,负责创建和分发各种类型的Bean,创建协作对象间的关联关系,管理Bean的生命周期,调用
用户定义的初始化和销毁方法(如果定义了这些方法的话)等。
BeanFactory有多种实现,其中,最常用的是XMLBeanFactory,它根据XML文件中的定义装载Bean。在创建XMLBeanFactory
时,需要传递一个org.springframework.core.io.Resource的实例给构造器,此Resource实例用来提供XML文件给BeanFactory。
Spring提供了以下多种Resource的实现:
Resource实现 | 描述 |
1. org.springframework.core.io.ByteArrayResource | 定义内容由一组字节给定的资源 |
2. org.springframework.core.io.ClassPathResource | 定义可从classpath提起的资源 |
3. org.springframework.core.io.DescripiveResource | 定义包含资源描述符,但实际没有可读资源的资源 |
4. org.springframework.core.io.FileSyatemResource | 定义可从文件系统提取的资源 |
5. org.springframework.core.io.InputStreamResource | 定义可从输入流提取的资源 |
6. org.springframework.core.io.UrlResource | 定义可从给定URL提取的资源 |
7. org.springframework.web.portlet.context.PortletContextResource | 定义可用在portlet上下文中的资源 |
8. org.springframework.web.context.support.ServletContextResource | 定义可用在servlet上下文中的资源 |
例如使用FileSystemResource来创建一个XMLBeanFactory,代码如下:
- /**
- * Bean工厂从"c:/beans.xml"文件中读取Bean的定义信息,并启动容器。
- * Bean载入时间:此时,Bean工厂并没有实例化Bean。即Bean是被延迟载入到Bean工厂中的,
- * 在需要使用Bean的时候(调用getBean("beanName"))才被实例化。
- */
- BeanFactory factory = new XmlBeanFactory(new FileSystemResource("c:/beans.xml"));
- /**
- * 实例化Bean,并使用依赖注入设置Bean的属性及关联关系等。
- */
- MyBean myBean = factory.getBean("myBean");
2. ApplicationContext :由org.springframework.context.ApplicationContext接口定义,建立在BeanFactory基础之上,提供了系统构架
服务。如:文本信息解析工具,包括对国际化(I18N)的支持;载入文件资源的通用方法;可以向注册为监听器的Bean发送事件等。
ApplicationContext的诸多实现中,经常会用到的有以下三种实现:
ApplicationContext实现 | 描述 |
1. org.springframework.context.support.ClassPathXMLApplicationContext | 从类路径中的XML文件载入上下文定义信息 |
2. org.springframework.context.support.FileSystemXmlApplicationContext | 从文件系统中的XML文件载入上下文定义信息 |
3. org.springframework.web.context.support.XMLWebApplicationContext | 从Web系统中的XML文件载入上下文定义信息 |
从文件系统或者类路径载入应用上下文与将Bean载入BeanFactory类似,例如:
- /**
- * Bean载入时间:在上下文启动后预载入所有的单实例Bean,确保在使用前已经准备好了,不需要等待它们被创建。
- */
- ApplicationContext context1 = new FileSystemXmlApplicationContext("c:/beans.xml");
- MyBean myBean = factory.getBean("myBean");
- ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
- MyBean myBean = factory.getBean("myBean");
使用FileSystemXmlApplicationContext与ClassPathXMLApplicationContext的区别是:
前者只能在指定的路径中查找;后者可在整个类路径(包括JAR文件)中查找XML文件。
3. 如何选择使用容器?
ApplicationContext包含BeanFactory的所有功能,几乎所有的应用系统都选择ApplicationContext而不是BeanFactory。
只有在资源很少的情况下,才会考虑采用BeanFactory,如在移动设备上等。
Spring 的两个配置容器的讲解的更多相关文章
- 浅谈Spring的两种配置容器
浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41 作者:黄小鱼ZZZ ...
- spring aop两种配置方式
基于注解的Spring AOP开发 简单案例快速入门 定义目标类接口和实现类 /** * Created by zejian on 2017/2/19.*/ //接口类 public interfac ...
- spring aop两种配置方式(1)
第一种:注解配置AOP注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before ...
- java框架篇---spring aop两种配置方式
第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Befor ...
- spring与springMVC的父子容器关系
背景和概述 在spring与springMVC中通过IOC可以管理bean对象,有两个配置文件可以配置ioc spring的配置文件applicationContext.xmlspringMVC的配置 ...
- Spring(二)核心容器 - 简介 、BeanFactory、ApplicationContext
目录 前言 1.容器简介 2.容器的结构 2.1 BeanFactory 2.2 ApplicationContext 2.2.1 ConfigurableApplicationContext 2.2 ...
- Spring IOC-基于XML配置的容器
Spring IOC-基于XML配置的容器 我们先分析一下AbstractXmlApplicationContext这个容器的加载过程. AbstractXmlApplicationContext的老 ...
- 【Java】Spring之基于注释的容器配置(四)
注释是否比配置Spring的XML更好? 基于注释的配置的引入引发了这种方法是否比XML“更好”的问题.答案是每种方法都有其优点和缺点,通常,由开发人员决定哪种策略更适合他们.由于它们的定义方式,注释 ...
- 这一次搞懂Spring Web零xml配置原理以及父子容器关系
前言 在使用Spring和SpringMVC的老版本进行开发时,我们需要配置很多的xml文件,非常的繁琐,总是让用户自行选择配置也是非常不好的.基于约定大于配置的规定,Spring提供了很多注解帮助我 ...
随机推荐
- CImage 获取图片RGB 、图片高和宽;
1 CImage img , img1 ,imDest; 2 img1.Load( 图片路径); 3 img.Load( 图片路径); 4 为了防止图片失真,先处理一下在把图片显示出来 5 SetSt ...
- zoj 2095 Divisor Summation
和 hdu 1215 一个意思// 只是我 1坑了 1 时应该为0 #include <iostream> #include <math.h> #include <map ...
- 苹果iphone4s完美越狱后破解4g网络方法
苹果iphone4s完美越狱后破解4g网络方法教程 作者:佚名 字体:[增加 减小] 来源:互联网 时间:01-15 10:07:25我要评论 自从港版iPhone5s/c能够破解移动4G网络后, i ...
- ch02-HTML的基本概念
HTML的基本概念 Ch02: HTML的基本概念 1, 标记: 每一组HTML标记,都会被放在"<>"里面,用于控制里面的文字显示效果及其它一些用途. 语法: 开始标 ...
- HDU 5742 It's All In The Mind
It's All In The Mind Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- JAX-RPC
JAX-RPC(基于可扩展标记语言XML的远程过程调用的Java应用程序接口)是Java Web服务开发包(WSDP)的应用程序接口(API),WSDP能使Java开发者在Web服务或其他的Web应用 ...
- JAVA和C/C++之间的相互调用。
在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用. Java Native Interface (JNI)标准是java平台的一部分 ...
- lightoj 1022
直接算即可,特别要注意精度 #include<cstdio> #include<cmath> int main(){ int t, CASE(0); double r; sca ...
- bjfu1250 模拟
这题貌似是蓝桥杯的一题改了个题面. 就是模拟啦,应该有比我的更简洁的方法. 我的方法是把所有的人(蚂蚁)按位置排完序以后从左往右看,每次有一个向左走的,就会把最左边的t出,这个变成向右中,同时,从左端 ...
- 纯css实现扁平化360卫士logo demo
前几天在w3ctech上看到有人用纯css写出了360卫士的logo,感觉蛮好玩的. 因为自己用css以来,还没有写过这种玩意,出于娱乐,我也来试着尝试一下. 开始也不知到怎么下手,最棘手的是那两个像 ...