spring學習-IOC(五)-基於XML的Bean創建2

spring提供了三種bean實例的定義方式:

  • 構造器實例化bean
    • 空構造器
    • 有參構造器
  • 靜態工廠方法實例化bean:本質是直接調用: 類.靜態方法
  • 實例工廠方法實例化bean:本質:先生成工廠bean,然後用工廠bean創建實例
    • 場景:比如第三方的jar包,無法修改源碼

示例方法

  • 參照上上篇文章描述,創建maven工程,引入spring的maven依賴包
  • 創建測試類:
package ioc2;

public interface HelloWorld {
    void sayHelloWorld();
}

class HelloWorldImpl implements HelloWorld {

    String message;

    public HelloWorldImpl() {
        this.message = "Hello World";
    }

    public HelloWorldImpl(String msg) {
        this.message = msg;
    }

    @Override
    public void sayHelloWorld() {
        System.out.println(message);
    }
}

class HelloWorldFactory {
    /**
     * 靜態工廠方法創建bean的入口
     */
    public static HelloWorld newInstance() {
        return new HelloWorldImpl();
    }

    /**
     * 靜態工廠方法創建bean的入口
     */
    public static HelloWorld newInstance(String message) {
        return new HelloWorldImpl(message);
    }

    /**
     * 這個方法用作實例工廠創建bean:此時要求爲非staic方法
     * @param message
     * @return
     */
    public HelloWorld newInstance2(String message) {
        return new HelloWorldImpl(message);
    }
}
  • 創建spring的xml配置文件:ioc2-construct.xml
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

    <!--1.1 聲明一個bean, 使用默認構造器-->
    <bean id="helloWorldDefault" class="ioc2.HelloWorldImpl"/>

    <!--1.2 聲明一個bean, 指定構造器-->
    <bean id="helloWorldWithArgs" class="ioc2.HelloWorldImpl">
        <constructor-arg index="0" value="Hello with args"/>
    </bean>

    <!--2.1 通過靜態工廠方法聲明一個bean-->
    <bean id="HelloWorldStatic1" class="ioc2.HelloWorldFactory" factory-method="newInstance"/>

    <!--2.2 通過靜態工廠方法聲明一個bean-->
    <bean id="HelloWorldStatic2" class="ioc2.HelloWorldFactory" factory-method="newInstance">
        <constructor-arg index="0" value="Hello From Static"/>
    </bean>

    <!--3. 通過實例工廠創建-->
    <!--步驟1:先生成工廠bean-->
    <bean id="HelloWorldFactory" class="ioc2.HelloWorldFactory"/>
    <!--步驟2:通過工廠bean實例化目標bean-->
    <bean id="HelloWorldByFactoryInstance" factory-bean="HelloWorldFactory" factory-method="newInstance2">
        <constructor-arg index="0" value="Hello From BeanFactoryInstance"/>
    </bean>
</beans>
  • 創建測試類:

class Main {
    public static void main(String[] args) {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("ioc2-construct.xml");

        System.out.println("========== 1.1 聲明一個bean, 使用默認構造器 ==========");
        HelloWorld helloWorld11 = beanFactory.getBean("helloWorldDefault", HelloWorld.class);
        helloWorld11.sayHelloWorld();
        System.out.println("========== 1.2 聲明一個bean, 指定構造器 ==========");
        HelloWorld helloWorld12 = beanFactory.getBean("helloWorldWithArgs", HelloWorld.class);
        helloWorld12.sayHelloWorld();

        System.out.println("========== 2.1 聲明一個bean, 使用靜態工廠:無參 ==========");
        HelloWorld helloWorld21 = beanFactory.getBean("HelloWorldStatic1", HelloWorld.class);
        helloWorld21.sayHelloWorld();
        System.out.println("========== 2.2 聲明一個bean, 使用靜態工廠:有參 ==========");
        HelloWorld helloWorld22 = beanFactory.getBean("HelloWorldStatic2", HelloWorld.class);
        helloWorld22.sayHelloWorld();

        System.out.println("========== 3. 通過實例工廠處理 ==========");
        HelloWorld helloWorld3 = beanFactory.getBean("HelloWorldByFactoryInstance", HelloWorld.class);
        helloWorld3.sayHelloWorld();

        System.out.println("========== 可以看到:三種方式都可以生成HelloWorld的bean,並且地址都不一樣 ==========");
        System.out.println(helloWorld11);
        System.out.println(helloWorld12);
        System.out.println(helloWorld21);
        System.out.println(helloWorld22);
        System.out.println(helloWorld3);
    }
}
  • 運行main,輸出結果:
========== 1.1 聲明一個bean, 使用默認構造器 ==========
Hello World
========== 1.2 聲明一個bean, 指定構造器 ==========
Hello with args
========== 2.1 聲明一個bean, 使用靜態工廠:無參 ==========
Hello World
========== 2.2 聲明一個bean, 使用靜態工廠:有參 ==========
Hello From Static
========== 3. 通過實例工廠處理 ==========
Hello From BeanFactoryInstance
========== 可以看到:三種方式都可以生成HelloWorld的bean,並且地址都不一樣 ==========
ioc2.HelloWorldImpl@564718df
ioc2.HelloWorldImpl@51b7e5df
ioc2.HelloWorldImpl@18a70f16
ioc2.HelloWorldImpl@62e136d3
ioc2.HelloWorldImpl@c8e4bb0
  • 結果說明:
    • 三種方式都可以實例化HelloWorldImpl實例bean,並且都可以調用
    • 三種方式生成的bean都是不一樣的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章