配置文件(resources/config/initBean.xml)
Spring IoC容器如何实例化Bean呢?传统应用程序可以通过new和反射方式进行实例化Bean。而Spring IoC容器则需要根据Bean定义里的配置元数据使用反射机制来创建Bean。在Spring IoC容器中根据Bean定义创建Bean主要有以下几种方式:
一、使用无参构造器实例化Bean
使用此种方式,class属性指定的类必须有无参构造器
initBean.xml中的定义:
<bean name="bean" class="com.pyy.Bean"/>
二、使用有参数的构造器实例化Bean
Bean.java中的定义:
package com.pyy;
public class Bean {
private String message;
public Bean() {
this.message = "Hello World!";
}
public Bean(String message) {
this.message = message;
}
public void sayHello() {
System.out.println(message);
}
}
initBean.xml中的定义:
<!--使用默认构造参数-->
<bean name="bean1" class="cn.pyy.Bean">
<!--使用有参数构造参数-->
<bean name="bean2" class="cn.pyy.Bean">
<!-- 指定构造器参数 -->
<constructor-arg index="0" value="Hello Spring!"/>
</bean>
配置完了,下面进行测试
@Test
public void testInitBeanByConstructor() {
//使用构造器
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("config/initBean.xml");
Bean bean1 = beanFactory.getBean("bean1", Bean.class);
bean1.sayHello();
Bean bean2 = beanFactory.getBean("bean2", Bean .class);
bean2.sayHello();
}
三、使用静态工厂实例化Bean
使用这种方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,spring IoC容器将调用此属性指定的方法来获取Bean,配置如下所示:
public class BeanStaticFactory {
//工厂方法
public static Bean newInstance(String message) {
//返回需要的Bean实例
return new Bean(message);
}
}
1.静态工厂类
<!-- 使用静态工厂方法 -->
<bean id="bean3" class="com.pyy.BeanStaticFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello Spring!"/>
</bean>
3.编写 测试代码
@Test
public void testInitBeanByStaticFactory() {
//使用静态工厂方法
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("config/initBean.xml");
Bean bean3 = beanFactory.getBean("bean3", Bean.class);
bean3.sayHello();
}
四、使用实例工厂实例化Bean
使用这种方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:
1.实例工厂类
public class BeanStaticFactory {
//工厂方法
public static Bean newInstance(String message) {
//返回需要的Bean实例
return new Bean(message);
}
}
2.initBean.xml中的配置
<!—1、定义实例工厂Bean -->
<bean id="beanInstanceFactory" class="com.pyy.BeanInstanceFactory"/>
<!—2、使用实例工厂Bean创建Bean -->
<bean id="bean4" factory-bean="beanInstanceFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello Spring!"></constructor-arg>
</bean>
3.编写 测试代码
@Test
public void testInitBeanByStaticFactory() {
//使用静态工厂方法
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("config/initBean.xml");
Bean bean4 = beanFactory.getBean("bean4", Bean.class);
bean4.sayHello();
}