Spring中Bean的配置方式

上篇文章写了一些Spring中Bean的配置方式,这篇是对上篇的补充,主要讲通过外部属性文件配置bean,使用工厂配置bean

使用外部属性文件配置 bean

Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量.
Spring 还允许在属性文件中使用 ${propName},以实现属性之间的相互引用。

<!-- 不使用外部文件配置 c3p0 数据库 连接池-->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="xxx"/>
        <property name="password" value="xxxxx"/>
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
    </bean>
    
    <!-- 使用外部文件配置 c3p0 数据库 连接池,首先,先创建一个db.propeties的文件 -->
		user=root
		password=xxx
		driverClass=com.mysql.jdbc.Driver
		url=jdbc:mysql://localhost:3306/test
		
	<!-- 在配置文件中配置 ,首先,注册 PropertyPlaceholderConfigurer 引入外部文件-->
	  <context:property-placeholder location="classpath:db.properties"/> 
	
	  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${user}"/>
        <property name="password" value="${password}"/>
        <property name="driverClass" value="${driverClass}"/>
        <property name="jdbcUrl" value="${url}"/>
   	  </bean>

使用工厂配置Bean,包括静态工厂,实例工厂,和BeanFactory三种方式

  • 使用静态工厂配置 Bean
    创建一个 Car 类
public class Car {
    private String brand;
    private Double price;
    public Car(){}
    public Car(String brand, double price){
        this.brand = brand;
        this.price = 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 +
                '}';
    }
}

创建car的静态工厂

public class StaticFactory {
    static Map<String, Car> map = new HashMap<>();

    static{
        map.put("宝马", new Car("宝马", 300000));
        map.put("奔驰", new Car("奔驰", 400000));
    }
    public static Car getCar(String name){
        Car car = map.get(name);
        return car;
    }
}

在xml中配置bean

    <!--
	使用静态工厂配置bean
	class: 指定拥有该工厂的方法的类
	factory-method:指定工厂方法的名称
	constructor-arg:给指定的工厂方法传递参数
	-->
   <bean id="car1" class="it.hu.demo3.StaticFactory" factory-method="getCar">
        <constructor-arg value="宝马"/>
    </bean>
  • 通过实例工厂的方式配置Bean
    1、创建实例工厂
public class InterfaceFactory {
    Map<String, Car> map = null;

    public InterfaceFactory(){
        map = new HashMap<>();
        map.put("宝马",new Car("宝马", 400000));
        map.put("上海大众",new Car("上海大众", 300000));
    }
    public Car getCar(String name){
        return map.get(name);
    }
}

2、在 xml 中配置bean

	<!-- 首先,先配置工厂方法所在的bean,class指向实例的工厂方法 -->
 	<bean id="instance" class="it.hu.demo3.InterfaceFactory"></bean>
	
	<!--  
		factory-bean:指定拥有该工厂方法的 Bean
		factory-method:指定该工厂方法的名称
		construtor-arg:为工厂方法传递参数
	 -->
    <bean id="car2" class="it.hu.demo3.Car" factory-bean="instance" factory-method="getCar">
        <constructor-arg value="上海大众"></constructor-arg>
    </bean>
  • 使用 BeanFactory 配置bean
    使用BeanFactory配置Bean需要创建一个类实现 Beanfactory 接口
public class CarFactoryBean implements FactoryBean<Car> {

    @Override
    // 返回的实例
    public Car getObject() throws Exception {
        Car car = new Car("baoma", 300000);
        return car;
    }

    @Override
    // 返回的实例的类型
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    // 返回的实例是否是一个单例
    public boolean isSingleton() {
        return false;
    }
}

在xml中的配置很简单

<!-- class 指向 BeanFactory 的实现类  -->
<bean id="car3" class="it.hu.demo3.CarFactoryBean"></bean>

这篇博客就写到这,以后会接着完善。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值