版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011171125/article/details/85717617
Spring入门学习(通过FactoryBean配置Bean)
Spring中有两种类型的Bean
- 普通的Bean和工厂Bean,工厂Bean返回的对象不是指类的一个实例,它返回的是该工厂bean的
getObject
方法所返回的对象。 - 创建一个
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; } }
- 创建一个
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; } }
- 创建一个
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>
- 创建测试类:
测试结果: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