Spring IoC容器如何实例化Bean呢?传统应用程序可以通过new和反射方式进行实例化Bean。而Spring IoC 容器则需要根据Bean定义里的配置元数据使用反射机制来创建Bean。在Spring IoC 容器中主要有以下几种创建Bean实例的方式:
- 使用构造器实例化Bean
- 使用静态工厂方式实例化Bean
- 使用实例工厂方法实例化Bean
构造器实例化
构造器实例化 Bean 是最简单的方式,Spring IoC容器既能使用默认空构造器也能使用有参数构造器两种方式创建Bean
空构造器实例化:要求java Bean必须要有构造方法
- 空构造器实例化:
<bean id="helloServiceNoWithArgs" class="com.jike.***.HelloWorldImpl" />
- 有参数构造器实例化:
<bean id="helloServiceWithArgs" class="com.jike.***.HelloWorldmpl">
<!-- 指定构造器参数,index指定位置 -->
<constructor-arg index="0" value="Hello Spring!"/>
</bean>
静态工厂实例化
使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,Spring IoC容器将调用此属性指定的方法来获取Bean
- <!--使用有参数构造参数-->
<bean id="helloServiceStaticFactory" class="com.jike.***.HelloWorldStaticFactory" factory-method="newInstance">
<!-- 指定构造器参数 -->
<constructor-arg index="0" value="Hello Static Factory!"/>
</bean>
实例工厂实例化
使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:
<!-- 1、定义实例工厂Bean -->
<bean id="beanInstanceFactory" class="com.jike.***.HelloWorldInstanceFactory" />
<!-- 2、使用实例工厂Bean创建Bean -->
<bean id=“helloWorldInstance" factory-bean="beanInstanceFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello Instance Factory!"></constructor-arg>
</bean>
实例化示例
配置文件配置见上文
基础类HelloWord.java
public interface HelloWorld {
public void sayHello();
}
基础类HelloWordImpl.java
public class HelloWorldImpl implements HelloWorld { private String message; /**
* 空构造器
*/
public HelloWorldImpl() {
this.message = "Hello World!";
} /**
* 带参构造器
*
* @param message
*/
public HelloWorldImpl(String message) {
this.message = message;
} public void sayHello() {
System.out.println(message);
} }
静态工厂实例化类HelloWorldInstanceFactory.java
public class HelloWorldStaticFactory {
/**
* 工厂方法
*
* @param message
* @return
*/
public static HelloWorld newInstance(String message) {
// 返回需要的Bean实例
return new HelloWorldImpl(message);
} }
实例工厂实例化类HelloWorldStaticFactory.java
public class HelloWorldInstanceFactory { /**
* 工厂方法
*
* @param message
* @return
*/
public HelloWorld newInstance(String message) {
// 返回需要的Bean实例
return new HelloWorldImpl(message);
} }
程序入口类Main.java
public class Main { public static void main(String[] args) {
helloWorldInstanceFactory();
} //使用无参数构造器来实例化Bean
public static void sayHelloWithNoArgs() {
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("conf/conf-instance.xml");
HelloWorld helloWorld = beanFactory.getBean("helloWorldWithNoArgs", HelloWorld.class);
helloWorld.sayHello();
}
//使用有参数构造器来实例化Bean
public static void sayHelloWithArgs() {
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("conf/conf-instance.xml");
HelloWorld helloWorld = beanFactory.getBean("helloWorldWithArgs", HelloWorld.class);
helloWorld.sayHello();
} //使用静态工厂方法来实例化Bean
public static void helloWorldStaticFactory() {
// 1、读取配置文件实例化一个IOC容器
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("conf/conf-instance.xml");
// 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
HelloWorld helloWorld
= beanFactory.getBean("helloWorldStaticFactory", HelloWorld.class);
// 3、执行业务逻辑
helloWorld.sayHello();
} //使用实例化工厂方法来实例化Bean
public static void helloWorldInstanceFactory() {
// 1、读取配置文件实例化一个IOC容器
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("conf/conf-instance.xml");
// 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现编程”
HelloWorld helloWorld
= beanFactory.getBean("helloWorldInstance", HelloWorld.class);
// 3、执行业务逻辑
helloWorld.sayHello();
}
}