javascript
Spring-Spring配置概述
- Spring容器高層視圖
- 成功啟動Spring容器的三個必要條件
- Bean配置信息
- 基于XML的配置
- Schema的配置格式
- Bean的基本配置
- 裝載一個Bean
- Bean的命名
- 總結
- 導讀
Spring容器高層視圖
成功啟動Spring容器的三個必要條件:
Spring啟動時,讀取應用程序提供的Bean配置信息,并在Spring容器中提供一份相應的Bean配置注冊表,然后根據這張注冊表實例化Bean,裝配好Bean之間的依賴關系,為上層應用提供準備就緒的運行環境。
Bean配置信息
Bean配置信息是Bean的元數據信息,由以下4個方面組成
- Bean的實現類
- Bean的屬性信息 ,如數據源的連接數、用戶名密碼等
- Bean的依賴關系,Spring根據依賴關系配置Bean之間的裝配
- Bean的行為配置,如生命周期范圍和生命周期各個過程的回調函數等。
Spring元數據信息在Spring容器中的內部對應由一個個BeanDefinition行程的Bean注冊表。
Spring支持多種形式的Bean配置方式。
- Spring 1.0僅支持基于XML的配置方式
- Spring 2.0新增基于注解的配置方式
- Spring 3.0新增基于Java類配置的支持
- Spring 4.0新增基于Groovy動態語言配置的支持
Bean配置信息
首先定義了Bean的實現及依賴關系,Spring容器根據Bean的配置信息在容器內部建立Bean定義注冊表,
然后根據注冊表加載、實例化Bean,并建立Bean之間的依賴關系,
最后將這些準備就緒的Bean放到Bean緩存池中,供外層的應用調用。
基于XML的配置
基于XML的配置,spring1.0的配置文件采用DTD格式,Spring2.0以后則采用Schema形式,基于Schema形式,讓不同類型的配置擁有了自己的命名空間,更具擴展性。此外,Spring基于Schema配置方案為許多領域的問題提供了簡化的配置方法,配置工作因此得到了大幅簡化。
Schema的配置格式
解析:
- ① 默認命名空間:它沒有空間名,用于Spring Bean的定義;
- ② xsi命名空間:這個命名空間用于為每個文檔中命名空間指定相應的Schema樣式文件,是標準組織定義的標準命名空間;
- ③ aop命名空間:這個命名空間是Spring配置AOP的命名空間,是用戶自定義的命名空間。
命名空間的定義分為兩個步驟:
第一步指定命名空間的名稱,
第二步指定命名空間的Schema文檔樣式文件的位置,用空格或回車換行進行分隔。
命名空間使用全限定名,每個組織機構在發布Schema文件后,都會為該Schema文件提供一個引用的URL地址,一般使用這個URL地址指定命名空間對應的Schema文件。
命名空間名稱和對應的Schema文件地址之間使用空格或回車分隔,不同的命名空間之間也使用這種分隔方法。
指定命名空間的Schema文件地址有兩個用途:
- XML解析器可以獲取Schema文件并對文檔進行格式合法性驗證;
- 在開發環境下,IDE可以引用Schema文件對文檔編輯提供誘導功能(自動補全)。
Spring4.0配置的Schema文件放在各模塊Jar文件內一個名為config的目錄下
比如AOP:
強烈建議使用新的基于Schema的配置方式
除了Xml的配置方式,spring還支持基于注解、Java類、Groovy的配置方式,本質上是相同的,僅僅是形的區別。
基于Xml的配置方式是最基礎、最傳統的配置方式,下面我們注重探討基于Xml的配置,另外三種也作簡要介紹。
Bean的基本配置
裝載一個Bean
在Spring容器的配置文件中定義一個簡要的Bean的配置片段如下
<bean id="plane" class="com.xgj.Plane">- id:bean的名稱 ,通過容器的getBean(“plane”)即可獲得對應的Bean,在容器中起到定位查找的作用,是外部程序和SpringIoC容器進行交互的橋梁,
- class:bean的類名,指定了Bean對應的實現類
我們用STS創建一個Maven工程如下:舉例:
logback.xml沒用,使用的log4j的配置那文件
package com.xgj.ioc.beans;public class Boss {private String name;private String sex;private int age;private Plane plane ;....省略setter/getter public void introduce() {System.out.println("Boss Information【name:" + name + ",sex:" + sex + ",age:" + age +"】" );plane.info();}} package com.xgj.ioc.beans;public class Plane {private String brand;private String color;private int speed;....省略setter/getter public void info(){System.out.println("brand:" + brand + ",color:" + color + ",speed" + speed);}} package com.xgj.ioc.beans;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {// 加載配置文件ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/application-config.xml");// 從容器中獲取實例化后的beanBoss boss = ctx.getBean("boss", Boss.class);Plane plane = ctx.getBean("plane", Plane.class);// 設置屬性boss.setName("XGJ");boss.setSex("MALE");boss.setAge(20);boss.setPlane(plane);// 設置屬性plane.setBrand("A380");plane.setColor("red");plane.setSpeed(900);// 調用方法boss.introduce();}}application-config.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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- Uncomment and add your base-package here:<context:component-scanbase-package="org.springframework.samples.service"/> --><bean id="plane" class="com.xgj.ioc.beans.Plane"/><bean id="boss" class="com.xgj.ioc.beans.Boss"/></beans>Bean的命名
一般情況下,在配置一個Bean時,需要為其指定一個id屬性作為Bean的名稱。
id在IoC容器中必須是唯一的,并且id的命名需要滿足XML對id的命名規范(id是xml規定的特殊屬性)
- 必須以字母開始,后面可以是字符、數字、連接符、下劃線、局號、冒號等完整結束(full stops)的符號
- 逗號和空格這些非完整結束符是非法的。
在實際情況下,id命名約束并不會給用戶帶來影響,如果用戶確實希望用一些特殊字符進行bean命名,這可以使用<bean>的name屬性。 name屬性沒有字符上的限制,幾乎可以使用任何字符比如?ab、123
id和name都可以指定多個名字,名字之間可以用逗號、分號或者空格進行分隔,比如
<bean id="plane" name="#plane1,123,$plane" class="com.xgj.ioc.beans.Plane"/>用戶可以通過getBean(“#plane1”),getBean(“123”),getBean(“$plane”),獲取IoC容器中的plane Bean.
Spring配置文件不允許出現兩個相同id的bean, 但可以出現兩個相同name的bean。
如果有多個相同name的bean,通過getBean(BeanName)則獲取的是后面聲明的那個Bean。
為了避免此問題,應盡量使用ID,而非Name來命名Bean。
如果id和name均未指定,比如
<bean class="com.xgj.ioc.beans.Plane"/>Spring會指定將全限定類名作為bean的名稱,用戶可以通過getBean(“com.xgj.ioc.beans.Plane”)獲取Bean
如果存在多個實現類相同的匿名Bean,如下
<bean class="com.xgj.ioc.beans.Plane"/><bean class="com.xgj.ioc.beans.Plane"/><bean class="com.xgj.ioc.beans.Plane"/>第一個Bean可以通過getBean(“com.xgj.ioc.beans.Plane”)獲得
第二個Bean通過getBean(“com.xgj.ioc.beans.Plane#1”)獲得
第三個Bean通過getBean(“com.xgj.ioc.beans.Plane#2”)獲得
一般匿名bean在通過內部Bean為外層Bean提供注入值是使用,類似Java的匿名類。
總結:
上面各種命名方式,只是為了演示Sping配置的靈活性和包容性,實際應用中并不多見, 通過id為Bean指定唯一的名稱才是正解。
導讀
01-Spring-Spring配置概述
02-Spring-依賴注入
03-Spring-注入參數詳解
總結
以上是生活随笔為你收集整理的Spring-Spring配置概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-在IoC中装配Bean系列
- 下一篇: Spring-依赖注入