一、Spring工厂类介绍
如图,这是Spring内部完整的工厂类继承关系图,其中有四个类需要了解:
- BeanFactory 这个接口已经被淘汰,不被推荐使用。这是旧版的Spring提供的工厂接口,功能并没有完善,碍于当时硬件条件,内存资源不足,所以BeanFactory 使用延时加载的模式,对象只有在被使用时才会被创建。
- ApplicationContext 这个是现版本Spring使用的工厂接口,继承于BeanFactory ,有着比BeanFactory 更丰富的功能,如国际化等,且重要的是,ApplicationContext 创建bean的时机与BeanFactory 不一样,ApplicationContext 在程序启动时就会加载配置文件,创建其中所有单例模式的对象(Spring默认创建的对象就是单例)。
- ClassPathXmlApplication 这是ApplicationContext 的一个实现,会加载类路径下的Spring配置文件。
- FileSystemXmlApplication 这是ApplicationContext 的另一个实现,会加载本地文件系统给定路径下的Spring配置文件。
二、SpringBean的三种实例化
Spring对于Bean的管理有两种方式:注解和xml配置文件,现在以xml方式演示在Spring中Bean的三种实例化方式。
1. 使用构造器实例化Bean
- Bean代码
public class Bean1 { public Bean1(){ System.out.println("通过无参构造器实例化Bean1"); } }
- Spring配置文件配置
<!-- 配置通过无参构造实例化Bean--> <bean id="bean1" class="com.spring.demo1.Bean1"/>
- 测试代码
public class test { @Test public void testBean1(){ ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); Bean1 bean1 = (Bean1)ac.getBean("bean1"); } }
- 测试结果
2. 使用静态工厂实例化Bean
- Bean代码
public class Bean2 { public Bean2(){ System.out.println("bean2已经被实例化"); } }
- 静态工厂代码
public class Bean2Factory { public static Bean2 getBean2(){ System.out.println("静态工厂方法已经被调用"); return new Bean2(); } }
- Spring配置文件配置
<!-- 配置通过静态工厂实例化Bean--> <bean id="bean2" class="com.spring.demo1.Bean2Factory" factory-method="getBean2"/>
- 测试代码
@Test public void testBean2(){ ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); Bean2 bean2 = (Bean2)ac.getBean("bean2"); }
- 测试结果
3.使用实例工厂实例化Bean
- Bean代码
public class Bean3 { public Bean3(){ System.out.println("Bean3已经被实例化"); } }
- 实例工厂代码
public class Bean3Factory { public Bean3 getBea3(){ System.out.println("实例工厂的方法被调用"); return new Bean3(); } }
- Spring配置文件配置
<!-- 配置通过实例工厂实例化Bean--> <bean id="bean3Factory" class="com.spring.demo1.Bean3Factory"/> <bean id="bean3" factory-bean="bean3Factory" factory-method="getBea3"/>
- 测试代码
@Test public void testBean3(){ ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); Bean3 bean3 = (Bean3)ac.getBean("bean3"); }
- 测试结果
第三种方法我们发现,Bean3的创建依赖于工厂的创建,但是我们在测试工程中并不需要手动实例化工厂,因为Spring已经帮我们实例化了,这也是把Spring IOC中的一个重要功能,Spring会依据Bean与Bean之间的依赖关系自动为我们创建好所需的Bean。
三、总结
通过了解Spring工厂类的结构,可以知道Spring现在已经不再采用延时加载的方式创建JavaBean了,不采用延时加载,使得Spring具有更高的响应。在Spring三种实例化Bean的方式中以第一种方式使用得最多,可以发现,当我们创建的Bean需要依赖其他Bean的生成时如果正确配置了关系,那么Spring会将所依赖的Bean创建好,这也是IOC很重要的功能之一。感谢您的阅读,如有错请不吝赐教!