配置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);
}
}