Spring IOC经典案例

来源:互联网 发布:医院网络拓扑结构图 编辑:程序博客网 时间:2024/06/07 20:23

1.实例化Spring容器示例

.问题

使用ApplicationContext的方式实例化Spring容器

.方案

使用ApplicationContext的方式实例化Spring容器的核心代码如下:


String config="applicationcontext.xml路径";//注意路径的问题

ApplicationContext ac=

new ClassPathXmlApplicationContext(config);


.步骤(本人使用的是idea)

1.新建Spring web项目(可以在项目建完之后导包,也可以新建项目的时候选择同时下载jar包),主要是commons-logging,spring-bean,spring-context,spring-core,spring-expression这五个jar包




2.新建一个配置文件(applicationcontext.xml)可以使用默认的名字,也可以改名字


applicationcontext.xml的初始化内容如下:

3.新建测试类Test1

导入JUnit4,用于软件的单元测试(也可以不导入,但是需要在main主方法里面测试)

新建Test1,为了防止xml文件路径出问题,最好把xml和类放在同一个路径

在Test1类中写测试代码如下:



4.运行testInitContext方法

出现下面这样的情况就说明实例化Spring容器成功了



2.利用Spring容器创建JavaBean对象

.问题

测试Spring支持的多种JavaBean对象创建方式:

1.用构造器来实例化的方式

利用Spring调用构造器GregorianCalendar创建Calendar实例。

2.使用静态工厂方法实例化的方式

利用Spring调用calendar的静态工厂方法getInstance()创建Calendar实例。

3.使用实例工厂方法实例化的方式

利用Spring创建GregorianCalendar 对象作为工厂,调用getTime()方法创建Data类型对象实例。


.方案

1.用构造器来实例化的方式的配置代码如下:

<bean id="calendarObj1" class="java.util.GregorianCalendar" />

bean标记中id属性calendarObj1用于定义bean名字,是程序代码中获得Spring管理bean对象的标识,这个名字不能重复,class用于指定创建对象的类GregorianCalendar,Spring会自动地调用GregorianCalendar类的默认构造器创建bean对象实例。

2.使用静态工厂方法实例化的方式的配置代码如下:

<bean id="calendarObj2" class="java.util.GregorianCalendar" 

factory-method="getInstance"></bean>


bean标记中id属性calendarObj2用于定义bean名字,是程序中获得Spring管理bean对象的标识,这个名字不能重复,class属性用于指定创建对象的工厂类Calendar,factory-method属性用于指定创建对象的静态工厂方法getInstance,Spring会自动的调用工厂类Calendar静态工厂方法getInstance创建bean对象实例。

3.使用实例工厂方法实现实例化的方式的配置代码如下:

<bean id="calendarObj3" class="java.util.GregorianCalendar"></bean>

<bean id="dataObj" factory-bean="calendarObj3" 

factory-method="getTime"></bean>

这里定义了两个bean,其中一个bean calendarObj3是用于创建dataObj对象的实例工厂。

另一个bean标记中id属性dataObj用于定义bean名字,是程序代码中获得Spring管理bean对象的标识,这个名字不能重复,factory-bean属性用于指定创建对象的工厂对象calendarObj3,前面定义的一个bean,factory-method属性用于指定创建对象的工厂方法getTime,Spring会自动的调用工厂类Calendar静态工厂方法getInstance创建对象实例。


.步骤

1.配置applicationcontext.xml,增加Bean对象创建声明

代码如下:

<!--1.用构造器来实例化的方式的配置代码-->

<bean id="calendarObj1" class="java.util.GregorianCalendar" />


<!--2.使用静态工厂方法实例化的方式配置代码-->

<bean id="calendarObj2" class="java.util.GregorianCalendar

factory-method="getInstance"></bean>


<!--3.使用实例工厂方法实例化的方式配置代码-->

<bean id="calendarObj3" class="java.util.GregorianCalendar"></bean>

<bean id="dataObj" factory-bean="calendarObj3" 

