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

配置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);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值