当前位置:文档之家› 通过代码实例跟我学Spring框架从入门到精通——Spring框架系统的API及应用实例

通过代码实例跟我学Spring框架从入门到精通——Spring框架系统的API及应用实例

通过代码实例跟我学Spring框架从入门到精通——Spring框架系统的API及应用实例
通过代码实例跟我学Spring框架从入门到精通——Spring框架系统的API及应用实例

1.1通过代码实例跟我学Spring框架从入门到精通——Spring框架系统的API及应用实例

1、org.springframework.beans 包

(1)其中的相关的类和接口

(2)Spring 的核心是org.springframework.beans 包

该包中所提供的各个类和接口主要是为使用JavaBeans 技术、并且能够实现按名检索对象及管理对象间的关系而设计的。

这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。

关于beans 包,有三个重要的概念。

1)BeanWrapper接口

首先,它提供了设置/读取Javabeans 属性功能的BeanWrapper接口。

2)BeanFactory接口

第二个重要概念是Bean 工厂。BeanFactory接口是一个泛化工厂,具有实例化对象和管理不同对象间关系的能力。BeanFactory 可以管理几种不同类型的bean,并且支持串行化及其他生命周期方法。

BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

3)bean 的定义(命名规则)

BeanFactory 是按照bean 定义(BeanDefinition)来实例化对象的。BeanDefinition,顾名思义,是我们对bean 的定义。

通过BeanDefinition,我们不仅可以定义bean 的类结构、实例化的方式,还可以定义bean 在运行时的配合者(相关联的其它对象)。

2、Spring Framework中的核心组件的实现类----BeanWrapper接口

BeanWrapper 接口的功能多少就如它的名字所暗示的:对bean 进行包装,然后对包装后的bean 加以操作,例如设置属性值、检索属性值等等。

(1)在Java中如何动态设置一个对象属性

我们知道,如果动态设置一个对象属性,可以借助Java的Reflection机制完成:Class oneClassObj = Class.forName("https://www.doczj.com/doc/f13097210.html,erInfo");

Method oneMethodObj =

oneClassObj.getMethod("setUserName",new Class[]{String.class});

Object oneObject = (Object) oneClassObj.newInstance();

oneMethodObj.invoke(oneObject,new Object[]{"用户的名称"});

上面我们通过动态加载了https://www.doczj.com/doc/f13097210.html,erInfo类,并通过Reflection调用了UserInfo.setUserName方法设置其userName属性为"用户的名称"。如果这些常量都是通过配置文件读入,则就实现了一个最简单的BeanWrapper。这个BeanWrapper的功能很简单,提供一个设置JavaBean属性的通用方法。

(2)利用BeanWrapper接口来实现动态设置一个对象属性

Spring BeanWrapper基于与前面同样的原理,只是提供了一个更加完善的实现。下面给出一个代码示例以了解在应用系统中如何通过Spring BeanWrapper类来操作一个JavaBean。

Object oneObject = Class.forName("https://www.doczj.com/doc/f13097210.html,erInfo").newInstance();

BeanWrapper oneBeanWrapper = new BeanWrapperImpl(oneObject);

oneBeanWrapper.setPropertyValue("userName", "用户的名称");

System.out.println("UserName="+oneBeanWrapper.getPropertyValue("userName") );

尽管通过这样的方式设定JavaBean的属性实在繁琐,但它却提供了一个通用的属性设定机制,而这样的机制,也正是Spring依赖注入机制所依赖的基础。

上面的代码中,仅仅是指定了需要设置的属性名"userName",BeanWrapper将根据JavaBean规范,动态调用对象的"setUserName"方法进行属性设定。

(3)主要的作用

通过BeanWrapper接口,我们可以无需在编码时就指定JavaBean的实现类和属性值,通过在配置文件加以设定,就可以在运行期动态创建对象并设定其属性(依赖关系)。3、Spring Framework中的核心组件的实现类----org.springframework.beans.factory.BeanFactory接口

(1)主要的作用