factory-method="getTime"></bean>


2.在Test1类中增加测试方法testCreateBeanObject,测试Spring创建对象的结果


先创建Spring容器对象,再调用getBean方法获得Spring创建的对象实例,并且利用输出语句测试对象是否存在。这个代码中要注意:getBean方法的参数必须是上一步骤中定义的bean标记上的id属性的值,否则会出现运行异常。


代码如下:



3.运行测试方法测试bean实例化





3.如何控制Bean实例化

.问题

测试Bean的作用域,Bean的生命周期回调,Bean对象的创建时机以及如何指定bean依赖关系


.步骤


步骤一:Bean对象的创建模式

1.新建ExampleBean,该类在工程中的位置


代码如下:



2.在applicationcontext.xml文件中,配置ExampleBean


3.在Test1中新建测试方法testEampleBean(),在方法中从Spring中获取两个ExampleBean类型对象,通过比较操作符“==”进行比较,如果输出结果位true,则表明两次获取的是同一个对象,即创建对象的方式单利模式,代码如下:




4.运行结果如下:



如上可以看得出程序运行期间ExampleBean的构造器只被调用了一次,创建过一个对象,两次获得引用变量bean1,bean2,通过比较操作符“==”进行比较的输出结果为true,说明是引用了同一个对象,也就说明Spring容器创建Bean对象是唯一实例,是单利模式。

5.修改applicationcontext.xml,设置创建Bean的模式为原型模式

<bean id="examplebean" class="org.fwq.dao.ExampleBean" scope="prototype"/>

6.再次运行testExampleBean方法



结果说明调用了两次ExampleBean类的构造方法创建了两个Bean对象,比较结果是false表示bean1和bean2

引用了两个不同的对象,这样创建bean就不再是单例模式了。



步骤二:Bean对象的初始化和销毁


1.修改ExampleBean类,加入init和destroy方法,如下:




2.修改applicationcontext.xml希望在bean对象创建后自动调用init()方法,

<bean id="examplebean" class="org.fwq.dao.ExampleBean" scope="prototype" init-method="init"/>

3.运行testExampleBean()方法,自定义的初始化的方法在对象被创建后调用,如下:



4.修改applicationcontext.xml,希望在bean对象销毁前自动调用destroy方法,bean对象在Spring容器

关闭的时候被销毁,如下:

<bean id="examplebean" class="org.fwq.dao.ExampleBean"

scope="prototype" init-method="init" destroy-method="destroy"/>


控制台并没有输出预期的“销毁ExampleBean对象”的结果,这是为什么呢?

原因在于applicationcontext.xml文件中设置了destroy-method属性仅仅对单例模式起作用,在prototype模式下没有作用。

7.修改applicationcontext.xml,使用singleton模式创建Bean对象,如下:

<bean id="examplebean" class="org.fwq.dao.ExampleBean"
scope="singleton" init-method="init" destroy-method="destroy"/>


8.运行testExampleBean()方法,控制台输出;



9.在顶级的<beans/>元素中的default-init-method属性以及default-destroy-method属性,可以为容器所有的<bean>

指定初始化回调方法以及指定销毁回调方法,截图如下:


效果和上面的一样


步骤三:Bean对象的创建时机

1.注释testExampleBean中的部分代码,然后运行:



控制台打印的结果,说明默认情况下ExampleBean在Spring容器被创建时就会创建。

2.修改applicationcontext.xml,通过设置配置文件属性lazy-init=“true”,可以改变Spring容器创建对象的时机,如下:

<bean id="examplebean" class="org.fwq.dao.ExampleBean"
lazy-init="true"/>

3.运行testExampleBean方法,控制台没有输出任何信息,因为对象并没有被实例化或者说实例化被延迟了。

4.去除testExampleBean方法注释掉的代码,如下


从输出结果可以看出,当创建Spring容器时并不会直接创建ExampleBean对象,只有在使用ExampleBean对象时才会被创建,也就是,设置lazy-init=“true”属性后,对象不使用就不创建。

