spring中bean的新配置方式--工厂方法配置bean

来源:互联网 发布:color for mac 编辑:程序博客网 时间:2024/04/27 14:16

配置bean有三种方式:通过全类名反射,通过工厂方法(静态工厂方法和实例工厂)和FactoryBeanm,今天要讲解的是第二种方式

一、静态工厂方法

注意事项,这里是用传参数的方式,因此只能传一个参数如果传了两个就错了;先看正确代码
StaticCarFactory.java

package com.atguigu.spring.beans.factory;import java.util.HashMap;import java.util.Map;/* * 静态工厂方法,直接调用类的静态方法就可以返回bean的实例 */public class StaticCarFactory {    private static Map<String,Car>cars=new HashMap<String,Car>();    static{        cars.put("audi", new Car("audi",399999));        cars.put("ford", new Car("ford",5555555));    }    //静态工厂方法public static Car getCar(String name){    return cars.get(name);}}

beans-factory.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 通过静态方法来配置bean,注意不是配置静态方法实例,而是配置bean实例 ,下面配置的就是audi--><bean id="car1" class="com.atguigu.spring.beans.factory.StaticCarFactory" factory-method="getCar"><!--下面这段是在配置参数--><constructor-arg value="audi"></constructor-arg></bean></beans>

Car.java

package com.atguigu.spring.beans.factory;public class Car {    public Car(){        System.out.println("Car's 无参构造函数.......");    }       private String brand;    private int price;    public int getPrice() {        return price;    }    @Override    public String toString() {        return "Car [brand=" + brand + ", price=" + price + "]";    }    public void setPrice(int price) {        this.price = price;    }    public Car(String brand, int price) {        super();        this.brand = brand;        this.price = price;    }    public String getBrand() {        System.out.println("setBrand方法");        return brand;    }    public void setBrand(String brand) {        System.out.println("setBrand方法。。。。。");        this.brand = brand;    }    public void init(){        System.out.println("初始化方法。。。。");    }    public void destroy(){        System.out.println("销毁方法。。。。");    }}

以上就是静态工厂方法配置bean。

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 通过静态方法来配置bean,注意不是配置静态方法实例,而是配置bean实例 ,下面配置的就是audi--><!--   class属性:指向工厂方法的全类名;  factory-method:指向静态工厂方法的名字;  constructor-arg:如果工厂方法需要传入参数,则使用静态参数来入 --><bean id="car1" class="com.atguigu.spring.beans.factory.StaticCarFactory" factory-method="getCar"><!--下面这段是在配置参数--><constructor-arg value="audi"></constructor-arg></bean></beans>

重点是上面的配置文件。

二、实例工厂方法

beans-factory.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 通过静态方法来配置bean,注意不是配置静态方法实例,而是配置bean实例 ,下面配置的就是audi--><!--   class属性:指向工厂方法的全类名;  factory-method:指向静态工厂方法的名字;  constructor-arg:如果工厂方法需要传入参数,则使用静态参数来入 --><bean id="car1" class="com.atguigu.spring.beans.factory.StaticCarFactory" factory-method="getCar"><!--下面这段是在配置参数--><constructor-arg value="audi"></constructor-arg></bean><!-- 配置工厂实例 --><!--   factory-bean属性:指向实例工厂的bean;  factory-method:指向静态工厂方法的名字;  constructor-arg:如果工厂方法需要传入参数,则使用静态参数来入 --><bean id="carfactory" class="com.atguigu.spring.beans.factory.InstanceCarFactory"></bean><!--通过实例工厂来配置bean--><bean id="car2" factory-bean="carfactory" factory-method="getCar"><constructor-arg value="ford"></constructor-arg></bean></beans>

InstanceCarFactory.java(实例工厂对应的类,里对应获取bean的方法)

package com.atguigu.spring.beans.factory;import java.util.HashMap;import java.util.Map;//实例工厂方法,需要先创建工厂本身,然后调用工厂方法来返回bean的实例public class InstanceCarFactory {    private static Map<String,Car>cars=null;    public InstanceCarFactory(){        cars=new HashMap<String,Car>();        cars.put("audi", new Car("audi",399999));        cars.put("ford", new Car("ford",5555555));    }    public  Car getCar(String name){        return cars.get(name);}}
0 0
原创粉丝点击