实例工厂方式实例化
还有一种实例化Bean的方式就是采用实例工厂。此种方式的工厂类中,不再使用静态方法创建Bean实例,而是采用直接创建Bean实例的方式。同时,在配置文件中,需要实例化的Bean也不是通过class属性直接指向的实例化类,而是通过factory-bean属性指向配置的实例工厂,然后使用factory-method属性确定使用工厂中的哪个方法。下面通过一个案例来演示实例工厂方式的使用。
(1)在chapter02项目的src目录下,创建一个com.itheima.instance.factory包,在该包中创建Bean3类,该类与Bean1一样,不需添加任何方法。
(2)在com.itheima.instance.factory包中,创建工厂类MyBean3Factory,在类中使用默认无参构造方法输出“bean3工厂实例化中”语句,并使用createBean()方法来创建Bean3对象,如文件1所示。
文件1 MyBean3Factory.java
1 package com.itheima.instance.factory;
2 public class MyBean3Factory {
3 public MyBean3Factory() {
4 System.out.println("bean3工厂实例化中");
5 }
6 //创建Bean3实例的方法
7 public Bean3 createBean(){
8 return new Bean3();
9 }
10 }
(3)在com.itheima.instance.factory包中,创建Spring配置文件beans3.xml,设置相关配置后,如文件2所示。
文件2 beans3.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans
5 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
6 <!-- 配置工厂 -->
7 <bean id="myBean3Factory"
8 class="com.itheima.instance.factory.MyBean3Factory" />
9 <!-- 使用factory-bean属性指向配置的实例工厂,
10 使用factory-method属性确定使用工厂中的哪个方法-->
11 <bean id="bean3" factory-bean="myBean3Factory"
12 factory-method="createBean" />
13 </beans>
在上述配置文件中,首先配置了一个工厂Bean,然后配置了需要实例化的Bean。在id为bean3的Bean中,使用factory-bean属性指向配置的实例工厂,该属性值就是工厂Bean的id。使用factory-method属性来确定使用工厂中的createBean()方法。
(4)在com.itheima.instance.factory的包中,创建测试类InstanceTest3,来测试实例工厂方式能否实例化Bean,编辑后如文件3所示。
文件3 InstanceTest3.java
1 package com.itheima.instance.factory;
2 import org.springframework.context.ApplicationContext;
3 import
4 org.springframework.context.support.ClassPathXmlApplicationContext;
5 public class InstanceTest3 {
6 public static void main(String[] args) {
7 // 指定配置文件路径
8 String xmlPath = "com/itheima/instance/factory/beans3.xml";
9 // ApplicationContext在加载配置文件时,对Bean进行实例化
10 ApplicationContext applicationContext =
11 new ClassPathXmlApplicationContext(xmlPath);
12 System.out.println(applicationContext.getBean("bean3"));
13 }
14 }
执行程序后,控制台的输出结果如图1所示。
图1 运行结果
从图1可以看到,使用实例工厂的方式,同样成功实例化了Bean3。