Tạo Bean trong Spring với FactoryBean

Các phương pháp cấu hình bean

Có ba cách chính để cấu hình bean trong Spring: sử dụng tên lớp đầy đủ (reflection), phương thức factory (factory tĩnh và factory instance), và FactoryBean. Bài viết này tập trung vào cách sử dụng FactoryBean.

Triển khai FactoryBean

FactoryBean là một interface trong Spring Framework. Dưới đây là mã nguồn của interface này:

public interface FactoryBean<T> {
    @Nullable
    T getObject() throws Exception;

    @Nullable
    Class<?> getObjectType();

    default boolean isSingleton() {
        return true;
    }
}

Interface cung cấp ba phương thức quan trọng:

  • getObject(): Trả về instance của bean
  • getObjectType(): Xác định kiểu của bean được tạo bởi FactoryBean
  • isSingleton(): Xác định bean có phải là singleton hay không

FactoryBean đặc biệt hữu ích khi bạn cần tạo một bean phụ thuộc vào các bean khác trong container IoC.

Ví dụ triển khai FactoryBean

Tạo một FactoryBean cho lớp Vehicle:

public class VehicleFactoryBean implements FactoryBean<Vehicle> {
    private String manufacturer;
    
    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    @Override
    public Vehicle getObject() throws Exception {
        return new Vehicle("Toyota", 250000000);
    }

    @Override
    public Class<?> getObjectType() {
        return Vehicle.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

Cấu hình Spring

<!-- Cấu hình bean sử dụng FactoryBean -->
<bean id="vehicle1" class="com.example.factorybean.VehicleFactoryBean">
    <property name="manufacturer" value="honda"/>
</bean>

Lớp kiểm thử

public class TestApplication {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("factorybean-config.xml");
        
        Vehicle vehicle = (Vehicle) context.getBean("vehicle1");
        System.out.println(vehicle.toString());
    }
}

Kết luận về FactoryBean

Khi sử dụng FactoryBean, thuộc tính class trong cấu hình trỏ đến lớp FactoryBean, trong khi các thuộc tính property được sử dụng để thiết lập các giá trị cho FactoryBean. Tuy nhiên, bean thực tế được trả về là kết quả từ phương thức getObject(). FactoryBean đặc biệt hữu ích khi bạn cần xử lý logic phức tạp hoặc phụ thuộc vào các bean khác trong quá trình tạo bean.

Thẻ: Spring Framework FactoryBean IOC Container Bean Configuration Java

Đăng vào ngày 27 tháng 9 lúc 18:18