Spring 容器
Spring提供了两个核心接口:BeanFactory和ApplicationContext,其中applicationContext是BeanFactory的子接口。
他们都可代表Spring容器,Spring容器是生成Bean实例的工厂,并管理容器中的Bean。
Bean是Spring管理的基本单位,在基于Spring的JavaEE应用中,所有的组件都被当成Bean处理,包括数据源、Hibernate的SessionFactory、事务管理器等。
BeanFactory:
Spring容器最基本的接口就是BeanFactory,该接口负责配置、创建,管理Bean,它有一个子接口;AppcationContext,因此也被称为Spring上下文。Spring容器还负责管理Bean与Bean之间的依赖关系。
调用者只需使用getBean()方法即可获得指定Bean的引用,无须关心Bean的实例化过程。
BeanFactory有一个常见的实现类:org.springframework.beans.factory.xml.XmlBeanFactory类。
ApplicationContext是BeanFactory的子接口,对于大部分JavaEE应用而言,使用它作为Spring容器更方便。其常见实现类是:FileSystemXmlApplicationContext、ClassPathXmlApplicationContext和AnnotataionConfigApplicationContext。如果在web应用中使用Spring容器,通常有XmlWebApplicationContext、AnnotatioinConfigWebApplicationContext两个实现类。
大部分的JavaEE应用,可以在启动WEB应用时自动加载ApplicationContext实例,接受Spring管理的Bean无须知道ApplicationContext的存在,一样可以利用ApplicationContext的管理。对于独立的应用程序,也可通过如下方法来实例化BeanFactory。
1、
//搜索当前文件路径下的beans.xml文件创建Resource对象
InputStreamResource isr = new FileSystemResource(“beans.xml”);
//以Resource对象作为参数,创建BeanFactory对象
XmlBeanFactory factory = new XmlBeanFactory(isr);
或者采用:
2、
//搜索类加载路径,以类加载路径下的beans.xml文件创建Resource对象
ClassPathResource res = new ClassPathResource(“beans.xml”);
//以Resource对象作为参数,创建BeanFactory对象
XmlBeanFactory factory = new XmlBeanFactory(res);
如果需要同时加载多个XML配置文件,则可以采用如下方式:
//搜索CLASSPATH路径,以CLASSPATH路径下的applicationContext.xml、Bean.xml、Service.xml文件创建ApplicationContext
ApplicationContext appContext = new ClassPathXmlApplicaation(new String[“beans.xml”,”service.xml”]);
ApplicationContext:
ApplicationContext是BeanFactory接口的子接口,它增强了BeanFactory的功能。
ApplicationContext允许以声明式方式操作容器,无须手动创建它。可利用如ContextLoader的支持类,在WEB应用启动时自动创建ApplicationContext。当前,也可以采用编程方式创建ApplicationContext.
BeanFactory与ApplicationContext实例化容器中Bean的时机不同,前者等到程序需要Bean实例时才创建,而后者在容器创建ApplicationContext实例时,会预初始化容器中的全部Bean。
因为采用ApplicationContext作为Spring容器,创建容器时会同时创建容器中所有singleton作用域Bean,因此可能需要更多的系统开销。但一旦创建成功,应用后面的响应速度就会更快,因此,对于普通的JavaEE应用,推荐使用ApplicationContext作为Spring容器。
实际上Spring允许singleton作用的Bean指定lazy-init=”true”,该属性将改变singleton Bean实例的默认行为,强制取消该Bean实例预初始化,则该Bean将不会随着ApplicationContext启动而预实例化。
Spring 容器的更多相关文章
- 一则spring容器启动死锁问题(DefaultListableBeanFactory/DefaultSingletonBeanRegistry)
线上发现一个问题,应用在启动时会卡死,log上并没有什么异常输出,初判应该是死锁问题. 抓现场的thread dump文件, 确实是有两个线程有deadlock问题. 线程一 "HSFBiz ...
- Spring容器深入(li)
spring中最常用的控制反转和面向切面编程. 一.IOC IoC(Inversion of Control,控制倒转).对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的 ...
- 通过单元测试理解spring容器以及dubbo+zookeeper单元测试异常处理
一.先说一个结论:单元测试与主项目的spring容器是隔离的,也就是说,单元测试无法访问主项目spring容器,需要自己加载spring容器. 接下来是代码实例,WEB主项目出于运行状态,单元测试中可 ...
- 同时使用Junit4的@Parameterized参数化测试和Spring容器
转载:http://www.jianshu.com/p/d191fe54915f 整合Spring容器 @SpringApplicationConfiguration(classes = Applic ...
- Spring-Context之四:Spring容器及bean的定义
Spring框架的核心功能之一就是控制反转(Inversion of Control, IoC),也叫做依赖注入(dependency injection, DI).关于依赖注入的具体内容可以参见Ma ...
- spring容器对bean生命周期的管理三中方式
spring容器对bean的生命周期管理主要在两个时间点:bean的初始化完成(包括属性值被完全注入),bean的销毁(程序结束,或者引用结束)方式一:使用springXML配置中的init-meth ...
- spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)转
关键字:spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) 应用场景:很多时候我们想要在某个类加载完毕时干某件事情,但是使用了spring管理对象,我们这个类引用 ...
- 整合Servlet到Spring容器
有时在Spring(3.2.5)项目中,如果使用到Servlet,可能希望Servlet实例作为bean受Spring容器管理,这样也能自动注入其他需要的bean,查了下,发现只针对过滤器提供了代理类 ...
- spring容器初始化执行某个方法
在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出 ...
随机推荐
- C# 获取系统时间及时间格式
--DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 取当前年月日时分秒 currentTime=System. ...
- XML.03-DOM和SAX解析
body,td { font-family: calibri; font-size: 10pt } XML.03-DOM和SAX解析 XML的DOM解析 解析 处理 回写 XML的SAX解析 SAX和 ...
- php sleep()的实时输出打印,清除ob缓冲区
@ini_set('implicit_flush',1);ob_implicit_flush(1);@ob_end_clean(); echo 1;//echo str_repeat('', 1024 ...
- RabbitMQ的work queue(1)
http://www.rabbitmq.com/tutorials/tutorial-two-java.html 在第一个教程中,我们通过一个命名队列来发送消息和接受消息.在这一节,我们将创建一个工作 ...
- ajax data传值
如果要我们要把整个form1表单中的输入框都传过去可以用data:$("#form1").serialize(), 但是我们如果还要传一个不在form中的值呢? 可以使用下面这种方 ...
- Ubuntu 16.10下的eclipse
下载后解压,放到文件下,打开此文件左边齿轮状的东西,即可指引安装:
- sql server 2008 外键关联的设置和取消
直接上图片 选中表右击-设计 找到需要设置外键的字段.右击-关系,在弹出的对话框中点击添加 选择右边的小按钮点击.选择主键表和关联的主键ID,以及外建表的关联字段. 建立外键完成. 删除的话选中某个外 ...
- MES开发学习一
/*开发批次的当前信息查询界面,显示字段包括批次名,产品名,产品版本,批次数量,开始原因,所有者,当前工序,工艺路线, 工艺路线版本,车间,并能通过批次名,产品名,工序进行过滤和按照批次名正序排列.* ...
- TimeQuest学习
1.物理时钟特性:clock skew(时钟差),jitter(拉动),clock latency(时钟潜伏),这些物理时钟特性又称为uncertainl--非定性,或非理想性. clock skew ...
- pandas中将timestamp转为datetime
参考自:http://stackoverflow.com/questions/35312981/using-pandas-to-datetime-with-timestamps 在pandas Dat ...