配置Bean的形式
- 基于XML文件的方式
- 基于注解的方式
Bean的配置方式
- 通过全类名(反射)
- 通过工厂方法(静态工厂方法和实例工厂方法)
- FactoryBean
静态工厂方法
静态工厂方法创建Bean是将对象的创建过程封装到静态方法中,客户端需要是只需要简单的调用就行,而不需要关心创建对象的细节
- 需要在Bean的class属性中指定拥有该工厂方法的类,同时再
factory-method
属性中指定工厂方法的名称,使用<constructor-arg>
元素设置传入的参数。 - 创建一个静态工厂类
StaticCarFactory.java
和Car.java
public class StaticCarFactory {
private static Map<String, Car> cars = new HashMap<String, Car>();
static{
cars.put("audi", new Car("audi",300000));
cars.put("ford", new Car("ford",300000));
}
public static Car getCar(String name){
return cars.get(name);
}
}
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;
}
}
- 创建一个
beans-factory.xml
配置文件
<bean id="car1" class="com.fafa.spring.beans.factory.StaticCarFactory"
factory-method="getCar">
<constructor-arg value="audi"></constructor-arg>
</bean>
- 创建一个
Main
函数进行测试:public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:beans-factory.xml");
Car car1 = (Car) ctx.getBean("car1");
System.out.println(car1);
}
}
测试结果:
Car [brand=audi, price=300000.0]
显而易见该方式是从静态方法中获取的值
实例工厂方法
实例工厂方法是将对象的创建过程封装到另一个对象实例的方法里,客户端需要时可直接调用
- 先创建一个实例工厂类
InstanceCarFactory.java
public class InstanceCarFactory {
private Map<String, Car> cars = null;
public InstanceCarFactory() {
cars = new HashMap<String, Car>();
cars.put("audi", new Car("audi", 300000));
cars.put("ford", new Car("ford", 300000));
}
public Car getCar(String brand) {
return cars.get(brand);
}
}
- 再在xml配置文件中配置工厂实例
<bean id="carFactory" class="com.fafa.spring.beans.factory.InstanceCarFactory"></bean>
- 创建一个bean,使用
factory-bean
属性来指向工厂实例bean,factory-method
指向工厂方法的名称,constructor-arg
传入工厂方法的参数(可选)
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="ford"></constructor-arg>
</bean>
测试结果:
Car [brand=ford, price=300000.0]
容器初始化的时候InstanceCarFactory
被实例化了,因此car2在指向carFactory
bean的时候直接调用getCar
方法获取对应的car。