Spring入门学习(工厂方法配置Bean) 第十节

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

Spring入门学习(工厂方法配置Bean)

配置Bean的形式

  1. 基于XML文件的方式
  2. 基于注解的方式

Bean的配置方式

  1. 通过全类名(反射)
  2. 通过工厂方法(静态工厂方法和实例工厂方法)
  3. FactoryBean

静态工厂方法

静态工厂方法创建Bean是将对象的创建过程封装到静态方法中,客户端需要是只需要简单的调用就行,而不需要关心创建对象的细节
  1. 需要在Bean的class属性中指定拥有该工厂方法的类,同时再factory-method属性中指定工厂方法的名称,使用<constructor-arg>元素设置传入的参数。
  2. 创建一个静态工厂类StaticCarFactory.javaCar.java
    	/**
    	 * 静态工厂方法:直接调用某一个类的静态方法就可以返回bean的实例
    	 * @author Stark
    	 *
    	 */
    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;
    	}
    	
    }
    
  3. 创建一个beans-factory.xml配置文件
    <!-- 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例 -->
    <!-- 
    	class属性:指向静态工厂方法的全类名 
    	factory-method: 指向静态工厂方法的名字
    	constructor-arg: 如果工厂方法需要传入参数,则使用constructor-arg 来配置参数
    -->
    <bean id="car1" class="com.fafa.spring.beans.factory.StaticCarFactory"
    	factory-method="getCar">
    	<constructor-arg value="audi"></constructor-arg>
    </bean>
    
  4. 创建一个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]
    显而易见该方式是从静态方法中获取的值

实例工厂方法

实例工厂方法是将对象的创建过程封装到另一个对象实例的方法里,客户端需要时可直接调用
  1. 先创建一个实例工厂类InstanceCarFactory.java
    /**
     * 实例工厂方法:实例工厂的方法,即现需要创建工厂的本身,再调用工厂的实例方法来返回bean的实例
     * @author Stark
     *
     */
    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);
    	}
    }
    
  2. 再在xml配置文件中配置工厂实例
    <!-- 配置工厂的实例 -->
    <bean id="carFactory" class="com.fafa.spring.beans.factory.InstanceCarFactory"></bean>
    
  3. 创建一个bean,使用factory-bean属性来指向工厂实例bean,factory-method指向工厂方法的名称,constructor-arg传入工厂方法的参数(可选)
    	<!-- 通过实例工厂的方法来配置bean -->
    	<!-- 
    		factory-bean: 指向实例工厂方法的bean
    		factory-method: 指向实例工厂方法的名字
    		constructor-arg: 如果工厂方法需要传入参数,则使用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在指向carFactorybean的时候直接调用getCar方法获取对应的car。

猜你喜欢

转载自blog.csdn.net/u011171125/article/details/85715123
今日推荐