Bean Factory,顾名思义,是根据配置文件负责创建Bean的实例,并负责Bean的生命周期的管理---,包括Bean的生成与销毁、Bean的创建方式的识别(是否为singleton)、Bean的各个属性的设定、依赖关系的建立等。如下面的配置:

singleton的缺省设置为true,如果將其设计为false,每次需要时,将重新创建一个新的对象实例。

XmlBeanFactory从xml文件中读取bean定义,同时ListableBeansFactory从属性文件中读取定义。

(2)BeanFactory 支持两个对象模型

1)单态:模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。

Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。

2)原型:模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,

原型模型最适合。

注意:

在Spring中消除了由用户自己来实现Singleton模式的应用,Spring Bean的缺省行为就是Singleton,不必再为了Singleton编码。

(3)BeanFactory中一个bean的生命周期

其中IoC容器控制Bean的生命周期,各个Bean通过它们之间的依赖关系由IoC容器预先对它们进行初始化。当各个Bean都准备就序时,它们就进入准备工作状态。最后捕再需要它们时,由IoC容器撤销这些Bean。

(4)配置文件中的主要项目

1)Bean属性值及依赖关系(对其他Bean的引用)

2)Bean创建模式(是否Singleton模式,即是否只针对指定类维持全局唯一的实例)

3)Bean初始化和销毁方法

4)Bean的依赖关系

Bean的定义配置标签中的主要属性的说明

(5)一个较为完整的Bean配置示例

Spring Bean 配置示例

singleton="true" ⑶

init-method="init" ⑷

destroy-method="cleanUpMethod" ⑸

depends-on="UserInfoManagMethod"> ⑹

用户名称

normal

(6)解释说明

⑴ id:Java Bean在BeanFactory中的唯一标识,代码中通过BeanFactory获取

JavaBean实例时需以此作为索引名称。

⑵ class:JavaBean 类名

⑶ singleton:指定此JavaBean是否采用单例(Singleton)模式,如果设为"true",

则在BeanFactory作用范围内,只维护此JavaBean的一个实例,代码通过BeanFactory 获得此JavaBean实例的引用。反之,如果设为"false",则通过BeanFactory获取此Java Bean实例时,BeanFactory每次都将创建一个新的实例返回。

⑷ init-method:初始化方法,此方法将在BeanFactory创建JavaBean实例之后,

在向应用层返回引用之前执行。一般用于一些资源的初始化工作。

⑸ destroy-method:销毁方法。此方法将在BeanFactory销毁的时候执行,一般

用于资源释放。

⑹ depends-on:Bean依赖关系。一般情况下无需设定。Spring会根据情况组织各

个依赖关系的构建工作(这里示例中的depends-on属性非必须)。

只有某些特殊情况下,如JavaBean中的某些静态变量需要进行初始化(这是一种BadSmell,应该在设计上应该避免)。通过depends-on指定其依赖关系可保证在此Bean 加载之前,首先对depends-on所指定的资源进行加载(本例将首先创建ActionManager 组件对象)。

:通过节点可指定属性值。BeanFactory将自动根据JavaBean

对应的属性类型加以匹配。

上面的"desc"属性提供了一个null值的设定示例。注意代表一个空字符串,如果需要将属性值设定为null,必须使用节点。

:指定了属性对BeanFactory中其他Bean的引用关系。上面示例中的

oneUserInfo的userPrevile属性引用了id为userPrevile的Bean。BeanFactory将在运行期创建userPrevile Bean的实例,并将其引用传入oneUserInfo Bean的

userPrevile属性中。

(7)如何通过BeanFactory获取Bean实例

这个接口有多个实现。最常使用的简单的BeanFactory实现是org.springframework.beans.factory. xml.XmlBeanFactory。

InputStream oneInputStream = new FileInputStream("myBeanConfigure.xml");

XmlBeanFactory oneXmlBeanFactory = new XmlBeanFactory(oneInputStream);

UserInfoManageBean userInfoManageBean =

(UserInfoManageBean) oneXmlBeanFactory.getBean("userInfoManageBean");

