之前笔记一实践的是全类名(反射)的方式进行bean的配置,现在我们实践使用工厂的方法进行bean的配置。
在使用工厂方法配置bean是有两种方式:静态工厂方法和实例工厂方法。
- 静态工厂方法
也就是通过工厂类直接调用获取实例的方法去获取bean的实例,那么工厂类是如何实现bean的实例和初始化呢,我们在创建工厂类是,可以在类的静态代码块中进行bean的实例加初始化,并提供获取bean的方法;具体代码实现如下:
创建Car类:
public class Car {
private String brand;//品牌
private double price;//价钱
public Car() {
System.out.println("constructor()......");
}
public Car(String brand, double price) {
this.brand = brand;
this.price = price;
}
public void init() {
System.out.println("init()......");
}
public void destory() {
System.out.println("destory()......");
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
System.out.println("setBrand()......");
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 +
'}';
}
}
静态工厂代码:
/**
* 工厂静态方法配置bean
*/
public class StaticCarFactory {
private static Map<String, Car> cars=null;
//初始化对象
static {
cars=new HashMap<>();
cars.put("Audi",new Car("Audi",30000));
cars.put("Ford",new Car("Ford",20000));
}
//获取bean实例的方法
public static Car getCar(String bread){
return cars.get(bread);
}
}
在xml配置文件中进行静态工厂的配置
<!--静态方法实现bean的配置-->
<!--factory-method指向静态工厂方法的名称-->
<!--constructor-arg 涉及到获取实例方法传参的问题,设置方法的形参-->
<bean id="staticfactory" class="com.example.demo.factory.StaticCarFactory" factory-method="getCar">
<constructor-arg value="Audi"></constructor-arg>
</bean>
根据配置文件可以看出通过静态工厂实例去调用工厂方法去获取bean的实例对象,具体配置涉及到的属性如下:
- id 定义静态工厂的名称
- class 静态工厂所对应的全路径
- factory-method 静态工厂获取bean实例的方法
- constructor-arg 设置调用静态工厂获取bean方法是需要用到的参数
测试配置:
public class FactoryMain {
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean-factory.xml");
//静态工厂配置
Car staticfactoryCar= (Car) ctx.getBean("staticfactory");
System.out.println(staticfactoryCar);
}
}
运行代码结果:
Car{brand='Audi', price=30000.0}
- 实例工厂方法
实例工厂
/**
* 实例工厂配置bean
*/
public class InstanceCarFactory {
private Map<String, Car> cars = null;
//通过无参构造方法初始化
public InstanceCarFactory() {
cars = new HashMap<>();
cars.put("Audi", new Car("Audi", 30000));
cars.put("Ford", new Car("Ford", 20000));
}
//获取bean的方法
public Car getCar(String bread) {
return cars.get(bread);
}
}
xml配置文件
<!--配置工厂实例-->
<bean id="instancefactory" class="com.example.demo.factory.InstanceCarFactory">
</bean>
<!--factory-bean 指向实例工厂方法的bean-->
<!--factory-method指向是实例工厂方法的名称-->
<bean id="carinstance" factory-bean="instancefactory" factory-method="getCar">
<constructor-arg value="Audi"></constructor-arg>
</bean>
涉及到的属性和静态配置的都一样,唯一区别就是actory-bean属性,实例工厂配置也就是先获取实例工厂的对象实例,这是在获取实例工厂是调用了InstanceCarFactory()构造方法,在构造方法中初始化了Cars,与此同时可以调用实例工厂方法去获取配置bean的具体实例信息。
测试代码:
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean-factory.xml");
//实例工厂配置
Car instanceCar= (Car) ctx.getBean("carinstance");
System.out.println(instanceCar);
}
测试结果:
Car{brand='Audi', price=30000.0}
总结:对于工厂配置bean的不论是针对静态的方式还是实例的方式,都是在工厂中将bean实例化然后放置在ioc容器中,通过工厂获取实例的方法去获取!只是在实例bean的方式上是有所差异的!