3.2 Bean的实例化

Spring框架实例化Bean有三种方式:
1.构造方法实例化
2.静态工厂实例化
3.实例工厂实例化
其中最常用的实例方法是构造方法实例化

本次目录结构:

img

1.构造方法实例化

在Spring框架中,Spring容器可以调用Bean对应类中无参数构造方法来实例化Bean,这种方式称为构造方法实例化。

1.1创建Web项目ch3

1.2创建BeanClass类

在ch3目录下,创建instance包,并在该包中创建BeanClass类,代码如下:

BeanClass.java

package instance;

public class BeanClass {
    public String message;  
    public BeanClass() {
        message = "构造方法实例化Bean";
    }
    public BeanClass(String s) {
        message = s;
    }
}

1.3创建配置文件

在ch3的src目录下,创建Spring的配置文件applicationContext.xml,在配置文件中定义一个id为constructorInstance的Bean,代码如下:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       
http://www.springframework.org/schema/beans/spring-beans.xsd">  
    <!-- 构造方法实例化Bean 默认scope="singleleton"单例模式                  
              scope="prototype" 每次获取prototype定义的bean,都将创造新的Bean实例
    -->
    <bean id="constructorInstance" class="instance.BeanClass" />
</beans>

1.4创建测试类

在ch3的src目录下创建test包,并在该包下创建测试类TestInstance,代码如下:

TestInstance.java

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import instance.BeanClass;

public class TestInstance {

    public static void main(String[] args) {
        // 初始化Spring容器ApplicationContext,加载配置文件
        ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
        //测试构造方法实例化Bean
        BeanClass b1 = (BeanClass)appCon.getBean("constructorInstance");
        System.out.println(b1 + b1.message);
    }

}

运行结果

img

2.静态化工厂实例化

使用静态工厂实例化Bean时,要求开发者在工厂类中创建一个静态的方法来创建Bean的实例。配置Bean时,class属性指定静态工厂类,同时还需要使用factory-method属性指定工厂类中的静态方法。

2.1创建工厂类BeanStaticFactory

在instance包中,创建工厂类BeanStaticFactory,该类中有个静态方法来实例化对象,具体代码如下:

BeanStaticFactory.java

package instance;

public class BeanStaticFactory {
    private static BeanClass beanInstance = new BeanClass("调用静态工厂方法实例化Bean");
    public static BeanClass createInstance() {
        return beanInstance;
    }
}

2.2编辑配置文件

在配置文件applicationContext.xml中,添加如下配置代码:

<!-- 静态工厂方法实例化Bean,createInstance为静态工厂类BeanStaticFactory中的静态方法 -->
    <bean id="staticFactoryInstance" 
          class="instance.BeanStaticFactory" 
          factory-method="createInstance" />

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       
http://www.springframework.org/schema/beans/spring-beans.xsd">  
    <!-- 构造方法实例化Bean,默认scope="singleleton"单例模式                  
              scope="prototype" 每次获取prototype定义的bean,都将创造新的Bean实例
    -->
    <bean id="constructorInstance" class="instance.BeanClass" />
    <!-- 静态工厂方法实例化Bean,createInstance为静态工厂类BeanStaticFactory中的静态方法 -->
    <bean id="staticFactoryInstance" 
          class="instance.BeanStaticFactory" 
          factory-method="createInstance" />
</beans>

2.3添加测试代码

在测试类TestInstance中,添加如下代码:

BeanClass b2 = (BeanClass)appCon.getBean("staticFactoryInstance");
        System.out.println(b2 + b2.message);

TestInstance.java

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import instance.BeanClass;

public class TestInstance {

    public static void main(String[] args) {
        // 初始化Spring容器ApplicationContext,加载配置文件
        ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
        //测试构造方法实例化Bean
        BeanClass b1 = (BeanClass)appCon.getBean("constructorInstance");
        System.out.println(b1 + b1.message);
        
        BeanClass b2 = (BeanClass)appCon.getBean("staticFactoryInstance");
        System.out.println(b2 + b2.message);
    }

}

运行结果

img

3.实例工厂实例化

使用实例工厂实例化Bean时,要求开发者在工厂类中创建一个实例化方法来创建Bean的实例。配置Bean时,需要使用factory-bean属性指定配置的实例工厂,同时还需要factory-method属性指定实例工厂中的实例方法。

3.1创建工厂类BeanInstanceFactory

在instance包中,创建工厂类BeanInstanceFactory,该类中有个实例方法来实例化对象,具体代码如下:

BeanStaticFactory.java

package instance;

public class BeanStaticFactory {
    private static BeanClass beanInstance = new BeanClass("调用静态工厂方法实例化Bean");
    public static BeanClass createInstance() {
        return beanInstance;
    }
}

3.2编辑配置文件

在配置文件applicationContext.xml中,添加如下配置代码:

    <!-- 配置工厂 -->
    <bean id="myFactory" class="instance.BeanInstanceFactory" />
    <!-- 使用factory-bean属性指定配置工厂,使用Factory-method属性指定使用工厂中哪个方法实例化Bean -->
    <bean id="instanceFactoryInstance" 
          factory-bean="myFactory" 
          factory-method="createBeanClassInstance" />

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       
http://www.springframework.org/schema/beans/spring-beans.xsd">  
    <!-- 构造方法实例化Bean 默认scope="singleleton"单例模式                 
             scope="prototype" 每次获取prototype定义的bean,都将创造新的Bean实例
    -->
    <bean id="constructorInstance" class="instance.BeanClass" />
    <!-- 静态工厂方法实例化Bean,createInstance为静态工厂类BeanStaticFactory中的静态方法 -->
    <bean id="staticFactoryInstance" 
          class="instance.BeanStaticFactory" 
          factory-method="createInstance" />
    <!-- 配置工厂 -->
    <bean id="myFactory" class="instance.BeanInstanceFactory" />
    <!-- 使用factory-bean属性指定配置工厂,使用Factory-method属性指定使用工厂中哪个方法实例化Bean -->
    <bean id="instanceFactoryInstance" 
          factory-bean="myFactory" 
          factory-method="createBeanClassInstance" />
</beans>

3.3添加测试代码

在测试类TestInstance中,添加如下代码:

BeanClass b3 = (BeanClass)appCon.getBean("instanceFactoryInstance");
System.out.println(b3 + b3.message);

TestInstance.java

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import instance.BeanClass;

public class TestInstance {

    public static void main(String[] args) {
        // 初始化Spring容器ApplicationContext,加载配置文件
        ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
        //测试构造方法实例化Bean
        BeanClass b1 = (BeanClass)appCon.getBean("constructorInstance");
        System.out.println(b1 + b1.message);
        
        BeanClass b2 = (BeanClass)appCon.getBean("staticFactoryInstance");
        System.out.println(b2 + b2.message);

        BeanClass b3 = (BeanClass)appCon.getBean("instanceFactoryInstance");
        System.out.println(b3 + b3.message);
    }

}

运行结果

img
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容