Spring实例化Bean的三种方法

实例化 Bean 有三种方式,分别是构造器实例化、静态工厂方式实例化和实例工厂方式实例化。本节将针对这三种方式分别进行讲解。

构造器实例化构造器实例化是指 Spring 容器通过 Bean 对应的类中默认的构造函数实例化 Bean。下面通过案例演示如何使用构造器实例化 Bean。

1. 创建项目并导入 JAR 包

在 MyEclipse 中创建一个名称为 springDemo02 的 Web 项目,然后将 Spring 支持和依赖的 JAR 包复制到项目的 lib 目录中,并发布到类路径下。

2. 创建实体类

在项目的 src 目录下创建一个名为 com.mengma.instance.constructor 的包,在该包下创建一个实体类 Person1,如下所示。

1package com.mengma.instance.constructor; 2public class Person1 { 3}

3. 创建 Spring 配置文件

在 com.mengma.instance.constructor 包下创建 Spring 的配置文件 applicationContext.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" xmlns:p="http://www.springframework.org/schema/p" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 6 <bean id="person1" class="com.mengma.instance.constructor.Person1" /> 7</beans>

在上述配置中,定义了一个 id 为 person1 的 Bean,其中 class 属性指定了其对应的类为 Person1。

4. 创建测试类

在 com.mengma.instance.constructor 包下创建一个名为 InstanceTest1 的测试类,编辑后如下所示。

