Spring容器、高級裝配回顧

一、首先對Spring下一個定義:        java

     1spring是一個容器。用於管理全部在java中聲明的類。在spring中,spring所管理的全部類,叫springBeanweb

        (只要是被spring的管理類,都叫作springbeanspring

     2:spring是一個框架:編程

          Aop/di框架  面向切面的編程。Didependences injection)  依賴注入框架。數組

二、Spring容器介紹緩存

        Spring的容器的特色,是經過讀取spring的配置文件,實例化配置的全部類。session

Spring的容器有兩個:app

框架

功能dom

Org.springframework.BeanFactory(接口)

根容器的類,全部的spring的容器都必須是它的子類。

The root interface for accessing a Spring bean container.

Org..ApplicationContext (接口)  

上下文容器

1:是BeanFactory的子類。

2:比BeanFacotry更強大。

3:在開發時,大多都使用這個類。和它的子類:

 

  ClasspathXmlApplicationContext (具體類)

ApplicationContext的子類。

用於從classpath根目錄下,讀取spring的配置文件。

  FileSystemXmlApplicationContext (具體類)

ApplicationContext的子類。

用於從文件系統中,讀取spring的配置文件。

三、Spring兩個容器區別:

     

  BeanFactory  當用戶使用SpringBean時纔會實例化某個類  懶加載

<?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-4.1.xsd">

<!-- 配置第一個springbean

spring會根據你的的配置,實例化這個類,且將這個類緩存到本身的容器中去

Person person  = new Person();//spring經過反射來實例化這個類、

將這個類緩存到本身的容器中去

map.put("person",person);

 -->

<bean id="person" class="cn.domain.Person"/>

</beans>

 

 

  applicationContext 只要是容器實例化,就會實例化全部springBean  非懶加載

四、Spring管理的bean的範圍

scope

說明

Prototype

 

每一次都返回一個新的實例

原型模式。

這個對象在Spring容器實例化時,不會實例化這個對象,而是隻保存這個類的字節碼。當用戶每一次調用

getBean()方法時,每一次都返回一個新的實例。

Request 

web環境下,

每個request就是一個新的springBean實例

session

web環境下,

每個session就返回一個新的springbean的實例。

Singleton  默認的形式

 

spring裏,全部的springbean,默認都是單列的。

每一次調用getBean返回的都是同一個實例。

 

五、Spring裝配

    5.1經過SetXxxx屬性注入值。

   <bean id="person" class="cn.domain.Person">

     <!-- #{3*7}:SpEL表達式,就是在spring的配置文件中能夠使用的表達式語言 -->

              <property name="age" value="#{3*7}"/>

              <property name="married">

                 <value>true</value>

              </property>

              <property name="name" value="張三"></property>

     </bean>

運行結果:

這個類被實例化了:4650724

Person [name=張三, age=21, married=true]

以上注入8大數據類型+String均可以。

     5.2注入集合類

<!--Map-->

<property name="mpp">

  <map>

      <entry key="name" value="Jack"></entry>

      <entry key="addr">

               <value>北京中國</value>

       </entry>

    </map>

</property>

<!--list-->

<property name="lt">

<list>

      <value>張三</value>

      <value>李四</value>

</list>

</property>

<!--Set-->

<property name="set">

  <set>

     <value>kkkkkk</value>

  </set>

</property>

<!--數組-->

<property name="SSS">

      <array>

            <value>DDD</value>

       </array>

</property>

<property name="DD">

<!-- properties -->

    <props>

        <prop key="name">Jack..</prop>

     </props>

</property>

6.1構造器注入---經過構造器設置值

 

public Person(String name, Integer age, Boolean married) {

      this.name = name;

      this.age = age;

      this.married = married;

      System.err.println("這是有參數的構造。。");

}

 

<bean id="person" class="cn.domain.Person">

        <constructor-arg value="Jack"></constructor-arg>

        <constructor-arg value="89"/>

        <constructor-arg value="false"></constructor-arg>

</bean>

6.2注入引用

  1:用ref引用     

<bean id="person" class="cn.domain.Person">

<!-- 引用另外一個SpringBean -->

<property name="addr" ref="addr"></property>

</bean>

<!-- 聲明addr的實例,沒有先後的關係 -->

<bean id="addr" class="cn.domain.Addr">

<property name="tel" value="189373844"/>

<property name="zip" value="中國山東"></property>

</bean>

二、嵌入式的聲明

       

<bean id="person" class="cn.domain.Person">

<!-- 引用另外一個SpringBean -->

<property name="addr">

     <bean class="cn.domain.Addr">

         <property name="tel" value="189373844" />

         <property name="zip" value="中國山東"></property>

       </bean>

</property>

</bean>

6.3自動的注入

    一、byname

<bean id="person" class="cn.domain.Person" autowire="byName">

</bean>

<!-- 由於在person類中有 一個setAddr全部找名稱爲addrbean -->

<bean id="addr" class="cn.domain.Addr">

<property name="tel" value="189373844" />

<property name="zip" value="中國山東"></property>

</bean>

      二、byType ---若是是byType則必需要有一個惟一的對象

      三、constructotr-----有構造器,先根據參數名稱,若是沒有參數名稱, 則按照byType

建議不用自動注入,隱藏了注入的細節,會帶來性能的下降。

7.1Spring的初始化方法和銷燬方法

配置經過靜態的工廠方法來實例化這個類:

 

public class Car {

private Car() {

System.err.println("2:new Car...");

}

public static Car instacne(){

System.err.println("1:靜態的方法。。。。");

return new Car();

}

public void init(){

System.err.println("3:初始化完成了..");

}

public void destory(){

System.err.println("4:銷燬了..");

}

}

 

bean class="cn.domain.Car" factory-method="instacne"  ></bean>

下面一篇文章將專門介紹Spring的生命週期

相關文章
相關標籤/搜索