文档章节

5.3 Spring核心接口及基本配置

JerryPan
 JerryPan
发布于 2016/03/06 06:57
字数 1220
阅读 207
收藏 11

5.3.1  Spring核心接口

Spring有两个核心接口BeanFactory和ApplicationContext,ApplicationContext是BeanFactory的子接口。它们代表了Spring容器。

1.BeanFactory

        在Spring中有几种BeanFactory的实现,其中最常使用的是org.springframework.bean.factory.xml.XmlBeanFactory。它根据XML文件中的定义装载Bean

        要创建XmlBeanFactory,需要传递一个java.io.InputStream对象给构造函数。InputStream对象提供XML文件给工厂。例如,下面的代码片段使用一个java.io.FileInputStream对象把Bean XML定义文件给XmlBeanFactory:

BeanFactory factory = new XmlBeanFactory(new FileInputStream(" applicationContext.xml"));

        这行简单的代码告诉Bean Factory从XML文件中读取Bean的定义信息,但是现在Bean Factory没有实例化Bean,Bean被延迟载入到Bean Factory中,就是说Bean Factory会立即把Bean定义信息载入进来,但是Bean只有在需要的时候才被实例化。

        为了从BeanFactory得到Bean,只要简单地调用getBean()方法,把需要的Bean的名字当做参数传递进去就行了。由于得到的是Object类型,所以要进行强制类型转化

MyBean myBean = (MyBean)factory.getBean(“myBean”);

2. ApplicationContext

两者都是载入Bean定义信息,装配Bean,根据需要分发Bean。但是ApplicationContext提供了更多功能

① 应用上下文提供了文本信息解析工具,包括对国际化的支持

② 应用上下文提供了载入文本资源的通用方法,如载入图片

③ 应用上下文可以向注册为监听器的Bean发送事件

由于它提供的附加功能,几乎所有的应用系统都选择ApplicationContext,而不是BeanFactory。

在ApplicationContext的诸多实现中,有三个常用的实现:

ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息,把上下文定义文件当成类路径资源。

FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文定义信息。

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


例如:

ApplicationContext context=new FileSystemXmlApplicationContext ("c:/foo.xml");
ApplicationContext context=new ClassPathApplicationContext ("foo.xml");
ApplicationContext context=WebApplicationContextUtils.getWebApplicationContext (request.getSession().getServletContext ());

FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的区别是:FileSystemXmlApplicationContext只能在指定的路径中寻找foo.xml文件,而ClassPathXml ApplicationContext可以在整个类路径中寻找foo.xml。

BeanFactory是在getBean()方法调用时创建Bean。ApplicationContext会在上下文启动后预载入所有的单实例Bean,以确保需要的时候已经准备好了。



5.3.2  Spring基本配置

在Spring内拼接Bean叫做装配。

1.使用XML装配

理论上,Bean装配可以从任何配置资源获得。但实际上,XML是最常见的Spring应用系统配置源。

如下的XML文件展示了一个简单的Spring上下文定义文件:

<?xml version="1.0" encoding="UTF-8"?>
…
<beans …>                                     // 根元素
<bean id="foo" class="com.spring.Foo"/>     // Bean实例
<bean id="bar" class="com.spring.Bar"/>       // Bean实例
</beans>

在XML文件定义Bean,上下文定义文件的根元素<beans>。<beans>有多个<bean>子元素。每个<bean>元素定义了一个Bean(任何一个Java对象)如何被装配到Spring容器中。


2.添加一个Bean

向Spring容器中添加一个Bean只需要向XML文件中添加一个<bean>元素。如下面的语句:

<bean id="foo" class="com.spring.Foo"/>


当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。

 原型模式与单实例模式:Spring中的Bean默认情况下是单实例模式。在容器分配Bean的时候,它总是返回同一个实例

<bean>的singleton属性告诉ApplicationContext这个Bean是不是单实例Bean,默认是true,但是把它设置为false的话,就把这个Bean定义成了原型Bean。

<bean id="foo" class="com.spring.Foo" singleton="false"/>    //原型模式Bean

 request或session:对于每次HTTP请求或HttpSession,使用request或session定义的Bean都将产生一个新实例,即每次HTTP请求或HttpSession将会产生不同的Bean实例。

③ global session:每个全局的HttpSession对应一个Bean实例。典型情况下,仅在使用portlet context的时候有效。

当一个Bean实例化的时候,有时需要做一些初始化的工作,然后才能使用。因此,Spring可以在创建和拆卸Bean的时候调用Bean的两个生命周期方法。

在Bean的定义中设置自己的init-method,这个方法在Bean被实例化时马上被调用。同样,也可以设置自己的destroy-method,这个方法在Bean从容器中删除之前调用。

一个典型的例子是连接池Bean。

public class MyConnectionPool{
…
public void initalize(){//initialize connection pool}
  public void close(){ //release connection}
   …
}

Bean的定义如下:

<bean id="connectionPool" class="com.spring.MyConnectionPool"
    init-method="initialize"    //当Bean被载入容器时调用initialize方法
    destroy-method="close">  //当Bean从容器中删除时调用close方法
</bean>



附:目录《JavaEE基础实用教程》笔记说明

© 著作权归作者所有

JerryPan
粉丝 21
博文 54
码字总数 64891
作品 0
宁波
程序员
私信 提问
Activiti 5.3:配置与 Spring 整合

Activiti 5.3与Spring整合也比较简单,其基本思想就是,通过Spring的IOC容器来管理Activiti的流程引擎实例以及相关服务,可见,主要是基于Activiti在与Spring整合上努力上,做好配置即可。这...

鉴客
2012/02/26
2.2K
0
Struts2+Spring+Hibernate3集成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxdeng/article/details/52278238 1. 加入Struts2,Hibernate3.3,Spring3.3 和数据库驱动包 注意:当有包重复...

降龙十八腿
2016/08/22
0
0
三条路线告诉你如何掌握Spring IoC容器的核心原理

一、前言 前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国。本节的主要目的就是通过一个切入点带大家一...

Java小铺
2018/08/27
0
0
综合技术 --spring理解

spring是一个轻量级的java开发框架,该框架的主要优势就是分层架构,分层架构允许使用者选择使用哪一个组件,该框架同时为J2EE应用程序开发提供集成框架,spring使用最基本的javaBean来完成以...

求是科技
2015/04/11
51
0
Spring BeanFactory和FactoryBean的区别

有些东西可能知其用,但也需知其所以然,特转载该篇Spring BeanFactory和FactoryBean的区别 及 包是 Spring IoC 容器的基础。 一、BeanFactory 定义了IOC容器的最基本形式,并提供了IOC容器应...

淡淡的倔强
2018/09/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
8
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
14
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
3.1K
24
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
46
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部