1package com.mengma.instance.constructor; 2 3import org.junit.Test; 4import org.springframework.context.ApplicationContext; 5import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7public class InstanceTest1 { 8 @Test 9 public void test() { 10 // 定义Spring配置文件的路径 11 String xmlPath = "com/mengma/instance/constructor/ApplicationContext.xml"; 12 // 初始化Spring容器,加载配置文件,并对bean进行实例化 13 ApplicationContext applicationContext = new ClassPathXmlApplicationContext( 14 xmlPath); 15 // 通过容器获取id为person1的实例 16 System.out.println(applicationContext.getBean("person1")); 17 } 18}

上述文件中,首先在 test() 方法中定义了 Spring 配置文件的路径,然后 Spring 容器会加载配置文件。在加载的同时,Spring 容器会通过实现类 Person1 中默认的无参构造函数对 Bean 进行实例化。

5. 运行程序并查看结果

使用 JUnit 测试运行 test() 方法,运行成功后,控制台的输出结果如图 1 所示。

图 1  输出结果

从图 1 的输出结果中可以看出,Spring 容器已经成功对 Bean 进行了实例化,并输出了结果。

注意:为了方便读者的学习,本节中的所有配置文件和 Java 文件都根据知识点放置在同一个包中。在实际开发中,为了方便管理和维护,建议将这些文件根据类别放置在不同目录中。

静态工厂方式实例化

在 Spring 中,也可以使用静态工厂的方式实例化 Bean。此种方式需要提供一个静态工厂方法创建 Bean 的实例。下面通过案例演示如何使用静态工厂方式实例化 Bean。

1. 创建实体类

在项目的 src 目录下创建一个名为 com.mengma.instance.static_factory 的包,并在该包下创建一个实体类 Person2,该类与 Person1 相同,不需要添加任何成员。

2. 创建静态工厂类

在 com.mengma.instance.static_factory 包下创建一个名为 MyBeanFactory 的类,并在该类中创建一个名为 createBean() 的静态方法,用于创建 Bean 的实例,如下所示。

1package com.mengma.instance.static_factory; 2 3public class MyBeanFactory { 4 // 创建Bean实例的静态工厂方法 5 public static Person2 createBean() { 6 return new Person2(); 7 } 8}

3. 创建 Spring 配置文件

在 com.mengma.instance.static_factory 包下创建 Spring 的配置文件 applicationContext.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" xmlns:p="http://www.springframework.org/schema/p" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 6 <bean id="person2" class="com.mengma.instance.static_factory.MyBeanFactory" 7 factory-method="createBean" /> 8</beans>

上述代码中,定义了一个 id 为 person2 的 Bean,其中 class 属性指定了其对应的工厂实现类为 MyBeanFactory,而 factory-method 属性用于告诉 Spring 容器调用工厂类中的 createBean() 方法获取 Bean 的实例。

4. 创建测试类

在 com.mengma.instance.static_factory 包下创建一个名为 InstanceTest2 的测试类,编辑后如下所示。

1package com.mengma.instance.static_factory; 2 3import org.junit.Test; 4import org.springframework.context.ApplicationContext; 5import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7public class InstanceTest2 { 8 @Test 9 public void test() { 10 // 定义Spring配置文件的路径 11 String xmlPath = "com/mengma/instance/static_factory/applicationContext.xml"; // 初始化Spring容器,加载配置文件,并对bean进行实例化 12 ApplicationContext applicationContext = new ClassPathXmlApplicationContext( 13 xmlPath); 14 // 通过容器获取id为person2实例 15 System.out.println(applicationContext.getBean("person2")); 16 } 17}

5. 运行程序并查看结果

使用 JUnit 测试运行 test() 方法,运行成功后,控制台的输出结果如图 2 所示。

从图 2 的输出结果中可以看出,使用静态工厂的方式也成功对 Bean 进行了实例化。

图 2  输出结果

实例工厂方式实例化

在 Spring 中,还有一种实例化 Bean 的方式就是采用实例工厂。在这种方式中,工厂类不再使用静态方法创建 Bean 的实例,而是直接在成员方法中创建 Bean 的实例。

同时,在配置文件中,需要实例化的 Bean 也不是通过 class 属性直接指向其实例化的类,而是通过 factory-bean 属性配置一个实例工厂,然后使用 factory-method 属性确定使用工厂中的哪个方法。下面通过案例演示实例工厂方式的使用。

1. 创建实体类

在项目的 src 目录下创建一个名为 com.mengma.instance.factory 的包,在该包下创建一个 Person3 类,该类与 Person1 类相同,不需要添加任何成员。

2. 创建实例工厂类

在 com.mengma.instance.factory 包下创建一个名为 MyBeanFactory 的类,编辑后如下所示。

1package com.mengma.instance.factory; 2 3public class MyBeanFactory { 4 public MyBeanFactory() { 5 System.out.println("person3工厂实例化中"); 6 } 7 8 // 创建Bean的方法 9 public Person3 createBean() { 10 return new Person3(); 11 } 12}

上述代码中,使用默认无参的构造方法输出 person3 工厂实例化中语句,使用 createBean 成员方法创建 Bean 的实例。

3. 创建 Spring 配置文件

在 com.mengma.instance.factory 包下创建 Spring 的配置文件 applicationContext.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" xmlns:p="http://www.springframework.org/schema/p" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 6 <!-- 配置实例工厂 --> 7 <bean id="myBeanFactory" class="com.mengma.instance.factory.MyBeanFactory" /> 8 <!-- factory-bean属性指定一个实例工厂,factory-method属性确定使用工厂中的哪个方法 --> 9 <bean id="person3" factory-bean="myBeanFactory" factory-method="createBean" /> 10</beans>

上述代码中,首先配置了一个实例工厂 Bean,然后配置了需要实例化的 Bean。在 id 为 person3 的 Bean 中,使用 factory-bean 属性指定一个实例工厂,该属性值就是实例工厂的 id 属性值。使用 factory-method 属性确定使用工厂中的 createBean() 方法。

4. 创建测试类

在 com.mengma.instance.factory 包下创建一个名为 InstanceTest3 的测试类,编辑后如下所示。

1package com.mengma.instance.factory; 2 3import org.junit.Test; 4import org.springframework.context.ApplicationContext; 5import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7public class InstanceTest3 { 8 @Test 9 public void test() { 10 // 定义Spring配置文件的路径 11 String xmlPath = "com/mengma/instance/factory/applicationContext.xml"; // 初始化Spring容器,加载配置文件,并对bean进行实例化 12 // 初始化Spring容器,加载配置文件,并对bean进行实例化 13 ApplicationContext applicationContext = new ClassPathXmlApplicationContext( 14 xmlPath); 15 // 通过容器获取id为person3实例 16 System.out.println(applicationContext.getBean("person3")); 17 } 18}

5. 运行程序并查看结果

使用 JUnit 测试运行 test() 方法,运行成功后,控制台的输出结果如图 3 所示。

图 3  输出结果

从图 3 的输出结果中可以看出,使用实例工厂的方式也同样对 Bean 进行了实例化。

点赞
收藏

评论区

加载中...

相关推荐

java成员变量的初始化

类变量(static变量,不需要实例化对象也可以引用)实例变量(非static变量,需要实例化对象)局部变量(类的成员函数中的变量)初始化方式:构造函数初始化变量声明时初始化代码块初始化java自动初始化(在构造函数执行之前执行) java保证所有变量被使用之前都是经过初始化的(声明并且定义过,被赋值

Spring中管理Bean依赖注入之后和Bean销毁之前的行为

    对于Singleton作用域的Bean,Spring容器将会跟踪它们的生命周期,容器知道何时实例化结束、何时销毁。Spring可以管理Bean在实例化结束之后和Bean销毁之前的行为。Bean依赖关系注入之后的行为:    Spring提供了两种方式在Bean全部属性设置成功后执行特定的行为:在Spring配置文件

MyBatis接口(Bean)与配置信息(Mapper)绑定

目的MyBatis的XML配置文件解析成JAVA类并在内存中存储,但是在程序运行时需要对应的类去调用,而相应的调用类还没有实例化,现在流行的都是使用Spring去管理需要的对象,Spring提供2种方式,分别为XML与注解。下面来分析调用类的实例化及与配置绑定。1XML方式<bean id"menuMapper" cl

Spring使用静态工厂方法创建Bean

1\.使用静态工厂方法创建Bean    使用静态工厂方法创建Bean实例时,class属性也必须指定,但此时class属性并不是指定Bean实例的实现类,而是静态工厂类。因为Spring需要知道是用哪个工厂来创建Bean实例。另外,还需要使用factorymethod来指定静态工厂方法名,Spring将调用静态工厂方法(可能包含一组参数),

Spring 源码分析之 bean 实例化原理

本次主要想写springbean的实例化相关的内容。创建springbean实例是springbean生命周期的第一阶段。bean的生命周期主要有如下几个步骤:<fontcolor'red'创建bean的实例</font给实例化出来的bean填充属性初始化bea通过IOC容器使用bean

Bean 实例化和获取

实例化BeanSpring实例化bean的时机有两个:1.IOC容器启动时候;2.真正调用的时候;如果bean声明为scopesingleton且lazyinitfalse,则容器启动时候就实例化该bean(Spring默认就是此行为)。否则在调用时候再进行实例化。IOC容器