Spring基础16——使用FactoryBean来创建

1.配置bean的方式

配置bean有三种方式:通过全类名(class反射)、通过工厂方法(静态工厂&实例工厂)、通过FactoryBean。前面我们已经一起学习过全类名方式和工厂方法方式,下面通过这篇文章来学习一下FactroyBean.

2.FactoryBean配置bean

FactoryBean是Spring给我们提供的一个接口,我们来看一下这个接口的源码:

 1 public interface FactoryBean<T> {
 2     @Nullable
 3     T getObject() throws Exception;
 4 
 5     @Nullable
 6     Class<?> getObjectType();
 7 
 8     default boolean isSingleton() {
 9         return true;
10     }
11 }

这个接口中为我们提供了三个方法:

getObject():返回bean本身
getObjectType():返回FactoryBean创建Bean的类型。 
isSingleton():返回bean是否是单例的
我们有全类名配置,也有工厂方法配置,为什么我们还要用这种FactoryBean来配置Bean呢?因为我们在配置一个bean的时候需要用到另一个bean的时候,使用FactoryBean在合适不过了
下面来具体操作一下:

首先我们创建一个Car的FactoryBean去实现FactoryBean接口:
 1 public class CarFactoryBean implements FactoryBean {
 2     private String brand;
 3 
 4     public void setBrand(String brand) {
 5         this.brand = brand;
 6     }
 7 
 8     @Nullable
 9     public Object getObject() throws Exception {
10         return new Car("BMW", 5000000);
11     }
12 
13     @Nullable
14     public Class<?> getObjectType() {
15         return Car.class;
16     }
17 
18     public boolean isSingleton() {
19         return true;
20     }
21 }

Spring配置文件:

1 <!--通过factorybean来配置bean的实例,通过class来指向factorybean的全类名,property指的factory的属性-->
2 <!--,但实际返回的的是,getObject方法返回的实例。-->
3 <!--我们在配置bean的时候经常需要用的ioc容器里的其他bean,在factorybean中处理你传入的其他bean以达到目的-->
4 <bean id="car1" class="com.wzy.factorybean.CarFactoryBean">
5     <property name="brand" value="audi"/>
6 </bean>

编写Main测试类:

1 public class Main {
2     public static void main(String[] args) {
3         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml");
4 
5         Car car1 = (Car) ctx.getBean("car1");
6 
7         System.out.println(car1);
8     }
9 }

输出结果:

3.FactoryBean总结

通过Factorybean来配置bean的实例,通过class来指向factorybean的全类名,property指的factory的属性,我们在配置bean的时候经常需要用的ioc容器里的其他bean,在factorybean中处理你传入的其他bean以达到目的。但实际返回的的是,getObject方法返回的实例

 




posted @ 2019-05-10 11:08  风云独舞  阅读(646)  评论(0编辑  收藏  举报