歡迎移步博客查看-http://futaosmile.oschina.io/coder957
基于XMl的DI
1.集合屬性注入
2.array數(shù)組屬性注入
3.List<>屬性注入
4.Set<>屬性注入
5.Map<K,V>屬性注入
6.Properties屬性注入
7.autowire自動(dòng)注入
8.SPEL注入
School類(lèi)
package Part02.collectionDI;
/**
* Created by futao on 2017/10/10.
*/
public class School {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
'}';
}
}
Some類(lèi)
package Part02.collectionDI;
import java.util.*;
/**
* Created by futao on 2017/10/10.
*/
public class Some {
private School[] schools;
private List<String> myList;
private Set<String> mySet;
private Map<String,Object> myMap;
private Properties myPro;
public void setSchools(School[] schools) {
this.schools = schools;
}
public void setMyList(List<String> myList) {
this.myList = myList;
}
public void setMySet(Set<String> mySet) {
this.mySet = mySet;
}
public void setMyMap(Map<String, Object> myMap) {
this.myMap = myMap;
}
public void setMyPro(Properties myPro) {
this.myPro = myPro;
}
@Override
public String toString() {
return "Some{" +
"schools=" + Arrays.toString(schools) +
", myList=" + myList +
", mySet=" + mySet +
", myMap=" + myMap +
", myPro=" + myPro +
'}';
}
}
配置文件applicationContextcollectionDI.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="some" class="Part02.collectionDI.Some">
<!--數(shù)組-->
<property name="schools">
<array>
<ref bean="school1"/>
<ref bean="school2"/>
<ref bean="school2"/>
<ref bean="school2"/>
</array>
</property>
<!--list-->
<property name="myList">
<list>
<value>張三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<!--這種方式myList的長(zhǎng)度為1俊抵,value里面的值會(huì)被當(dāng)成一個(gè)值-->
<!--<property name="myList" value="張三,李四,王五"/>-->
<!--set-->
<property name="mySet">
<set>
<value>北京</value>
<value>上海</value>
<value>南昌</value>
</set>
</property>
<!--這種方式mySet的長(zhǎng)度為1,value里面的值會(huì)被當(dāng)成一個(gè)值-->
<!--<property name="mySet" value="北京凯力,上海瓤逼,南昌"/>-->
<!--map-->
<property name="myMap">
<map>
<entry key="k1" value-ref="school1"/>
<entry key="k2" value-ref="school2"/>
<entry key="k3" value-ref="school2"/>
<entry key="k4" value-ref="school2"/>
<entry key="k5" value="wechat"/>
</map>
</property>
<property name="myPro">
<props>
<prop key="地址1">上海市</prop>
<prop key="地址2">閔行區(qū)</prop>
<prop key="地址3">吳涇鎮(zhèn)</prop>
<prop key="地址4">紫竹</prop>
<prop key="地址5">數(shù)碼港</prop>
</props>
</property>
</bean>
<bean id="school1" class="Part02.collectionDI.School">
<property name="name" value="Ecjtu"></property>
</bean>
<bean id="school2" class="Part02.collectionDI.School">
<property name="name" value="NCDX"></property>
</bean>
</beans>
測(cè)試
/**
* 基于XML的DI-集合屬性注入
*/
@Test
fun test4collections(){
val classPathXmlApplicationContext = ClassPathXmlApplicationContext("applicationContextcollectionDI.xml")
val some = classPathXmlApplicationContext.getBean("some") as Some
println(GsonBuilder().setPrettyPrinting().create().toJson(some))
}
結(jié)果
{
"schools": [
{
"name": "Ecjtu"
},
{
"name": "NCDX"
},
{
"name": "NCDX"
},
{
"name": "NCDX"
}
],
"myList": [
"張三",
"李四",
"王二"
],
"mySet": [
"北京",
"上海",
"南昌"
],
"myMap": {
"k1": {
"name": "Ecjtu"
},
"k2": {
"name": "NCDX"
},
"k3": {
"name": "NCDX"
},
"k4": {
"name": "NCDX"
},
"k5": "wechat"
},
"myPro": {
"地址3": "吳涇鎮(zhèn)",
"地址2": "閔行區(qū)",
"地址1": "上海市",
"地址5": "數(shù)碼港",
"地址4": "紫竹"
}
}
autowire自動(dòng)裝配
School類(lèi)
package Part02.autoDIbyNameForDomain;
/**
* Created by futao on 2017/10/10.
*/
public class School {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
'}';
}
}
Student類(lèi)
package Part02.autoDIbyNameForDomain;
/**
* Created by futao on 2017/10/10.
*/
public class Student {
private String name;
private int age;
private String address;
private School school;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
public Student() {
}
public Student(String name, int age, String address, School school) {
this.name = name;
this.age = age;
this.address = address;
this.school = school;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
", school=" + school +
'}';
}
}
applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="school1" class="Part02.autoDIbyNameForDomain.School">
<property name="name" value="上海交通大學(xué)"/>
</bean>
<bean id="student" class="Part02.autoDIbyNameForDomain.Student" autowire="byName">
<property name="age" value="18"/>
<property name="address" value="Shanghai"/>
</bean>
</beans>
測(cè)試
/**
* 基于XML的DI-byName方式的域?qū)傩宰詣?dòng)注入
*/
@Test
fun test4autoDIbyNamefordomain() {
val classPathXmlApplicationContext = ClassPathXmlApplicationContext("applicationContextautoDIbyNameForDomain.xml")
val student = classPathXmlApplicationContext.getBean("student") as Part02.autoDIbyNameForDomain.Student
// serializeNulls()->為null的值也顯示出來(lái),setPrettyPrinting()->格式化控制臺(tái)輸出
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student))
println(student)
}
結(jié)果
{
"name": null,
"age": 18,
"address": "Shanghai",
"school": null
}
Student{name='null', age=18, address='Shanghai', school=null}
others
在xml配置文件中伞鲫,autowire有5種類(lèi)型粘茄,可以在<bean/>元素中使用autowire屬性指定
<table>
<tr>
<td>模式</td>
<td>說(shuō)明</td>
</tr>
<tr>
<td>no</td>
<td>不使用自動(dòng)裝配,必須通過(guò)ref元素指定依賴(lài)秕脓,默認(rèn)設(shè)置柒瓣。</td>
</tr>
<tr>
<td>byName</td>
<td> 根據(jù)屬性名自動(dòng)裝配。此選項(xiàng)將檢查容器并根據(jù)名字查找與屬性完全一致的bean吠架,并將其與屬性自動(dòng)裝配芙贫。</td>
</tr>
<tr>
<td>byType</td>
<td> 如果容器中存在一個(gè)與指定屬性類(lèi)型相同的bean,那么將與該屬性自動(dòng)裝配傍药;如果存在多個(gè)該類(lèi)型bean屹培,那么拋出異常,并指出不能使用byType方式進(jìn)行自動(dòng)裝配怔檩;如果沒(méi)有找到相匹配的bean褪秀,則什么事都不發(fā)生,也可以通過(guò)設(shè)置dependency-check="objects"讓Spring拋出異常薛训。</td>
</tr>
<tr>
<td>constructor</td>
<td>與byType方式類(lèi)似媒吗,不同之處在于它應(yīng)用于構(gòu)造器參數(shù)。如果容器中沒(méi)有找到與構(gòu)造器參數(shù)類(lèi)型一致的bean乙埃,那么拋出異常闸英。</td>
</tr>
<tr>
<td>autodetect </td>
<td>通過(guò)bean類(lèi)的自省機(jī)制(introspection)來(lái)決定是使用constructor還是byType方式進(jìn)行自動(dòng)裝配。如果發(fā)現(xiàn)默認(rèn)的構(gòu)造器介袜,那么將使用byType方式甫何。 </td>
</tr>
</table>
可以設(shè)置bean使自動(dòng)裝配失效:
采用xml格式配置bean時(shí),將<bean/>
元素的autowire-candidate屬性設(shè)置為false遇伞,這樣容器在查找自動(dòng)裝配對(duì)象時(shí)辙喂,將不考慮該bean,即它不會(huì)被考慮作為其它bean自動(dòng)裝配的候選者鸠珠,但是該bean本身還是可以使用自動(dòng)裝配來(lái)注入其它bean的巍耗。
需要注意以下情況:
autowird="byType" (type->A)
B extends A
A是一個(gè)bean
如果此時(shí)B也是一個(gè)bean,則會(huì)報(bào)錯(cuò)渐排,該類(lèi)型(A)的bean不止一個(gè)炬太。
因?yàn)锳 a=new B()
B類(lèi)型也可以作為A類(lèi)型根據(jù)autowird="byType"進(jìn)行注入
SPEL注入
Person類(lèi)
package Part02.SPELDI;
/**
* Created by futao on 2017/10/11.
*/
public class Person {
/**
* 姓名
*/
private String pname;
/**
* 年齡
*/
private int page;
/**
* 帶參構(gòu)造方法
*
* @param pname 姓名
* @param page 年齡
*/
public Person(String pname, int page) {
this.pname = pname;
this.page = page;
}
public Person() {
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
@Override
public String toString() {
return "Person{" +
"pname='" + pname + '\'' +
", page=" + page +
'}';
}
/**
* 控制年齡
*
* @return
*/
public int calculateAge() {
return page > 25 ? 25 : page;
}
}
Student類(lèi)
package Part02.SPELDI;
/**
* Created by futao on 2017/10/12.
*/
public class Student {
private String sname;
private int sage;
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
@Override
public String toString() {
return "Student{" +
"sname='" + sname + '\'' +
", sage=" + sage +
'}';
}
}
配置文件
<?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.xsd">
<bean id="person" class="Part02.SPELDI.Person">
<property name="pname" value="老三"/>
<property name="page" value="#{T(java.lang.Math).random()*50}"/>
</bean>
<bean id="student" class="Part02.SPELDI.Student">
<property name="sname" value="#{person.pname}"/>
<!--<property name="sage" value="#{person.page > 25 ? 25:person.page}"/>-->
<property name="sage" value="#{person.calculateAge()}"/>
</bean>
</beans>
測(cè)試
/**
* SPEL注入
*/
@Test
fun test4SPEL(){
val classPathXmlApplicationContext = ClassPathXmlApplicationContext("applicationContextSPEL.xml")
val student = classPathXmlApplicationContext.getBean("student") as Part02.SPELDI.Student
val person = classPathXmlApplicationContext.getBean("person") as Person
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student))
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(person))
student.sage=666
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student))
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(person))
person.page=999
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(student))
println(GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(person))
}
結(jié)果
{
"sname": "老三",
"sage": 25
}
{
"pname": "老三",
"page": 29
}
{
"sname": "老三",
"sage": 666
}
{
"pname": "老三",
"page": 29
}
{
"sname": "老三",
"sage": 666
}
{
"pname": "老三",
"page": 999
}
tips:
如果一個(gè)類(lèi)有帶參的構(gòu)造函數(shù),而沒(méi)有無(wú)參的構(gòu)造函數(shù)驯耻,那么在注冊(cè)bean的時(shí)候必須使用構(gòu)造注入亲族。