Spring容器和Bean

什麼是 Spring容器和Bean


Spring

  Spring的核心容器就是一個大工廠,所有對象都會被Spring核心容器管理,Spring框架的本質就是,通過XML配置來驅動Java代碼,這樣就可以把原本由Java代碼管理的耦合關係,提取到XMl配置文件中管理,這就實現了,系統中的各組件的解耦有利於後期升級和維護。Spring容器中的一切對象都稱爲Bean,Spring 對Bean沒有任何要求,只要它是Java類即可。

對於Spring框架而言,一切Java對象(只要它是Java類即可)都是Bean。

public class User {
    private String name;

    //User的無參構造器
    public User() {
        System.out.println("User的無參構造器被調用");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {

        System.out.println("調用了User的setName方法");
        this.name = name;
    }
}

  對於<bean ...>元素,默認以反射方式來調用該類的無參構造器,其class 反射的必須爲實現類並不是接口,對於<property... 它驅動Spring在底層以反射執行一次setter方法,其中的<property... 的name 屬性值決定執行那一個setter方法,每個<property...元素默認Spring調用一次setter方法。

      <!-- 向spring 添加 bean -->
    <bean id="user" class="com.test.spring.model.User">
        <!-- 控制setName()方法,將"老王"給user.name賦值  -->
        <property name="name" value="老王"></property>
    </bean>
    <!-- 配置名爲:win的bean,其實現類爲:javax.swing.JFrame-->
    <bean id="win" class="javax.swing.JFrame"></bean>
    <!-- 配置名爲:date的bean,其實現類爲:java.util.Date -->
    <bean id="date" class="java.util.Date"></bean>

Spring 常用獲取Bean的方法:

  1. T getBean(String name,Class<T> requireType) 返回requireType
  2. Objcet getBean(String name) 返回Object類型。(String name)可以是id和別名。
  @Test
   public void springTest(){
       //加載spring配置文件,獲取Sprting容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

        //根據bean的 id 和 User.class獲取bean(指定了 Bean的類型)
        User user = applicationContext.getBean("user",User.class);
        System.out.println("獲取spring.xml對User的賦值:"+user.getName());

        //設置時間格式
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd") ;
        Date date = new Date();
        System.out.println("通過new:"+sf.format(date.getTime()));
        // 根據bena的id獲取bean,獲取得到的是Objcet類型需要強轉
        Date date2 = (Date) applicationContext.getBean("date");
        System.out.println("獲取Spring容器裏面的Date:"+sf.format(date2.getTime()));
    }

image_1c5h0tfhgg2ij7ecvm1b6t2df9.png-35.8kB

ApplictionContext 與 BeanFactory

  Spring容器最基本的接口是BeanFactory 負責配置、創建、管理Bean,它有一個子接口: AnpplicationContext(Spring的上下文),它爭強了Beanfactory的功能。Spring容器還負責管理Bean與Bean之間的依賴關係。

  當系統創建ApplicationContext ,默認會初始化所有的singletion Bean包括構造器創建Bean實例,並根據<property...元素執行setter方法。當系統創建ApplicationContext,前期有比較大的系統開銷,但ApplicationContext被創建完成後,程序後面獲取singletion Bean實例將會擁有比較好的性能。ApplicationContext 包括BeanFactory的全部功能。

    @Test
    public  void  BeanFactoryTest(){

     /*   BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
         beanFactory.getBean("date");
*/

        //加載spring配置文件,多個Spring配置
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
        applicationContext.getBean("date");

    }

image_1c5ihhiaihj3oau17e01adm8g89.png-49.4kB

  BeanFactory對於某些內存非常關鍵的情景使用.

Bean使用

  Spring可以看做一個超級大工廠,Spring 容器中的Bean就是該工廠的產品。
  Spring框架主要做兩件事:1.開發bean。2.配置bean。對於Spring框架來說,它要做的就是根據配置文件來創建Bean實例,並調用Bean實例的方法完成”依賴注入”——這就是所謂IOC的本質。

Bean的基本使用:

id:確實bean的唯一標識,容器對Bean的管理、訪問、以及該Bean的依賴關係,都通過該屬性完成。Bean的id在Spring容器中都是唯一的。
class: 指定Bean的具體實現類不是接口。Spring必須知道創建Beand的實現類,而不是接口。在默認的設置中Spring會直接使用new 關鍵字創建該Bean的實例,所有必須提供Bean實現類的類名。
name:指定一個bean實例的標識名,表面將該Bean實例指定爲別名
alias:指定一個別名。

  <!--  給 person 設置多個別名 -->
    <bean id="person" class="com.test.spring.model.Person" name="#aa,@123,abc">
    </bean>

    <!-- person設置一個別名 -->
    <alias name="person" alias="per"/>

Bean的作用域

image_1c5iq2v0kg0m1duhuet1vc7gflm.png-25kB

Single:單例模式,在Spting IoC容器中,Single作用域的Bean將只生產一個實例。
Prototype:多例模式,每次通過容器getBaen()獲取的Bean都講產生一個新的Bean實例。
request:對於一次Htttp請求,request 作用域 Bean將只生產一個實例,在同一次reqestHtttp請求會話中,程序每次得到的總是同一個實例。只有在Web應用中使用Spring時,該作用域纔會真正的生效。
session: 對於一次會話,session作用域的Bean將只生成一個實例。
global:每個全局的HTTP Session 對於一個Bean實例。

當使用:single時:
image_1c5is73u413f113a11pb33uk11k13.png-21.6kB

   @Test
    public  void  BeanFactoryTest(){

     /*   BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
         beanFactory.getBean("date");
*/

        //加載spring配置文件,多個Spring配置
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml","bean.xml");

        Person person1 = applicationContext.getBean("person",Person.class);

        Person person2 = applicationContext.getBean("person",Person.class);

            boolean b = person1  == person2;
        System.out.println("對比person1與person2:"+b);
    }

image_1c5is8d42fbm1fhen5c3hq4jb20.png-31.3kB

當時用Prototype時

image_1c5isa08i4mr6gfkd2pm61afm2d.png-31.6kB

 Person person1 = applicationContext.getBean("person",Person.class);

        Person person2 = applicationContext.getBean("person",Person.class);

            boolean b = person1  == person2;
        System.out.println("對比person1與person2:"+b);

image_1c5isb3g71dpf1ppu1ibmmlv1dfc2q.png-47.6kB

發佈了72 篇原創文章 · 獲贊 16 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章