在上篇总结中,我们已经对Spring容器进行了实例化,从本质上来说,BeanFactory和ApplicationContext仅仅只是一个维护Bean定义以及相关依赖关系的高级工厂接口,通过这两个接口我们可以访问Bean定义,对bean进行相关的管理,下面就来简单叙述下。
一.Bean的实例化
首先我们需要在配置文件中添加bean定义:<bean id="标示符 " class="bean类型"></bean>,接着在创建ApplicationContext容器对象后,调用getBean()方法获取Bean的实例即可。接下来就通过实例来进行Bean定义的实例化。
在Spring容器中创建Bean对象的方法主要有三种:
①用构造器来实例化
利用Spring调用构造器 GregorianCalendar 创建 Calendar实例:
1 <!-- 使用构造器进行Bean的实例化 --> 2 <!-- bean标记中id属性calendar1用于定义bean名字, 是程序代码中获得Spring管理bean对象的标识,这个名字不能重复,class 3 用于指定创建对象的类GregorianCalendar,Spring会自动的调用GregorianCalendar类的默认构造器创建bean对象实例--> 4 <bean id="calendar1" class="java.util.GregorianCalendar"></bean>
②使用静态工厂方法实例化
1 <!-- 使用静态方法实例化 --> 2 <!-- bean标记中id属性calendar2用于定义bean名字,class属性用于指定创建对象的工厂类Calendar,factory-method属性用于指定创建对 3 象的静态工厂方法getInstance,Spring会自动的调用工厂类Calendar静态工厂方法getInstance创建bean对象实例. --> 4 <bean id="calendar2" class="java.util.Calendar" factory-method="getInstance"></bean>
③使用实例工厂实例化
1 <!-- 使用实例工厂方法实例化 --> 2 <!-- 这里定义了两个bean, 其中一个bean calendar3是用于创建 dateObj 对象的实例工厂.另外一个bean标记中id属性dateObj用于定义bean名字, 3 factory-bean属性用于指定创建对象的工厂对象calendar3, 前面定义的一个bean, factory-method属性用于指定创建对象的工厂方法getTime, 4 Spring会自动的调用工厂类Calendar静态工厂方法getInstance创建bean对象实例. --> 5 <bean id="calendar3" class="java.util.GregorianCalendar"></bean> 6 <bean id="dataObj" factory-bean="calendar3" factory-method="getTime"></bean>
步骤:
1.配置ApplicationContext.xml文件,增加Bean对象创建声明:
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" 5 xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:jpa="http://www.springframework.org/schema/data/jpa" 7 xsi:schemaLocation=" 8 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 10 http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd 11 http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd 12 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 13 http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd"> 14 15 <!-- 使用构造器进行Bean的实例化 --> 16 <!-- bean标记中id属性calendar1用于定义bean名字, 是程序代码中获得Spring管理bean对象的标识,这个名字不能重复,class 17 用于指定创建对象的类GregorianCalendar,Spring会自动的调用GregorianCalendar类的默认构造器创建bean对象实例--> 18 <bean id="calendar1" class="java.util.GregorianCalendar"></bean> 19 <!-- 使用Bean的别名 --> 20 <alias name="calendar1" alias="cale"></alias> 21 22 <!-- 使用静态方法实例化 --> 23 <!-- bean标记中id属性calendar2用于定义bean名字,class属性用于指定创建对象的工厂类Calendar,factory-method属性用于指定创建对 24 象的静态工厂方法getInstance,Spring会自动的调用工厂类Calendar静态工厂方法getInstance创建bean对象实例. --> 25 <bean id="calendar2" class="java.util.Calendar" factory-method="getInstance"></bean> 26 27 <!-- 使用实例工厂方法实例化 --> 28 <!-- 这里定义了两个bean, 其中一个bean calendar3是用于创建 dateObj 对象的实例工厂.另外一个bean标记中id属性dateObj用于定义bean名字, 29 factory-bean属性用于指定创建对象的工厂对象calendar3, 前面定义的一个bean, factory-method属性用于指定创建对象的工厂方法getTime, 30 Spring会自动的调用工厂类Calendar静态工厂方法getInstance创建bean对象实例. --> 31 <bean id="calendar3" class="java.util.GregorianCalendar"></bean> 32 <bean id="dataObj" factory-bean="calendar3" factory-method="getTime"></bean> 33 34 </beans>
2.TestCase中增加测试模块test02:
1 package com.liu.Test; 2 3 import java.util.Calendar; 4 import java.util.Date; 5 import java.util.GregorianCalendar; 6 7 import org.junit.Test; 8 import org.springframework.context.ApplicationContext; 9 import org.springframework.context.support.ClassPathXmlApplicationContext; 10 11 import com.liu.Dao.EggAndRice; 12 13 public class TestCase { 14 @Test 15 public void test02(){ 16 String str = "ApplicationContext.xml"; 17 ApplicationContext ac = new ClassPathXmlApplicationContext(str); 18 //使用构造器初始化 19 Calendar gc = (Calendar) ac.getBean("calendar1"); 20 //使用Bean的别名 21 Calendar gc1 = (Calendar) ac.getBean("cale"); 22 //使用静态工厂方法初始化 23 Calendar ca = (Calendar) ac.getBean("calendar2"); 24 //使用动态工厂方法初始化 25 Date date = (Date) ac.getBean("dataObj"); 26 System.out.println(gc); 27 System.out.println(gc1); 28 System.out.println(ca); 29 System.out.println(date); 30 } 31 }
3.运行test02()方法,结果显示如下:
即利用容器进行Bean的实例化已经完成。