使用bean工厂创建bean实例的几种方法。
一、/*实例工厂方法:实例工厂方法,即现需要创建工厂本身,在调用工厂的实例方法。
* 来返回bean实例。
* */
<!-- 通过实例工厂方法来配置bean
fanctory-bean属性,指向实例工厂方法的类
factory-mehtod:指向静态工厂方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数。
-->
<bean id="carsfactory" class="com.spring.test.beans.factory.InstanceCarFactroy"></bean>
<bean id="car2" factory-bean="carsfactory" factory-method="getCar">
<constructor-arg value="ford"></constructor-arg>
</bean>
建立配置文件如下:
<!-- 通过实例工厂方法来配置bean
fanctory-bean属性,指向实例工厂方法的类
factory-mehtod:指向静态工厂方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数。
-->
<bean id="carsfactory" class="com.spring.test.beans.factory.InstanceCarFactroy"></bean>
<bean id="car2" factory-bean="carsfactory" factory-method="getCar">
<constructor-arg value="ford"></constructor-arg>
</bean>
<!-- 通过实例工厂方法来配置bean -->
二、通过
* 静态工厂方法:直接调用某一个类的静态方法就可以返回Bean实例。
* */
public class StaticCarFactory {
private static Map<String,Car> cars=new HashMap<String,Car>();
static {
cars.put("audi", new Car("audi",300000));
cars.put("ford", new Car("ford",400000));
}
//静态工厂:直接调用某一个类的静态方法就可以 返回Bean实例
public static Car getCar(String name){
return cars.get(name);
}
}
配置文件如下
<!-- 通过静态工厂方法来配置bean。注意不是配置静态工厂方法实例。而是配置bean实例 -->
<!-- class属性,指向静态工厂方法的名字
Factory-method:指向静态工厂方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
说明:通过调用实例工厂方法创建Bean
实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户需要请求对象时,只需要简单的调用该实例方法
而不需要关心对象的创建细节,
要声明通过实例工厂方法创建的Bean.
在bean的factory-method属性里指定拥有该工厂方法的Bean。
在factory-method属性里指定该工厂方法的名称。
使用construtor-arg元素为工厂方法传递方法参数。
-->
<bean id="car1" class="com.spring.test.beans.factory.StaticCarFactory" factory-method="getCar">
<constructor-arg value="audi"></constructor-arg>
</bean>
三、通过BeanFactory类来配置bean实例,注意一定要实现
FactoryBean<T>接口
import org.springframework.beans.factory.FactoryBean;
import com.spring.test.beans.factory.Car;
/*
*
*
* */
public class CarFactoryBean implements FactoryBean<Car>{
private String brand;
//返回bean對象
@Override
public Car getObject() throws Exception {
// TODO Auto-generated method stub
return new Car(brand,5000);
//在该方法中可以返回一个新的Car具体对象
}
//返回bean類型类型
@Override
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return null;
}
//返回是否是单实例
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return false;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}