注意:

由于ApplicationContext是BeanFactory的子接口,所以大多数的用户更喜欢使用ApplicationContext的XML形式。

很多情况下,在代码中不需要实例化BeanFactory,因为Spring框架代码会做这件事。例如,Web层提供支持代码,在J2EE Web应用启动过程中自动载入一个Spring ApplicationContext。

(8)BeanFactory中的几个不同的getBean方法

1)Object getBean(String)

按名返回一个已注册bean 的实例。取决于该bean 在BeanFactory 中的配置,将返回一个共享的唯一的bean 实例或者是一个重新创建的bean 实例。当无法找到bean的定义(此时将引发一个NoSuchBeanDefinitionException 异常)或者在进行实例化和初始化bean 时引发了一个异常,都将引起一个BeansException 异常被抛出。

2)Object getBean(String,Class)

按名返回一个已注册bean 的实例。这个bean 实例的Class 类型必须和给出的Class 类型参数相匹配,否则相应的异常将会被抛出(BeanNotOfRequiredTypeException 异常)将会被抛出。此外,这个方法的其他的行为和getBean(String)方法相同。

(8)BeanFactory与BeanWrapper的不同点

BeanWrapper实现了针对单个Bean的属性设定操作。而BeanFactory则是针对多个Bean 的管理容器,根据给定的配置文件,BeanFactory从中读取类名、属性名/值,然后通过Reflection机制进行Bean加载和属性设定。

在实际应用开发中,一般都使用BeanFactory类获得指定的组件。

4、Spring Framework中的核心组件的实现类---- org.springframework.context.ApplicationContext

(1)org.springframework.context包

context包在我们的应用程序中扮演了一个对象注册表的角色。其功能类似J2EE应用程序服务器提供的enterprise naming context(JNDI)特性,然而有几个重要的不同之处。

1)首先,对象的绑定在Spring的application context中不需要额外的远程接口或对象。

2)其次,application contexts可以在我们的应用程序中的各个层面使用,从基于Swing

的客户端到Web应用程序,除此以外,也能使用在EJB环境中。

(2)ApplicationContext接口的定义

Context我们通常解释为上下文环境,我们可以将它理解为“容器”的概念,可能会更容易理解一些,此时则可以将ApplicationContext理解为“应用的容器”!Spring把Bean 放在这个容器中,在需要的时候,用getBean方法取出。

利用“Context”,最终达到在Spring中为我们的应用系统在导入Bean的定义方面,能够提供多种不同的选择形式。

context包的基础是org.springframework.context.ApplicationContext接口,提供了国际化、事件处理及beans在context中的自查能力。它也可创建具有层次结构context 环境,将bean的作用域和可访问区域限制在应用程序的一个特定部分中。

(3)ApplicationContext与BeanFactory的不同点

1)ApplicationContext提供了一个更为框架化的实现

BeanFactory提供了针对JavaBean的管理功能,而ApplicationContext提供了一个更为框架化的实现(从上面的示例中可以看出,BeanFactory的使用方式更加类似一个API,

而非Framework风格)。

一般在我们的应用程序中几乎不必和BeanFactory打交道,而大多数情况下,我们只会使用ApplicationContext----因为,它添加了一些企业级的J2EE特性,如国际化(i18n),自定义转换器及事件的广播等功能。

2)ApplicationContext除了支持BeanFactory的所有的功能以外,还支持以声明的方式来进行Bean的定义(如使用ContextLoader)。

3)ApplicationContext不仅适用于J2SE,也适用于J2EE的应用

ApplicationContext覆盖了BeanFactory的所有功能,并提供了更多的特性。此外,ApplicationContext为与现有应用框架相整合,提供了更为开放式的实现(如对于Web应用,我们可以在web.xml中对ApplicationContext进行配置)。

(4)ApplicationContext所提供的对BeanFactory类的主要扩展功能

由于ApplicationContext继承自多个不同的接口:ApplicationEventPublisher、HierarchicalBeanFactory、ListableBeanFactory、MessageSource、ResourceLoader,而其中的ListableBeanFactory接口又继承自BeanFactory。

