org.springframework.beans.factory.FactoryBean接口

org.springframework.beans.factory.FactoryBean接口

  • 一般情况,Spring通过反射机制利用Beanclass属性指定实现类来实例化Bean
  • 但是某些情况下,实例化Bean的过程比较复杂,如果按照传统的方式,需要在<bean>中提供大量的配置信息,配置方式的灵活性受限,这时采用编码代替配置文件会更简单。
  • 通过FactoryBean工厂类接口,用户可以定制实例化Bean的逻辑。
  • <bean class>属性配置的实现类是FactoryBean时,通过getBean()方法返回的不是FactoryBean本身,而是FactoryBean#getObject()方法所返回的对象,相当于getObject()代理了getBean()方法
1
2
3
4
5
6
7
public interface FactoryBean<T>{
T getObject() throws Exception;

Class<?> getObjectType();

boolean isSingleton();
}

方法

  1. T getObject()返回由FactoryBean创建的Bean实例。如果isSingleton()返回true,则该实例会加入单例缓存中

  2. Class<?> getObjectType()返回Bean类型

  3. boolean isSingleton()作用域为singleton还是prototype


Demo

假设有如下Bean

1
2
3
4
5
6
7
@Bean
public class Car{
private int maxSpeed;
private String brand;
private double price;
//getter & setter
}
  1. 如果采用XML配置Car<bean>,那么Car的每个属性都需要一个<property>元素标签
  2. 但是如果使用FactoryBean,就可以通过,一次性为Car的所有属性指定配置值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class CarFactoryBean implements FactoryBean<Car>{

private String carInfo;

public Car getObject() throws Exception{
Car car = new Car();
String[] infos = carInfo.split(",");
car.setMaxSpeed(Integer.valueOf(infos[0]));
car.setBrand(infos[1]);
car.setPrice(Double.valueOf(infos[2]));
return car;
}

public Class<Car> getObjectType(){
return Car.class;
}

public boolean isSingleton(){
return false;
}

public String getCarInfo(){
return this.carInfo;
}

//接受逗号分隔符设置属性信息
//比如:
// "100,Benz,999999"
public void setCarInfo(String carInfo){
this.carInfo = carInfo;
}
}
  1. 有了CarFactoryBean后,就可以在配置文件中通过,分割的方式一次性传入属性值了,不再需要每个property都配置
1
<bean id="car" class="com.factorybean.CartFactoryBean" carInfo="100,Benz,999999" />
  1. 当调用getBean("car")时,Spring通过反射机制发现CarFactoryBean实现了FactoryBean接口,这时Spring容器就调用接口方法CarFactoryBean#getObject()方法返回
  2. 如果需要获取CarFactoryBean的实例,则需要在使用getBean(beanName)时在beanName前加&前缀,如getBean("&car")
-------------本文结束感谢您的阅读-------------

本文标题:org.springframework.beans.factory.FactoryBean接口

文章作者:DragonBaby308

发布时间:2019年10月22日 - 23:06

最后更新:2019年10月24日 - 22:36

原始链接:http://www.dragonbaby308.com/org-springframework-beans-factory-FactoryBean/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%