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 beangetObjectType(): Xác định kiểu của bean được tạo bởi FactoryBeanisSingleton(): 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.