1. 程式人生 > >Spring建立物件的三種方式

Spring建立物件的三種方式

1.建立物件的三種方式和bean的生命週期的驗證:

Animal介面程式碼:

package cn.pb.dao;

/**
 * 動物介面
 */
public interface Animal {
    //吃飯
    String eat();
    //睡覺
    void sleep();
}

Animal介面的實現類Dog的程式碼:

package cn.pb.dao.impl;
/**
 * animal的實現類
 */

import cn.pb.dao.Animal;

public class Dog implements Animal{
    /**
     * 無參構造 驗證什麼時候例項被建立
     */
    public Dog(){
        System.out.println("dog被例項化了!");
    }

    public String eat() {
        System.out.println("吃飯的方法");
        return null;
    }

    public void sleep() {
        System.out.println("睡覺的方法");
    }

    //初始化之後的方法
    public void  init(){
        System.out.println("初始化之後的方法");
    }

    //銷燬之前的方法
    public void  destroy(){
        System.out.println("銷燬之前的方法");
    }


}

01.通過構造方法建立物件(常用的方式):

 001.appicationContext.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">

<!--配置我們的Dog類  spring 框架在底層 
  通過反射的機制  執行了我們的構造方法-->
<bean id="dog" class="cn.pb.dao.impl.Dog"></bean>
</beans>

 002.測試程式碼:

 @Test
    public void test05(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

        System.out.println("********");

        /**
         * 因為我們在容器中定義了id  根據id找到對應的類
         * 這裡的dog是通過構造方法建立的
         */
        Animal dog=(Animal) context.getBean("dog");
        dog.eat();
        dog.sleep();

    }

02.通過靜態工廠方法建立物件:

 001.靜態工廠類:

package cn.pb.dao;

import cn.pb.dao.impl.Dog;

/**
 * AnimalFactory靜態工廠類
 */
public class AnimalFactory {
    /**
     * 可以看到程式沒有走構造方法
     */
    public AnimalFactory(){
        System.out.println("靜態工廠的無參構造====");
    }
//靜態工廠,不會走無參構造
    public static Animal getDog(){
        System.out.println("工廠中靜態獲取Dog例項的方法");
        return new Dog();
    }
}

 002.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">

    <!--配置我們的Dog類  spring 框架在底層 01.  通過反射的機制  執行了我們的構造方法
    <bean id="dog" class="cn.pb.dao.impl.Dog"></bean>
    -->

    <!--02.通過靜態工廠 來建立我們物件的例項
     工廠的本身構造不會執行 因為我們的方法是靜態的 !類只會被載入,不會被例項化!
     getDog必須是靜態的-->


    <bean id="dog" class="cn.pb.util.AnimalFactory" factory-method="getDog"></bean>  
</beans>

 003.測試程式碼:

//使用靜態工廠來建立物件
    @Test
    public  void  test06(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("*************************");
        /**
         * 因為我們在容器中定義了id 根據id找到對應的類
         * 是通過靜態工廠來建立的 不走靜態工廠的構造方法
         * 工廠的本身構造不會執行 因為我們的方法是靜態的 !類只會被載入,不會被例項化!
         */
        Animal dog=(Animal) context.getBean("dog");
        dog.eat();
        dog.sleep();
    }

03.通過動態工廠方法建立物件:

 001.動態工廠類:

package cn.pb.dao;

import cn.pb.dao.impl.Dog;

/**
 * AnimalFactory動態工廠類
 */
public class AnimalFactory {
    /**
     * 程式會先建立工廠例項 再呼叫getDog()方法
     */
    public AnimalFactory(){
        System.out.println("動態工廠的無參構造====");
    }
//動態工廠 會先走無參構造  建立例項
    public Animal getDog(){
        System.out.println("工廠中動態工廠獲取Dog例項的方法");
        return new Dog();
    }
}

 002.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">

    <!--配置我們的Dog類  spring 框架在底層 01.  通過反射的機制  執行了我們的構造方法
    <bean id="dog" class="cn.pb.dao.impl.Dog"></bean>
    -->

    <!--02.通過靜態工廠 來建立我們物件的例項
     工廠的本身構造不會執行 因為我們的方法是靜態的 !類只會被載入,不會被例項化!
     getDog必須是靜態的
      <bean id="dog" class="cn.pb.util.AnimalFactory" factory-method="getDog"></bean>
     -->

    <!--03.動態工廠建立 物件的例項-->
    <bean id="factory" class="cn.pb.util.AnimalFactory"></bean><!-- 呼叫哪個工廠裡的哪個方法  來建立物件  物件的id是dog-->
    <bean id="dog" factory-bean="factory" factory-method="getDog"/>

</beans>

 003.測試程式碼:

 //使用動態工廠來建立物件
    @Test
    public  void  test06(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("*************************");
        /**
         * 因為我們在容器中定義了id 根據id找到對應的類
         * 是通過動態工廠來建立的 首先要獲得動態工廠的bean
         * 然後再dog的bean
         */
        Animal dog=(Animal) context.getBean("dog");
        dog.eat();
        dog.sleep();
    }

04.驗證bean的生命週期:

 001.在Dog類中新增兩個方法:

  //初始化之後的方法
    public void  init(){
        System.out.println("初始化之後的方法");
    }

    //銷燬之前的方法
    public void  destroy(){
        System.out.println("銷燬之前的方法");
    }

 002.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">

    <!--配置我們的Dog類  spring 框架在底層 01.  通過反射的機制  執行了我們的構造方法
    <bean id="dog" class="cn.pb.dao.impl.Dog"></bean>
    -->

    <!--02.通過靜態工廠 來建立我們物件的例項
     工廠的本身構造不會執行 因為我們的方法是靜態的 !類只會被載入,不會被例項化!
     getDog必須是靜態的
      <bean id="dog" class="cn.pb.util.AnimalFactory" factory-method="getDog"></bean>
     -->

    <!--03.動態工廠建立 物件的例項
    <bean id="factory" class="cn.pb.util.AnimalFactory"></bean>例項化工廠-->
    <!-- 呼叫哪個工廠裡的哪個方法  來建立物件  物件的id是dog
    <bean id="dog" factory-bean="factory" factory-method="getDog2"/>-->

    <!--
      設定bean的生命始末
    -->
<bean id="dog" class="cn.pb.dao.impl.Dog" init-method="init" destroy-method="destroy"></bean>


</beans>

 003.測試程式碼:

   /**
    * 設定bean的生命週期始末
    * 01.在Dog類中新增兩個方法  init() destroy()
    * 02.在容器中 配置
    *    init-method="init" destroy-method="destroy"
    */
@Test
public  void  test08(){
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    System.out.println("*************************");
    Animal dog=(Animal) context.getBean("dog");
    System.out.println(dog);
    /*
     * 想看到destroy-method="destroy" 的效果 有兩個前提
     * 01.bean必須是單例的
     * 02.容器需要手動的關閉
     */
    ((ClassPathXmlApplicationContext)context).close();
}