Spring学习之三种创建对象的方式
在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象。在spring中也一样,想要使用容器中的bean,也需要实例化Bean。实例化Bean有三种方式:构造器实例化(也可以说是空参构造方式,此方式为重点,另外两种作为理解)、静态工厂方式实例化、实例工厂方式实例化。下面分别回顾三种方式:
-
构造器实例化
指的是spring容器通过Bean对应类中默认的无参构造方法来实例化Bean。下面通过案例来帮助理解。
创建一个Spring_Bean项目,创建一个constructor包,包下创建一个Bean1类。
package constructor;
public class Bean1 {
}
在constructor包下创建配置文件bean1.xml。在配置文件中定义一个id为bean1的Bean,并通过class属性指定对应的实现类为Bean1
<!-- 调用Bean1方法创建对象bean1 -->
<bean id="bean1" class="constructor.Bean1"></bean>
在Test包下创建一个测试类Demo.java,测试构造器能否实例化Bean。
package Test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import constructor.Bean1;
public class Demo {
@Test
public void fun1() {
//定义配置文件路径
String xmlPath="constructor/bean1.xml";
//ApplicationContext在加载配置文件时,对Bean进行实例化
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//从IOC中获取Bean实例
Bean1 bean =(Bean1)applicationContext.getBean("bean1");
System.out.println(bean);
}
}
spring容器ApplicationContext加载配置容器时,Spring容器会通过id为bean1的实现类Bean1中的默认无参构造方法对Bean进行实例化。执行程序后,控制台输出如下:
-
静态工厂方式实例化
该方式通过工厂里的静态方法实例化Bean。
该方式和实例工厂方式的区别是:静态工厂方式在创建Bean之前不需要实例化工厂。下面通过案例来理解:
创建一个static_factory包,包下创建一个Bean2类,同Bean1一样内容为空。再在该包下创建一个MyBean2Factory类,在MyBean2Factory中创建一个createBean的静态方法。如下:
package static_factory;
public class MyBean2Factory {
//使用自己的工厂创建Bean2实例。
//静态方法通过类名即可调用createBean()方法
public static Bean2 createBean(){
return new Bean2();
}
}
在static_factory包下创建配置文件bean2.xml。在配置文件中定义一个id为bean2的Bean,并通过class属性指定对应的实现类为MyBean2Factory.由于这种方式配置Bean 后,Spring容器不知道哪个是所需要的工厂方法,所以增加factory-method属性来告诉Spring容器,其方法名为createBean。
<!-- 调用MyBean2Factory的createBean方法创建id为bean2的对象
此处不需要实例化工厂,直接使用静态方法对Bean实例化
-->
<bean id="bean2" class="static_factory.MyBean2Factory"
factory-method="createBean"/>
在static_factory包下创建一个测试类Demo.java,测试构造器能否实例化Bean。
public class Demo {
@Test
public void fun2() {
//定义配置文件路径
String xmlPath="static_factory/bean2.xml";
//ApplicationContext在加载配置文件时,对Bean进行实例化
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//从IOC中获取Bean实例
Bean2 bean =(Bean2)applicationContext.getBean("bean2");
System.out.println(bean);
}
}
运行结果如下:
3. 实例工厂方式实例化
该方法是通过工厂里的实例方法对Bean实例化。(需要创建对象去调用方法)该方法在创建Bean之前需要实例化工厂。具体通过以下实例来理解:
创建一个instance_factory包,包下创建一个Bean3类,同Bean1一样内容为空。再在该包下创建一个MyBean3Factory类,在MyBean3Factory中创建一个createBean的实例方法。如下:
package instance_factory;
public class MyBean3Factory {
//使用创建Bean3实例。
public Bean3 createBean(){
return new Bean3();
}
}
在instance_factory包下创建配置文件bean3.xml。实例工厂方式需要在创建Bean对象之前实例化工厂,因此应该先配置工厂,然后再配置需要实例化的Bean。在id为bean3的Bean中,使用factory-bean属性指向配置的实例工厂,该属性值就是工厂Bean的id。使用factory-method属性来确定使用工厂中的createBean()方法。
<!-- 配置工厂 -->
<bean id="myBean3Factory" class="instance_factory.MyBean3Factory"></bean>
<!-- 使用factory-bean属性指向配置的实例工厂,
使用factory-method属性确定使用工厂中的哪个方法.
调用MyBean3Factory对象的createBean方法创建名为bean3的对象放入容器
-->
<bean id="bean3"
factory-bean="myBean3Factory"
factory-method="createBean"/>
在instance_factory包下创建一个测试类Demo.java,测试构造器能否实例化Bean。
public class Demo {
@Test
public void fun3() {
//定义配置文件路径
String xmlPath="instance_factory/bean3.xml";
//ApplicationContext在加载配置文件时,对Bean进行实例化
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//从IOC中获取Bean实例
Bean3 bean =(Bean3)applicationContext.getBean("bean3");
System.out.println(bean);
}
}
运行结果如下:
今天复习的内容如上。都说复习就像炒冷饭,越炒越香,在暑假的预习学习中一直卡在报错说找不到我的配置文件,今天复习的时候发现,原来是当时创建配置文件的方式不对,正确应该是New–>Spring Bean Configuration file。
再填入配置文件的文件名即可
2019.10.25 19:21