目錄
1. Web MVC發展史歷程
2.Spring概要
3.Spring-依賴注入概要(IOC)
4.屬性注入的三種實現方式
5.Spring-IoC XML裝配
6.Spring-XML設置Bean的值
7.Spring-IoC 注解(1)
8.Spring-IoC 注解(2)
9.Spring-AOP切面編程(1)
10.Spring-AOP切面編程(2)
未完待續...
未完待續...
一、簡介
有些時候Spring裝配Bean的時候,我們需要初始化一些屬性的時候,我們就需要在bean中定義
- 構造注入
- setter注入
- 自動裝配
二、constructor-arg
- 說明
通過指定構造方法的參數來實例化Bean - 可選屬性
屬性 說明 type 根據參數的類型,避免構造方法沖突 value 用于指定字符串類型、基本類型的屬性值 name 屬性的名稱 ref 關聯其它類型 index 對應于構造函數的多個參數,index屬性的值從0開始 - 示例代碼
java代碼
xml代碼public class Shop { private int shopId; private String title; private String name; public Shop() { } public Shop(int shopId, String title) { this.shopId = shopId; this.title = title; } public Shop(String title, String name) { this.title = title; this.name = name; } public Shop(int shopId, String title, String name) { this.shopId = shopId; this.title = title; this.name = name; } public int getShopId() { return shopId; } public void setShopId(int shopId) { this.shopId = shopId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Shop{" + "shopId=" + shopId + ", title='" + title + '\'' + ", name='" + name + '\'' + '}'; } }
測試代碼<bean id="shop" class="com.wener.example.bean.Shop"> <!--通過構造方法注入--> <constructor-arg type="int" value="1"/> <constructor-arg type="java.lang.String" value="iPhone X"/> </bean> <!-- 或者 --> <bean id="shop" class="com.wener.example.bean.Shop"> <!--通過構造方法注入--> <constructor-arg index="0" value="1"/> <constructor-arg index='title' value="手機"/> <constructor-arg index='2' value="iPhone X"/> </bean> <!--或者--> <bean id="shop" class="com.wener.example.bean.Shop"> <!--通過構造方法注入--> <constructor-arg name="id" value="1"/> <constructor-arg index='1' value="手機"/> <constructor-arg index='name' value="iPhone X"/> </bean>
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Shop shop = context.getBean("shop", Shop.class); System.out.println(shop.toString());
三、property
- 說明
在 Spring 配置文件中,我們也可以通過 Bean 的屬性 property 進行參數注入。使用 property 屬性不但可以將 String、int 等字面值注入到 Bean 中,還可以將集合、Map 等類型注入到 Bean 中,此外還可以注入其他的 Bean
必須提供setter方法,因為需要通過名字自動裝配 - 可選屬性
屬性 說明 name 屬性的名稱 value 主要是配置基本類型的屬性值, ref 但是如果我們需要為Bean設置屬性值是另一個Bean實例時,這個時候需要使用<ref.../>元素。使用<ref.../>元素可以指定如下兩個屬性。bean:引用不在同一份XML配置文件中的其他Bean實例的id屬性值。local:引用同一份XML配置文件中的其他Bean實例的id屬性值 - 示例代碼
java代碼
xml配置public class Shop { ... private ShopDetail detail; public void setDetail(ShopDetail detail) { this.detail = detail; } public ShopDetail getDetail() { return detail; } } public class ShopDetail { private String desc; public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
測試代碼<bean id="detail" class="com.wener.example.bean.ShopDetail"> <property name="desc" value="demo"/> </bean>
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Shop shop = context.getBean("shop", Shop.class); System.out.println(shop.getDetail().getDesc());
四、autowire
- 說明
在bean標簽上通過autowire屬性;或者在beans標簽上通過default-autowire屬性實現自動裝配 - 可選值
可選值 說明 no 不使用自動裝配。Bean的引用必須通過ref元素定義。 byName 根據屬性名自動裝配。BeanFactory查找容器中的全部Bean,找出其中id屬性與屬性同名的Bean來完成注入。如果沒有找到匹配的Bean實例,則Spring不會進行任何注入 byType 如果BeanFactory中正好有一個同屬性類型一樣的bean,就自動裝配這個屬性。如果有多于一個這樣的bean,就拋出一個致命異常,它指出你可能不能對那個bean使用byType的自動裝配。如果沒有匹配的bean,則什么都不會發生,屬性不會被設置。如果這是你不想要的情況(什么都不發生),通過設置dependency-check="objects"屬性值來指定在這種情況下應該拋出錯誤。 constructor 這個同byType類似,不過是應用于構造函數的參數。如果在BeanFactory中不是恰好有一個bean與構造函數參數相同類型,則一個致命的錯誤會產生。 default 采用父級標簽(即beans的default-autowire屬性)的配置。 - 示例代碼
java代碼
根據屬性名來加載public class Application { private User user; public Application(User user) { this.user = user; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } public class User implements Serializable { private String id; private String name; private String sex; private Integer age; public void destroy() { System.out.println("銷毀!"); } public void init() { System.out.println("初始化!"); }
根據類型來加載<!-- xml配置 --> <bean id="application" class="com.wener.example.bean.Application" autowire="byName"/> <bean id="user" class="com.wener.example.bean.User" />
根據構造方法來加載<!-- 注意:當一個Bean即使用自動裝配依賴,又使用ref顯示依賴時,則顯示指定的依賴就會覆蓋自動裝配 --> <bean id="user" class="com.wener.example.bean.User" /> <!-- xml代碼 --> <bean id="app" class="com.wener.example.bean.Application" autowire="byType"/>
// java代碼 public Application(User user) { this.user = user; } // xml配置 <bean id="app" class="com.wener.example.bean.Application" autowire="constructor"> </bean>
五、注入參數值詳解
1、說明
在 Spring 配置文件中,用戶可以通過 Bean 的屬性 property 進行參數注入。使用 property 屬性不但可以將 String、int 等基本注入到 Bean 中,還可以將List、Set、Map ,Properties等類型注入到 Bean 中,此外還可以注入其他的 Bean
2、基本類型注入
- 概要
一般是指可用字符串表示的值,這些值可通過<value>
元素標簽進行注入。在默認情況下,基本數據類型及其封裝類、String 等類型都可以采取字面值注入的方式 - 示例代碼
public class User { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
<bean id="userId" class="com.wener.example.bean.User"> <property name="name" value="小明"/> <property name="password" value="123456"/> </bean>
3、引入其他Bean
- 概要
Spring IoC 容器中定義的 Bean 可以互相引用。<ref>
元素可以通過 bean、local、parent 三個屬性引用其他 Bean 的屬性,- bean 可以引用統一配置文件中或者父容器中的 Bean
- local 只能引用同一配置文件中的 Bean
- parent 只能引用父容器中的 Bean
- 示例代碼
見property案例
4、內部Bean
- 概要
只會被當前的Bean所引用,不能被其它Bean引用 - 示例代碼
<bean id="xx" class="com.wener.example.bean.Application"> <property name="user"> <bean class="com.wener.example.bean.User"> <property name="name" value="內部Bean"/> </bean> </property> </bean>
5、級聯設置屬性
- 概要
如果你想直接設置關聯Bean的屬性的值,可以設置級聯屬性 - 示例代碼
<bean id="xxx" class="com.wener.example.bean.Application"> <property name="user.name" value="級聯屬性設置"/> </bean>
6、list
- 說明
<list>
元素進行裝配,然后通過多個<value>
設置基本類型的值,也可以使用<ref>
類引用復雜的對象類型 - 示例代碼
<bean id="complex" class="com.wener.example.bean.Complex"> <property name="list"> <list> <value>list1</value> <value>list2</value> <value>list3</value> <value>list4</value> <!-- 引用復雜對象 --> <!-- <ref bean="user"/> --> </list> </property> </bean>
7、map
- 說明
<map>
元素進行裝配,然后通過多個<entry>
元素設值,只是entry
包含一個鍵值對的設置,也可以使用key-ref
屬性去引用之前定義好的 Bean 作為鍵,而用value-ref
屬性引用之前定義好的 Bean 作為值 - 示例代碼
<property name="map"> <map> <entry key="k1" value="v1"/> <entry key="k2" value="v2"/> <entry key="k3" value="v3"/> <entry key="k4" value-ref="user"/> </map> </property>
8、set
- 說明
<set>
元素進行裝配,可以通過value設置基本類型的值,也可以通過<ref>
去引用已經定義的Bean - 示例代碼
<property name="set"> <set> <value>1</value> <value>2</value> <value>3</value> </set> </property> <property name="set"> <set> <ref bean='user'/> </set> </property>
9、array
- 說明
<array>
可以通過多個<value>
元素設值 - 示例代碼
<property name="array"> <array> <value>1</value> <value>2</value> <value>3</value> <!-- <ref name="user"/> --> </array> </property>
10、properties
- 說明
<properties>
元素進行裝配,通過多個<property>
元素設值,只是properties
元素有一個必填屬性key
,然后可以設置值 - 示例代碼
<property name="properties"> <props> <prop key="k1">v1</prop> </props> </property>
11、其它
- 集合合
子Bean可以繼承父Bean的同名屬性集合元素,并且使用merge屬性選擇是否合并,默認不合并。 - 示例代碼
<bean id="parent" abstract="true" class="***"> <property name="list"> <set> <value>1</value> <value>2</value> <value>3</value> </set> </property> </bean> <bean id="child" parent="parent"> <property name="list"> <set merge="true"> <value>4</value> <value>5</value> </set> </property>
12、總結
- value:指定集合元素是基本數據類型或者字符類型值。
- ref:指定集合元素師容器中另一個Bean實例。
- bean:指定集合元素是一個嵌套Bean。
六、命名空間裝配
1、概要
除了上述的配置方式外,Spring3.0以上的版本還為上述的方式提供了一些簡寫方式
2、c
- 說明
命名空間-c屬性名以 “c:” 開頭,也就是命名空間的前綴,通過構造器注入的方式來配置 bean,接下來就是要裝配的構造器參數名 - 示例代碼
<beans ... xmlns:c="http://www.springframework.org/schema/c"> </beans>
<!-- 未引入之前--> <bean id="shop" class="com.wener.example.bean.Shop"> <!--通過構造方法注入--> <constructor-arg type="int" value="1"/> <constructor-arg type="java.lang.String" value="iPhone X"/> </bean> <!--簡寫方式 --> <bean id="shop" class="com.wener.example.bean.Shop" c:shopId="1" c:name="測試"/>
3、p
- 說明
命名空間-p通過setter的注入方式來配置 bean - 示例代碼
<!-- 未引入之前--> <bean id="userId" class="com.wener.example.bean.User" scope="prototype"> <property name="name" value="小明"/> <property name="password" value="123456"/> </bean> <!--簡寫方式 --> <bean id="user4" class="com.wener.example.bean.User" p:name="admin" p:password="123"/> <bean id="app" class="com.wener.example.bean.Application" p:user-ref="user" />
4、util
- 說明
工具類的命名空間,可以簡化集合類元素的配置 - util命名空間表
元素 描述 <util:list>
創建一個 java.util.List
類型的 bean,其中包含值或引用<util:map>
創建一個 java.util.map
類型的 bean,其中包含值或引用<util:properties>
創建一個 java.util.Properties
類型的 bean<util:property-path>
引用一個 bean 的屬性(或內嵌屬性),并將其暴露為 bean <util:set>
創建一個 java.util.Set
類型的 bean,其中包含值或引用<util:constant>
引用某個類型的 public static
域,并將其暴露為 bean
5、util:list
- 說明
可以通過util:list
來定義一個java.util.List
類型的bean,其子元素就是對應的List的元素,其子元素可以是一切可以用來定義對象的元素,比如value、bean等,
默認元素的值是String類型,可以通過value-type
屬性指定元素值的類型,比如數字類型則指定value-type="java.lang.Integer"
默認生成的是java.util.ArrayList
類型的List,如果需要使用其它類型的List,則可以通過list-class
來指定。比如下面就指定了生成的List是java.util.LinkedList
- 示例代碼
<bean id="complex" class="com.wener.example.bean.Complex" p:list="list"/> <util:list id="list" value-type="java.lang.String" list-class="java.util.LinkedList"> <value>1</value> <value>2</value> <value>3</value> </util:list>
6、util:map
- 說明
通過util:map
來定義一個Map類型的, Map中的每一個Entry則由其子元素entry來定義。每個Entry的key和value可以通過entry元素的key和value屬性來定義
默認key和value的值是String類型,如果想修改類型可以通value-type
屬性指定value的類型,如果是復制的類型可以通過value-ref來引入
默認生成的是`java.util.HashMap,如果想使用其他類型的Map,可以通過map-class來指定 - 示例代碼
<util:map id="map" value-type="java.lang.Object" key-type="java.lang.Object"> <entry value-ref="list" key-ref="set"/> </util:map>
7、util:set
- 說明
通過util:set
來定義一個java.util.Set
類型的bean。它的用法和util:list
是類似的。
通過value子元素指定的值默認也是java.lang.String
類型,可以通過value-type
屬性來指定元素類型
默認生成的Set是java.util.LinkedHashSet
類型,可以通過set-class
屬性來指定生成的Set的類型 - 示例代碼
<util:set id="set" value-type="java.lang.Integer" set-class="java.util.HashSet"> <value>1</value> <value>2</value> <value>3</value> </util:set>
8、util:properties
- 說明
可以通過util:properties
快速的定義一個Properties對象,可以通過其子元素<prop key=""></prop>
來定義一個Properties的元素,key對應屬性名,而<prop>
元素中間的文本值則為對應的屬性值
util:properties
的內容也可以來自一個外部文件,此時可以通過location屬性引用對應的外部文件,通過location屬性指定的本地文件也可以是多個,多個文件之間可以通過英文的逗號分隔 - 示例代碼
<util:properties id="properties"> <prop key="a">a</prop> <prop key="b">b</prop> </util:properties>
<!--在工程的Resources目錄下新建一個 util.properties的文件 --> <util:properties id="properties" location="util.properties,xxx.properties"/>
9、util:constant
- 說明
util:constant
可以把一個常量定義為bean容器中的一個bean,可以通過id屬性指定對應的bean的id。static-field
用來指定引用的static變量,需要是public類型的 - 示例代碼
public static final Integer ERROR = -1; <util:constant id="error" static-field="com.wener.example.bean.Application.ERROR" />
10、util:property-path
- 說明
util:property-path
可以用來把某個bean的某個屬性的值定義為一個bean, - 示例代碼
<util:property-path id="username" path="user_path.name"/> <bean id="user_path" class="com.wener.example.bean.User" scope="prototype"> <property name="name" value="小明"/> <property name="password" value="123456"/> </bean>