目錄
1. Web MVC發(fā)展史歷程
2.Spring概要
3.Spring-依賴注入概要(IOC)
4.屬性注入的三種實現(xiàn)方式
5.Spring-IoC XML裝配
6.Spring-XML設(shè)置Bean的值
7.Spring-IoC 注解(1)
8.Spring-IoC 注解(2)
9.Spring-AOP切面編程(1)
10.Spring-AOP切面編程(2)
未完待續(xù)...
未完待續(xù)...
一、簡介
有些時候Spring裝配Bean的時候甲捏,我們需要初始化一些屬性的時候斩芭,我們就需要在bean中定義
- 構(gòu)造注入
- setter注入
- 自動裝配
二呻逆、constructor-arg
- 說明
通過指定構(gòu)造方法的參數(shù)來實例化Bean - 可選屬性
屬性 說明 type 根據(jù)參數(shù)的類型,避免構(gòu)造方法沖突 value 用于指定字符串類型、基本類型的屬性值 name 屬性的名稱 ref 關(guān)聯(lián)其它類型 index 對應(yīng)于構(gòu)造函數(shù)的多個參數(shù)挥下,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"> <!--通過構(gòu)造方法注入--> <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"> <!--通過構(gòu)造方法注入--> <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"> <!--通過構(gòu)造方法注入--> <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 進行參數(shù)注入欺缘。使用 property 屬性不但可以將 String、int 等字面值注入到 Bean 中挤安,還可以將集合谚殊、Map 等類型注入到 Bean 中,此外還可以注入其他的 Bean
必須提供setter方法蛤铜,因為需要通過名字自動裝配 - 可選屬性
屬性 說明 name 屬性的名稱 value 主要是配置基本類型的屬性值嫩絮, ref 但是如果我們需要為Bean設(shè)置屬性值是另一個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屬性實現(xiàn)自動裝配 - 可選值
可選值 說明 no 不使用自動裝配。Bean的引用必須通過ref元素定義氢伟。 byName 根據(jù)屬性名自動裝配榜轿。BeanFactory查找容器中的全部Bean幽歼,找出其中id屬性與屬性同名的Bean來完成注入。如果沒有找到匹配的Bean實例谬盐,則Spring不會進行任何注入 byType 如果BeanFactory中正好有一個同屬性類型一樣的bean甸私,就自動裝配這個屬性。如果有多于一個這樣的bean飞傀,就拋出一個致命異常颠蕴,它指出你可能不能對那個bean使用byType的自動裝配。如果沒有匹配的bean助析,則什么都不會發(fā)生犀被,屬性不會被設(shè)置。如果這是你不想要的情況(什么都不發(fā)生)外冀,通過設(shè)置dependency-check="objects"屬性值來指定在這種情況下應(yīng)該拋出錯誤寡键。 constructor 這個同byType類似,不過是應(yīng)用于構(gòu)造函數(shù)的參數(shù)雪隧。如果在BeanFactory中不是恰好有一個bean與構(gòu)造函數(shù)參數(shù)相同類型西轩,則一個致命的錯誤會產(chǎn)生。 default 采用父級標簽(即beans的default-autowire屬性)的配置脑沿。 - 示例代碼
java代碼
根據(jù)屬性名來加載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("初始化!"); }
根據(jù)類型來加載<!-- xml配置 --> <bean id="application" class="com.wener.example.bean.Application" autowire="byName"/> <bean id="user" class="com.wener.example.bean.User" />
根據(jù)構(gòu)造方法來加載<!-- 注意:當一個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>
五庄拇、注入?yún)?shù)值詳解
1注服、說明
在 Spring 配置文件中,用戶可以通過 Bean 的屬性 property 進行參數(shù)注入措近。使用 property 屬性不但可以將 String溶弟、int 等基本注入到 Bean 中,還可以將List瞭郑、Set辜御、Map ,Properties等類型注入到 Bean 中,此外還可以注入其他的 Bean
2屈张、基本類型注入
- 概要
一般是指可用字符串表示的值擒权,這些值可通過<value>
元素標簽進行注入。在默認情況下阁谆,基本數(shù)據(jù)類型及其封裝類碳抄、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 可以引用統(tǒng)一配置文件中或者父容器中的 Bean
- local 只能引用同一配置文件中的 Bean
- parent 只能引用父容器中的 Bean
- 示例代碼
見property案例
4贱鄙、內(nèi)部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="內(nèi)部Bean"/> </bean> </property> </bean>
5、級聯(lián)設(shè)置屬性
- 概要
如果你想直接設(shè)置關(guān)聯(lián)Bean的屬性的值,可以設(shè)置級聯(lián)屬性 - 示例代碼
<bean id="xxx" class="com.wener.example.bean.Application"> <property name="user.name" value="級聯(lián)屬性設(shè)置"/> </bean>
6逗宁、list
- 說明
<list>
元素進行裝配映九,然后通過多個<value>
設(shè)置基本類型的值,也可以使用<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>
元素設(shè)值,只是entry
包含一個鍵值對的設(shè)置哼拔,也可以使用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設(shè)置基本類型的值,也可以通過<ref>
去引用已經(jīng)定義的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>
元素設(shè)值 - 示例代碼
<property name="array"> <array> <value>1</value> <value>2</value> <value>3</value> <!-- <ref name="user"/> --> </array> </property>
10、properties
- 說明
<properties>
元素進行裝配檬姥,通過多個<property>
元素設(shè)值曾我,只是properties
元素有一個必填屬性key
,然后可以設(shè)置值 - 示例代碼
<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蛉谜、總結(jié)
- value:指定集合元素是基本數(shù)據(jù)類型或者字符類型值。
- ref:指定集合元素師容器中另一個Bean實例凤优。
- bean:指定集合元素是一個嵌套Bean悦陋。
六、命名空間裝配
1筑辨、概要
除了上述的配置方式外,Spring3.0以上的版本還為上述的方式提供了一些簡寫方式
2幸逆、c
- 說明
命名空間-c屬性名以 “c:” 開頭棍辕,也就是命名空間的前綴,通過構(gòu)造器注入的方式來配置 bean,接下來就是要裝配的構(gòu)造器參數(shù)名 - 示例代碼
<beans ... xmlns:c="http://www.springframework.org/schema/c"> </beans>
<!-- 未引入之前--> <bean id="shop" class="com.wener.example.bean.Shop"> <!--通過構(gòu)造方法注入--> <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>
創(chuàng)建一個 java.util.List
類型的 bean拍顷,其中包含值或引用<util:map>
創(chuàng)建一個 java.util.map
類型的 bean抚太,其中包含值或引用<util:properties>
創(chuàng)建一個 java.util.Properties
類型的 bean<util:property-path>
引用一個 bean 的屬性(或內(nèi)嵌屬性),并將其暴露為 bean <util:set>
創(chuàng)建一個 java.util.Set
類型的 bean,其中包含值或引用<util:constant>
引用某個類型的 public static
域尿贫,并將其暴露為 bean
5电媳、util:list
- 說明
可以通過util:list
來定義一個java.util.List
類型的bean,其子元素就是對應(yīng)的List的元素庆亡,其子元素可以是一切可以用來定義對象的元素匾乓,比如value、bean等又谋,
默認元素的值是String類型拼缝,可以通過value-type
屬性指定元素值的類型,比如數(shù)字類型則指定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對應(yīng)屬性名带膀,而<prop>
元素中間的文本值則為對應(yīng)的屬性值
util:properties
的內(nèi)容也可以來自一個外部文件,此時可以通過location屬性引用對應(yīng)的外部文件,通過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屬性指定對應(yīng)的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>