因此,所以除了BeanFactory的功能之外,ApplicationContext还提供了以下的功能:1)国际化支持---继承自MessageSource接口的功能

我们可以在Beans.xml文件中,对程序中的语言信息(如提示信息)进行定义,将程

序中的提示信息抽取到配置文件中加以定义,为我们进行应用的各语言版本转换提供了极大的灵活性。

2)资源访问----继承自ResourceLoader接口的功能

支持对文件和URL的访问。

3)事件传播

事件传播特性为系统中状态改变时的检测提供了良好支持。

4)多实例加载

可以在同一个应用中加载多个Context实例。

(5)Spring在导入Bean定义方面为我们提供了多种选择

1)ClassPathXmlApplicationContext

web应用程序中从classpath(也就是WEB-INF/classes或是W E B - I N F / l i b 下的j a r 文件) 中入c o n t e x t 文件。使用new ClassPathXmlApplicationContext(path)来初始化,其中path是文件的路径。path参数还可以用path的String数组。这是一种在单元测试中好用的context。

2)FileSystemXmlApplicationContext

从文件系统中导入context文件,测试方便。使用new FileSystemXmlApplicationContext (path)初始化,path是文件的相对或是绝对路径。path参数也可以是一个String数组。

3)XmlWebApplicationContext

通过ContextLoaderListener从内部导入context文件,但也可以在外部使用。例如,如果我们运行的服务器没有按web.xml中指定的顺序加载Listener,我们可以必须在另一个Listener中使用它。

(6)ApplicationContext管理Bean的执行阶段

1)创建Bean;

2)属性注入(依赖关系的注入);

3)BeanNameAware接口实现类的setBeanName()方法;

4)BeanFactoryAware接口实现类的setBeanFactory()方法;

5)ApplicationContextAware接口实现类的setApplicationContext()方法;

6)BeanPostProcessor接口实现类中的postProcessBeforeInitialization()方法;

7)InitializingBean接口实现类的afterPropertiesSet()方法;

8)Bean定义文件中init-method属性所指定的方法;

9)BeanPostProcessor接口实现类中的postProcessAfterInitialization()方法;

5、ApplicationContext所提供的国际化支持

(1)常规的国际化支持的实现

国际化支持在实际开发中可能是最常用的特性。对于一个需要支持不同语言环境的应用而言,我们所采取的最常用的策略一般是通过一个独立的资源文件(如一个properties 文件)完成所有语言信息(如界面上的提示信息)的配置。

(2)ApplicationContext所提供的国际化支持

Spring对这种传统的方式进行了封装,并提供了更加强大的功能,如信息的自动装配以及热部署功能(配置文件修改后自动读取,而无需重新启动应用程序)。

在下面的示例配置文件中,我们简单地通过MessageResource的一个实现类org.springframework.context.support.ResourceBundleMessageSource来获得国际化的信息。

目前Spring中提供了两个MessageSource接口的实现,即ResourceBundleMessageSource和ReloadableResourceBundleMessageSource,后者提供了无需重启即可重新加载配置信息的特性。

(3)一个典型的示例

1)*.xml 配置文件的内容

Spring XML配置示例

class="org.springframework.context.support.ResourceBundleMessageSource">

messages

这里声明了一个名为messageSource的Bean(注意:对于Message定义,Bean ID必须为messageSource,这是目前Spring的编码规约),对应类为

ResourceBundleMessageSource。

而其中的basename属性用來设定资源信息文件的前置文件名称,在本例中为messages。Spring会自动在CLASSPATH根路径中按照如下顺序搜寻资源信息文件并进行加载(以Locale为zh_CN为例,其实Spring在实际上调用了JDK的ResourceBundle读取配置文件): messages_zh_CN.properties

messages_zh.properties

messages.properties

messages_zh_CN.class

messages_zh.class

messages.class

2)资源配置信息文件中的内容

messages_zh_CN.properties:

userInfo=当前登录用户: [{0}] 登录时间:[{1}]

messages_en_US.properties:

userInfo =Current Login user: [{0}] Login time:[{1}]

3)测试代码---直接构造Application Context

ApplicationContext oneApplicationContext =

new FileSystemXmlApplicationContext("myBeanConfigure.xml");

Object[] argArray =new Object[]{ "输出的信息",

Calendar.getInstance().getTime()};

//以系统默认Locale加载信息(对于中文WinXP而言,默认为zh_CN)

String someOneMessage =

oneApplicationContext.getMessage("userInfo ", argArray);

System.out.println("输出的信息为:"+ someOneMessage);

代码中,我们将一个Object数组argArray作为参数传递给ApplicationContext.getMessage方法,这个参数中包含了出现在最终文字信息中的可变内容,ApplicationContext将根据参数中的Locale信息对其进行处理(如针对不同Locale 设定日期输出格式),并用其替换配置文件中的{n}标识(n代表参数数组中的索引,从1开始)。

6、ApplicationContext所提供的资源访问

(1)ApplicationContext.getResource方法提供了对资源文件访问支持,如:Resource oneResource = context.getResource("classpath:config.properties");

File oneFile = oneResource.getFile();

(2)注意其中的"classpath:"是Spring中自己定义的url虚拟协定

在本例中将返回一个 org.springframework.core.io.ClassPathResource对象,而配置文件是位于CLASSPATH根目录中。

getResource方法的参数为一个资源访问地址(也就是可以指定标准的url,如是"file:"或"http:"等)。如:

file:C:/config.properties

/config.properties

classpath:config.properties

Resource resource =

context.getResource("file:c:/workspace/springtest/conf/admin.properties");

这将返回一个org.springframework.core.io.FileSystemResource对象,或者我们也可以如下指定来返回一个ServletContextResource对象:

Resource resource = context.getResource("WEB-INF/conf/admin.properties");(3)注意getResource返回的Resource并不一定实际存在

可以通过Resource.exists()方法对其进行判断。并通过get InputStream()方法来获得所打开的IO 流(返回一个InputStream对象)。

7、ApplicationContext所提供的事件传播

(1)ApplicationContextAware等事件监听器接口

Spring中提供一些Aware相关的接口,像是BeanFactoryAware、ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等。

实现這些 Aware接口的Bean在被初始之后,可以取得一些相对应的資源,例如实现BeanFactoryAware的Bean在初始后,Spring容器將会注入BeanFactory的对象实例,而实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入ApplicationContext的实例等等。

(2)触发事件

Bean取得BeanFactory、ApplicationContextAware的实例目的是什么,一般的目的就是要取得一些資源文件的存取、相关信息關訊息資源或是那些被注入的實例所提供的機制,例如ApplicationContextAware提供了publishEvent()方法,可以实现基于Observer设计模式的事件傳播機制。

(3)ApplicationContext基于Observer模式来实现事件传播

ApplicationContext基于Observer模式(java.util包中有对应实现),提供了针对Bean的事件传播功能。通过Application. publishEvent方法,我们可以将事件通知系统内所有的ApplicationListener。

(4)ApplicationContextAware接口

该接口中包含一个void setApplicationContext(ApplicationContext applicationContext) throws BeansException方法

(5)典型应用

事件传播的一个典型应用是,当Bean中的操作发生异常(如数据库连接失败),则通过事件传播机制通知异常监听器进行处理。

在目前版本的Spring中,事件传播部分的设计还有待改进。同时,如果能进一步支持异步事件处理机制,无疑会更具吸引力。

(6)事件广播机制

org.springframework.context.event.ApplicationEventMulticaster接口提供了事件的广播机制,但目前还相对简陋。

在运行期,ApplicationContext会自动在当前的所有Bean中寻找ApplicationListener接口的实现,并将其作为事件接收对象。当Application.publishEvent方法调用时,所有的ApplicationListener接口实现都会被激发,每个ApplicationListener可根据事件的类型判断是否是自己需要处理的事件,如上面的ActionListener只处理ActionEvent事件。

8、Spring Framework中的核心组件的实现类---- org.springframework.web.context. WebApplicationContext

(1)WebApplicationContext的应用场合

在Web应用中(注意:我们这里所说的Web应用程序是指普通的Web应用程序,如果

是采用Spring MVC框架或者Struts框架,则不需要采用WebApplicationContext),我们会用到WebApplicationContext。

(2)WebApplicationContext的继承关系

WebApplicationContext继承自ApplicationContext;在Web环境里,会使用ContextLoader构造ApplicationContext后,压进Servlet Context。

(3)Spring提供了可配置的ApplicationContext加载机制

我们通过在应用系统的web.xml中部署ContextLoaderListener 或者ContextLoaderServlet中的某一个后,Web容器将会自动加载Spring的IoC的*.xml配置文件(默认情况下为/WEB-INF/applicationContext.xml)并完成该*.xml配置文件中的各个组件对象的初始化工作。

以后,我们只需要在代码中通过WebApplicationContextUtils.getWebApplicationContext方法在Web应用中获取ApplicationContext引用,从而也就可以获得我们所需要的目标组件。

9、在Web应用中实现可配置的ApplicationContext加载机制

(1)问题的技术背景

上面的示例中,ApplicationContext均通过编码加载。对于Web应用,Spring提供了可配置的ApplicationContext加载机制org.springframework.web.context.ContextLoader类。

(2)ContextLoader加载器目前有两种选择

1)org.springframework.web.context.ContextLoaderListener

2)org.springframework.web.context.ContextLoaderServlet

这两者在功能上完全等同,只是一个是基于Servlet2.3版本中新引入的Listener接口实现,而另一个基于Servlet接口实现。开发中可根据目标Web容器的实际情况进行选择。

Listerner要比Servlet更好一些,因为Listerner监听应用的启动和结束,而Servlet 得启动要稍微延迟一些。

注意:

对ApplicationContext的获得,也可以采用编程其实现类如FileSystemXmlApplicationContext来创建。

ApplicationContext applicationContext=new FileSystemXmlApplicationContext("c: /SpringWeb/WEB-INF/springappConfigure.xml");

SpringWebAppBusiness timeDateBusiness = (SpringWebAppBusiness) applicationContext.getBean("timeDateBusiness");

(3)实现的方法

1)在web.xml中增加下面对ContextLoader的配置项目

org.springframework.web.context.ContextLoaderListener

或:

context

org.springframework.web.context.ContextLoaderServlet

1

通过以上配置,Web容器会自动加载/WEB-INF/applicationContext.xml(默认的情况下为applicationContext.xml,当然也可以修改为其它的文件名称---但要通过来说明)初始化ApplicationContext实例,如果需要指定配置文件位置,可通过context-param加以指定:

2)在web.xml中通过来定义其它的配置文件

contextConfigLocation

/WEB-INF/myApplicationContextConfigure.xml

注意:也可以为多个配置文件

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/myApplicationContextConfigureOne.xml,

/WEB-INF/myApplicationContextConfigureTwo.xml </param-value>

</context-param>

3)在Web应用中获取ApplicationContext和ServletContext的引用

●获取ApplicationContext引用

配置完成之后,即可通过 WebApplicationContextUtils.getWebApplicationContext 方法在Web应用中获取ApplicationContext引用。

注意:

Webapplicationcontextutils.getWebApplicationContext(servletcontext); 和Webapplicationcontextutils.getRequiredWebApplicationContext(servletcontext);

的区别

●前者如果如果没有获得,将直接返回null,而后者将报出异常。

获得当前Web应用的ServletContext——利用WebApplicationContext 接口中的getServletContext()方法,可以获得当前Web应用的ServletContext。

(4)ContextLoaderListener和ContextLoaderServlet的内部实现说明

以ContextLoaderListener为例,可以看到(参考Spring中的源码)

public void contextInitialized(ServletContextEvent event){

this.contextLoader = createContextLoader();

this.contextLoader.initWebApplicationContext(event.getServletContext()) ;

}

