Spring入门学习(通过FactoryBean配置Bean) 第十一节

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011171125/article/details/85717617

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

猜你喜欢

转载自blog.csdn.net/u011171125/article/details/85717617