Spring通过工厂方法配置bean
2020-03-18 本文已影响0人
BlueSkyBlue
传统的Spring配置bean的方式是通过全类名反射的机制。还可以通过工厂方法来配置bean。
这里的工厂方法分为静态工厂方法和实例工厂方法。
静态工厂方法
直接调用某一个类的静态方法就可以返回Bean的实例。通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例。
- 首先创建bean实体类
public class Car {
public Car(){
System.out.println("Car's constructor");
}
private String brand;
public Car(String brand) {
this.brand = brand;
}
public void setBrand(String brand) {
System.out.println("Set brand.");
this.brand = brand;
}
public void init(){
System.out.println("init");
}
public void destroy(){
System.out.println("destroy");
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
'}';
}
}
- 创建静态工厂类
public class StaticCarFactory {
private static Map<String, Car> cars = new HashMap<>();
static {
cars.put("Audi", new Car("Audi"));
cars.put("BMW", new Car("BMW"));
cars.put("Benz", new Car("Benz"));
}
public static Car getCar(String name){
return cars.get(name);
}
}
- 创建配置文件
<bean
id="car1"
class="com.spring.factory.StaticCarFactory"
factory-method="getCar">
<constructor-arg value="Audi"></constructor-arg>
</bean>
参数说明:
class属性:指向静态工厂方法的全类名。
factory-method:指向静态工厂方法的名字。
cosntructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数。
- 主函数调用
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
Car car1 = (Car)ctx.getBean("car1");
System.out.println(car1);
}
实例工厂方法
需要创建工厂本身,再调用工厂的实例方法来返回bean的实例。
- 创建工厂本身
public class InstanceCarFactory {
private Map<String, Car> cars = null;
public InstanceCarFactory(){
cars = new HashMap<>();
cars.put("Audi", new Car("Audi"));
cars.put("BMW", new Car("BMW"));
cars.put("Benz", new Car("Benz"));
}
public Car getCar(String brand){
return cars.get(brand);
}
}
- 编写配置文件
<bean
id="carFactory"
class="com.spring.factory.InstanceCarFactory">
</bean>
- 通过实例工厂方法来配置bean
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="BMW"></constructor-arg>
</bean>
- 主函数调用
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
Car car2 = (Car)ctx.getBean("car2");
System.out.println(car2);
}
FactoryBean
FactoryBean是Spring为我们提供的。有时候我们需要用到IOC容器中的其它bean。此时需要使用FactoryBean配置。
示例:
创建FactoryBean
public class CarFactoryBean implements FactoryBean {
private String brand;
public void setBrand(String brand) {
this.brand = brand;
}
@Override
public Car getObject() throws Exception {
return new Car("BMW");
}
@Override
public Class<?> getObjectType() {
return Car.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
自定义的FactoryBean需要实现Spring提供的接口
- 编写配置文件
<bean id="car" class="com.spring.factorybean.CarFactoryBean">
<property name="brand" value="BMW"></property>
</bean>
参数说明:
class:指向FactoryBean的全类名。
property:配置FactoryBean的属性。
但实际返回的确是FactoryBean的getObject方法返回的实例。
- 调用主函数
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-beanfactory.xml");
Car car = (Car)ctx.getBean("car");
System.out.println(car);
}