1. 程式人生 > >Spring入門學習(通過FactoryBean配置Bean) 第十一節

Spring入門學習(通過FactoryBean配置Bean) 第十一節

Spring入門學習(通過FactoryBean配置Bean)

Spring中有兩種型別的Bean

  1. 普通的Bean和工廠Bean,工廠Bean返回的物件不是指類的一個例項,它返回的是該工廠bean的getObject方法所返回的物件。
  2. 建立一個Car.java
    public class Car {
    
    	private String brand;
    	private double price;
    
    	public String getBrand() {
    		return brand;
    	}
    
    	public
    void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Car [brand=" + brand + ", price=" + price + "]"; } public Car(){ System.out.
    println("Car's constructor...."); } public Car(String brand, double price) { super(); this.brand = brand; this.price = price; } }
  3. 建立一個CarFactoryBean.java類,實現了FactoryBean<T>的介面
    其中getObject返回bean的物件,getObjectType返回bean的型別,isSingleton表示是否是單例的
    // 自定義的factorybean需要實現FactoryBean提供的介面
    public
    class CarFactoryBean implements FactoryBean<Car> { private String brand; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } // 返回bean的物件 public Car getObject() throws Exception { return new Car("BMW", 500000); } /** * 返回bean的型別 */ public Class<?> getObjectType() { return Car.class; } public boolean isSingleton() { return true; } }
  4. 建立一個benas-beanfactory.xml配置檔案
    <!-- 
    	通過FactoryBean來配置bean的例項
    	class:指向FactoryBean的全類名
    	property:配置FactoryBean的屬性
    	但實際返回的例項卻是FactoryBean的getObject() 方法返回的例項
     -->
    <bean id="car" class="com.fafa.spring.beans.factorybean.CarFactoryBean">
    	<property name="brand" value="BMW"></property>
    </bean>
    
  5. 建立測試類:
    public class Main {
    	public static void main(String[] args) {
    		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:benas-beanfactory.xml");
    		Car car1 = (Car) ctx.getBean("car");
    		System.out.println(car1);
    		Car car2 = (Car) ctx.getBean("car");
    		// 測試是否單例
    		System.out.println(car1==car2);
    	}
    }
    
    測試結果:
    Car [brand=BMW, price=500000.0]
    true
    
    如果將CarFactoryBean.java中的isSingleton的返回改為false則兩次獲取的car就不是同一物件為false