5.在顶级的<beans/>元素中的default-lazy-init属性,可以为容器所有<bean>指定延迟实例化特性,如下:



效果和上面一样

步骤四:指定bean依赖关系

1.新建ExampleBean1类,如下:


2.修改applicationcontext.xml文件,将ExampleBean依赖ExampleBean1,代码如下:

<bean id="examplebean" class="org.fwq.dao.ExampleBean"depends-on="bean1"/>
<bean id="bean1" class="org.fwq.dao.ExampleBean1"/>

3.运行testExampleBean方法,控制台输出如下:



从图可以看出,由于ExampleBean依赖于ExampleBean1,因此在创建ExampleBean的同时,也创建了
ExampleBean1


.问题

测试Spring支持的多种JavaBean对象创建方式:

1.用构造器来实例化的方式

利用Spring调用构造器GregorianCalendar创建Calendar实例。

2.使用静态工厂方法实例化的方式

利用Spring调用calendar的静态工厂方法getInstance()创建Calendar实例。

3.使用实例工厂方法实例化的方式

利用Spring创建GregorianCalendar 对象作为工厂,调用getTime()方法创建Data类型对象实例。


.方案

1.用构造器来实例化的方式的配置代码如下:

<bean id="calendarObj1" class="java.util.GregorianCalendar" />

bean标记中id属性calendarObj1用于定义bean名字,是程序代码中获得Spring管理bean对象的标识,这个名字不能重复,class用于指定创建对象的类GregorianCalendar,Spring会自动地调用GregorianCalendar类的默认构造器创建bean对象实例。

2.使用静态工厂方法实例化的方式的配置代码如下:

<bean id="calendarObj2" class="java.util.GregorianCalendar" 

factory-method="getInstance"></bean>


bean标记中id属性calendarObj2用于定义bean名字,是程序中获得Spring管理bean对象的标识,这个名字不能重复,class属性用于指定创建对象的工厂类Calendar,factory-method属性用于指定创建对象的静态工厂方法getInstance,Spring会自动的调用工厂类Calendar静态工厂方法getInstance创建bean对象实例。

3.使用实例工厂方法实现实例化的方式的配置代码如下:

<bean id="calendarObj3" class="java.util.GregorianCalendar"></bean>

<bean id="dataObj" factory-bean="calendarObj3" 

factory-method="getTime"></bean>

这里定义了两个bean,其中一个bean calendarObj3是用于创建dataObj对象的实例工厂。

另一个bean标记中id属性dataObj用于定义bean名字,是程序代码中获得Spring管理bean对象的标识,这个名字不能重复,factory-bean属性用于指定创建对象的工厂对象calendarObj3,前面定义的一个bean,factory-method属性用于指定创建对象的工厂方法getTime,Spring会自动的调用工厂类Calendar静态工厂方法getInstance创建对象实例。


.步骤

1.配置applicationcontext.xml,增加Bean对象创建声明

代码如下:

<!--1.用构造器来实例化的方式的配置代码-->

<bean id="calendarObj1" class="java.util.GregorianCalendar" />


<!--2.使用静态工厂方法实例化的方式配置代码-->

<bean id="calendarObj2" class="java.util.GregorianCalendar

factory-method="getInstance"></bean>


<!--3.使用实例工厂方法实例化的方式配置代码-->

<bean id="calendarObj3" class="java.util.GregorianCalendar"></bean>

<bean id="dataObj" factory-bean="calendarObj3" 

factory-method="getTime"></bean>


2.在Test1类中增加测试方法testCreateBeanObject,测试Spring创建对象的结果


先创建Spring容器对象,再调用getBean方法获得Spring创建的对象实例,并且利用输出语句测试对象是否存在。这个代码中要注意:getBean方法的参数必须是上一步骤中定义的bean标记上的id属性的值,否则会出现运行异常。


代码如下:



3.运行测试方法测试bean实例化




原创粉丝点击