protected ContextLoader createContextLoader() {

return new ContextLoader();

}

其中的ContextLoader是一个工具类,用来初始化WebApplicationContext,其主要方法就是initWebApplicationContext,继续追踪initWebApplicationContext这个方法后发现,原来ContextLoader是把WebApplicationContext(XmlWebApplicationContext是默认实现类)放在了ServletContext中。

ServletContext也是一个“容器”,也是一个类似Map的结构,而WebApplicationContext在ServletContext中的KEY就是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,我们如果要使用WebApplicationContext则需要从ServletContext取出。

Spring提供了一个WebApplicationContextUtils类,可以方便的取出WebApplicationContext,只要把ServletContext传入就可以了。

10、使用属性文件来进行Spring组件的设置

(1)使用Java属性文件来定义Bean

由于XML文档能够很好地表达层次关系,因此非常适用于组件的配置和定义,也因此几乎所有的各种系统配置都采用XML文档作为组件的缺省的定义方式,但通常也会提供非XML定义的方式,如Java属性文件*.properties。Spring同样也可以使用Java属性文件来定义Bean。

helloBean.class=com.px1987.HelloBean

helloBean.helloWorld=Hello World!

(2)读取属性文件中的内容的示例代码

可以使用如下的类中的方法来读取属性文件中的内容

实现的代码示例如下:

import org.springframework.beans.factory.support.BeanDefinitionRegistry;

import

org.springframework.beans.factory.support.DefaultListableBeanFactory;

import

org.springframework.beans.factory.support.PropertiesBeanDefinitionReader;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.core.io.ClassPathResource;

public class SpringJavaBeanTestDemo{

public static void main(String[] args){

BeanDefinitionRegistry oneRegister =

new DefaultListableBeanFactory();

PropertiesBeanDefinitionReader reader =

new PropertiesBeanDefinitionReader(oneRegister);

reader.loadBeanDefinitions(new ClassPathResource("bean.properties"));

BeanFactory oneBeanFactory = (BeanFactory) oneRegister;

HelloBean oneHelloBean =

(HelloBean) oneBeanFactory.getBean("oneHelloBean");

System.out.println(oneHelloBean.getHelloWord());

}

}

11、以编程的方式来获得组件的信息

(1)直接采用编程方法

除了采用XML或Java属性配置文件来设定Spring的各个组件的定义,我们也可以直接采用编程的方式来获得Spring的各个组件的定义。

(2)实现的方法

通过 org.springframework.beans.MutablePropertyValues来设置组件的各个属性,并将属性与Bean的类别设定给

org.springframework.beans.factory.support.BeanDefinitionRegistry注冊该组件。

(3)主要的优点

不使用任何的配置文件来定义的好处是,客戶端与定义文档是相互隔离的,它們无法

直接接触定义文档的內容。

(4)实现的代码示例

import org.springframework.beans.factory.support.BeanDefinitionRegistry;

import org.springframework.beans.factory.support.DefaultListableBeanFactory;

import org.springframework.beans.factory.support.RootBeanDefinition;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.MutablePropertyValues;

public class SpringJavaBeanTestDemo {

public static void main(String[] args) { // 设置属性

MutablePropertyValues properties = new MutablePropertyValues();

properties.addPropertyValue("helloWord", "Hello World!");

// 设置Bean的定义

RootBeanDefinition oneRootBeanDefinition =

new RootBeanDefinition(HelloBean.class, properties);

// 注册Bean定义与Bean別名

BeanDefinitionRegistry oneBeanDefinitionRegistry =

new DefaultListableBeanFactory();

reg.registerBeanDefinition("helloBean", oneRootBeanDefinition);

BeanFactory oneBeanFactory = (BeanFactory) oneBeanDefinitionRegistry; HelloBean oneHelloBean =

(HelloBean) oneBeanFactory.getBean("helloBean");

System.out.println(oneHelloBean.getHelloWord());

}

}

相关主题
文本预览
相关文档 最新文档