Spring---bean的实例化

Posted H小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring---bean的实例化相关的知识,希望对你有一定的参考价值。

Spring IoC容器如何实例化Bean呢?传统应用程序可以通过new和反射方式进行实例化Bean。而Spring IoC 容器则需要根据Bean定义里的配置元数据使用反射机制来创建Bean。在Spring IoC 容器中主要有以下几种创建Bean实例的方式:

  • 使用构造器实例化Bean
  • 使用静态工厂方式实例化Bean
  • 使用实例工厂方法实例化Bean

构造器实例化

构造器实例化 Bean 是最简单的方式,Spring IoC容器既能使用默认空构造器也能使用有参数构造器两种方式创建Bean

空构造器实例化:要求java Bean必须要有构造方法

  • 空构造器实例化:

  <bean id="helloServiceNoWithArgs" class="com.jike.***.HelloWorldImpl" />

  • 有参数构造器实例化:

  <bean id="helloServiceWithArgs" class="com.jike.***.HelloWorldmpl">

    <!-- 指定构造器参数,index指定位置 -->

    <constructor-arg index="0" value="Hello Spring!"/> 

  </bean>

静态工厂实例化

使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,Spring IoC容器将调用此属性指定的方法来获取Bean

  • <!--使用有参数构造参数--> 

  <bean id="helloServiceStaticFactory" class="com.jike.***.HelloWorldStaticFactory" factory-method="newInstance">

    <!-- 指定构造器参数 --> 

    <constructor-arg index="0" value="Hello Static Factory!"/> 

  </bean>

实例工厂实例化

使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:

  <!-- 1、定义实例工厂Bean -->

  <bean id="beanInstanceFactory" class="com.jike.***.HelloWorldInstanceFactory" />

  <!-- 2、使用实例工厂Bean创建Bean -->

  <bean id=“helloWorldInstance" factory-bean="beanInstanceFactory" factory-method="newInstance">

    <constructor-arg index="0" value="Hello  Instance Factory!"></constructor-arg>

  </bean>

实例化示例

配置文件配置见上文

基础类HelloWord.java

public interface HelloWorld {
    public void sayHello();
}

 

基础类HelloWordImpl.java

public class HelloWorldImpl implements HelloWorld {

    private String message;

    /**
     * 空构造器
     */
    public HelloWorldImpl() {
        this.message = "Hello World!";
    }

    /**
     * 带参构造器
     * 
     * @param message
     */
    public HelloWorldImpl(String message) {
        this.message = message;
    }

    public void sayHello() {
        System.out.println(message);
    }

}

 

静态工厂实例化类HelloWorldInstanceFactory.java

public class HelloWorldStaticFactory {
     /**
     * 工厂方法 
     * 
     * @param message
     * @return
     */
    public static HelloWorld newInstance(String message) {
        // 返回需要的Bean实例
        return new HelloWorldImpl(message);
    }

}

 

实例工厂实例化类HelloWorldStaticFactory.java

public class HelloWorldInstanceFactory {
     
    /**
     * 工厂方法 
     * 
     * @param message
     * @return
     */
    public HelloWorld newInstance(String message) {
        // 返回需要的Bean实例
        return new HelloWorldImpl(message);
    }

}

 

程序入口类Main.java

public class Main {

    public static void main(String[] args) {
        helloWorldInstanceFactory();
    }
    
    //使用无参数构造器来实例化Bean
    public static void sayHelloWithNoArgs() {
        BeanFactory beanFactory = 
                new ClassPathXmlApplicationContext("conf/conf-instance.xml");
        HelloWorld helloWorld = beanFactory.getBean("helloWorldWithNoArgs", HelloWorld.class);
        helloWorld.sayHello();
    }
    //使用有参数构造器来实例化Bean
    public static void sayHelloWithArgs() {
        BeanFactory beanFactory = 
                new ClassPathXmlApplicationContext("conf/conf-instance.xml");
        HelloWorld helloWorld = beanFactory.getBean("helloWorldWithArgs", HelloWorld.class);
        helloWorld.sayHello();
    }
    

    //使用静态工厂方法来实例化Bean
    public static void helloWorldStaticFactory() {
        // 1、读取配置文件实例化一个IOC容器
        BeanFactory beanFactory = 
                new ClassPathXmlApplicationContext("conf/conf-instance.xml");
        // 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
        HelloWorld helloWorld 
        = beanFactory.getBean("helloWorldStaticFactory", HelloWorld.class);
        // 3、执行业务逻辑
        helloWorld.sayHello();
    }

    //使用实例化工厂方法来实例化Bean
    public static void helloWorldInstanceFactory() {
        // 1、读取配置文件实例化一个IOC容器
        BeanFactory beanFactory = 
                new ClassPathXmlApplicationContext("conf/conf-instance.xml");
        // 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现编程”
        HelloWorld helloWorld 
        = beanFactory.getBean("helloWorldInstance", HelloWorld.class);
        // 3、执行业务逻辑
        helloWorld.sayHello();
    }
}

 

以上是关于Spring---bean的实例化的主要内容,如果未能解决你的问题,请参考以下文章

Spring---bean的实例化

面试官:说说 Spring Bean 的实例化过程?面试必问的!

Spring- Bean的实例化

面试官必问:说说 Spring Bean 的实例化过程?

spring bean的生命周期是怎样的,代码示例

Spring6| Bean的四种获取方式(实例化)