FactoryBean
理论
Spring通过反射利用bean的class属性实例化bean。在某些情况下,在中需要大量的配置信息,采用编码的方式(FactoryBean可以改善)
package org.springframework.beans.factory;
import org.springframework.lang.Nullable;
public interface FactoryBean<T> {
String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
//返回由FactoryBean创建的bean
@Nullable
T getObject() throws Exception;
//返回FactoryBean创建的bean的作用域是singleton还是prototype
@Nullable
Class<?> getObjectType();
default boolean isSingleton() {
return true;
}
}
当配置文件中的bean的class属性的实现类是FactoryBean时,通过getBean方法返回的是FactoryBean#getObject()返回的对象,而不是FactoryBean本身,即FactoryBean#getObject()代理了getBean方法
实战
public class Car {
private int maxSpeed;
private String brand;
private double price;
//get and set methods;
}
如果用传统的方式,配置Car的bean时,其每个field对应一个元素标签,这是比较痛苦的;
如果用FactoryBean,创建如下一个类:
package com.example.test.springboot.factorybean;
import org.springframework.beans.factory.FactoryBean;
/**
* @program: springboot
* @description: demo
* @author: Raymondlam1
* @create: 2023-03-26 21:08
**/
public class CarFactoryBean implements FactoryBean<Car> {
private String carInfo;
@Override
public Car getObject() throws Exception {
Car car = new Car();
String[] infos = carInfo.split(",");
car.setBrand(infos[0]);
car.setMaxSpeed(Integer.valueOf(infos[1]));
car.setPrice(Double.valueOf(infos[2]));
return car;
}
@Override
public Class<?> getObjectType() {
return Car.class;
}
@Override
public boolean isSingleton() {
return false;
}
public String getCarInfo(){
return this.carInfo;
}
public void setCarInfo(String carInfo){
this.carInfo = carInfo;
}
}
则配置文件如下,简化了原始的信息
<bean id="car" class="com.example.test.springboot.factorybean.CarFactoryBean" carInfo="超级跑车", 400, 2000"/>
如果希望获取CarFactoryBean的实例,需要在getBean(beanName)方法的参数显示加上“&”前缀,例如getBean(“&car”)
参考
《Spring源码深度解析》