上篇文章写了一些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>
这篇博客就写到这,以后会接着完善。