Spring筆記03(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();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM