日拱一卒:FactoryBean

文章介绍了Spring中的FactoryBean接口如何用于改进bean的实例化过程,特别是当需要大量配置信息时。FactoryBean可以通过getObject()方法返回一个对象,而getBean方法会代理这个过程。通过一个CarFactoryBean的例子,展示了如何减少XML配置文件中的复杂性,将多个属性合并到一个字段。要获取FactoryBean本身,需在bean名称前加&。
摘要由CSDN通过智能技术生成

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源码深度解析》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值