普通裝配方式
聲明Bean
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(int age) {
this.age = age;
}
public void sayAge(){
System.out.println("age->" + age);
}
}
通過構(gòu)造器注入
在 springTest.xml 中配置:
<bean id="duke" class="類的完全限定名">
<constructor-arg value="15">
<!--如果需要傳入引用對象-->
<constructor-arg ref="引用對象在xml中的id"
</bean>
main 方法中配置:
ApplicationContext ctx = new ClassPathXmlApplicationContext("springTest.xml");
User user = (User) ctx.getBean("tom");
user.sayAge();
Bean的作用域
如果我們需要讓Spring在每次請求時都為Bean產(chǎn)生一個新實例,需要配置Bean的scope
<bean id="ticket" class="..." scope="prototype" />
Spring還提供了其他幾個作用域選項:
- singleton: 在每一個Spring容器中按价,一個Bean定義只有一個對象示例(默認(rèn))
- prototype: 允許Bean的定義可以被實例化任意次(每次調(diào)用都創(chuàng)建一個示例)
- request: 在一次HTTP請求中,每個Bean定義對應(yīng)一個實例恋拍,該作用域僅在基于Web的Spring上下文(例如Spring MVC)中才有效
- session: 在一次HTTP Session中刃宵,每個Bean定義對應(yīng)一個實例什湘,該作用域僅在基于Web的Spring上下文(例如Spring MVC)中才有效
- global-session: 在一個全局HTTP Session中暑脆,每個Bean定義對應(yīng)一個實例箱亿,該作用域僅在基于Web的Spring上下文(例如Spring MVC)中才有效
初始化和銷毀Bean
<bean id="..." class="..."
init-method="初始化后方法名"
destory-method="銷毀前調(diào)用的方法"
/>
還可以配置默認(rèn)的init-method和destory-method:
<?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">
default-init-method="默認(rèn)初始化方法"
default-default-method="默認(rèn)銷毀前調(diào)用的方法"
</beans>
注入Bean屬性
Bean的聲明:
public class User {
private String name;
private int age;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(int age) {
this.age = age;
}
public void sayAge(){
System.out.println("age->" + age);
}
public void sayName() {
System.out.println("name->" + name);
}
}
xml中的配置:
<bean id="jack" class="User">
<constructor-arg value="19"/>
<property name="name" value="Jack" />
<!--如果需要引用其他對象-->
<property name="..." ref="..." />
</bean>
使用Spring的命名空間p裝配屬性
在xml的根標(biāo)簽beans加上以下聲明:
xmlns:p="http://www.springframework.org/schema/p"
使用方式:
<bean id="jack" class="User"
p:name = "Jack"
<!--如果需要屬性為引用對象-->
p:poem-ref = "poem"
/>
裝配集合
Java中共有4中數(shù)據(jù)集合,分別是:
- List: 裝配list類型的值只壳,允許重復(fù)
- Set: 裝配set類型的值俏拱,不允許重復(fù)
- Map: 裝配map類型的值,名稱和值可以是任意類型
- pros: 裝配properties類型的值,名稱和值必須是String類型
以下是裝配 List,Set,Array 的例子
<bean id="libai" class="User">
<property name="poems">
<list>
<ref bean="tangshi" />
<ref bean="songci" />
<ref bean="yuanqu" />
</list>
</property>
</bean>
以下是裝配 Map 的例子
<bean id="libai" class="User">
<property name="poems">
<map>
<entry key="tangshi" value-ref="tangshi" />
<entry key="songci" value-ref="songci" />
<entry key="yuanqu" value-ref="yuanqu"/>
</map>
</property>
</bean>
以下是裝配 properties 的例子
<bean id="libai" class="User">
<property name="poems">
<props>
<prop key="tangshi">唐詩三百首</prop>
<prop key="songci">宋詞五百首</prop>
<prop key="yuanqu">元曲一千首</prop>
</props>
</property>
<!--設(shè)定某屬性為空-->
<property name="someThingNull"><null/></property>
</bean>
使用SpEL表達式裝配
字面值
<!--整形-->
<property name="count" value="#{5}" />
<!--混用-->
<property name="message" value="This count is #{5}"/>
<!--浮點型-->
<property name="floatNum" value="#{89.7}"/>
<!--科學(xué)計數(shù)法-->
<property name="longNum" value="#{1e4}"/>
<!--字符串-->
<property name="str" value="#{'String'}"/>
<!--布爾型-->
<property name="enabled" value="#{false}"/>
引用Bean吼句,properties和方法
<!--引用Bean-->
<property name="BeanID" value="#{Bean}"/>
<!--等同于-->
<property name="BeanID" ref="Bean"/>
<!--引用方法-->
<property name="song" value="#{songSelector.selectSong()}"/>
<!--將返回值全部轉(zhuǎn)換為大寫-->
<property name="song" value="#{songSelector.selectSong().toUpperCase()}"/>
<!--避免NullPointerException異常-->
<property name="song" value="#{songSelector.selectSong()?.toUpperCase}"/>
操作類
在SpEL中锅必,使用 T() 運算符會調(diào)用類的作用域的方法和常量
<!--調(diào)用常量-->
<property name="PI" value="#{T(java.lang.Math).PI}"/>
<!--調(diào)用方法-->
<property name="randomNum" value="#{T(java.lang.Math).random()}"/>
在SpEL上執(zhí)行操作
<property name="arithmetic" value="#{counter.total + 43}"/>
<property name="arithmetic" value="#{counter.total - 43}"/>
<property name="arithmetic" value="#{2 * T(java.lang.Math).PI}"/>
<property name="arithmetic" value="#{counter.total / counter.count}"/>
<property name="arithmetic" value="#{counter.total % 20}"/>
<!--SpEL還提供了平方運算-->
<property name="arithmetic" value="#{T(java.lang.Math).PI ^ 2}"/>
<!--執(zhí)行字符串鏈接-->
<property name="str" value="user.firstName + ' ' + user.lastName"/>
<!--比較值-->
<property name="equal" value="#{counter.total == 1000}"/>
<!--大于等于和小于等于在XML中有特殊含義,SpEL表達式提供了語義化的表達式-->
<!--小于等于-->
<property name="equal" value="#{counter.total le 1000}"/>
<!--大于等于-->
<property name="equal" value="#{counter.total ge 1000}"/>
邏輯表達式
- and
- or
- not或!
條件表達式
與Java中的三目運算符相同
正則表達式
運算符號 : matches
訪問集合成員
<!--提取集合中的元素-->
<property name="city" value="#{cities[2]}"/>
<!--隨機提取元素-->
<property name="city" value="#{cities[T(java.lang.Math).randow() * cities.size()]}"/>
<!--獲取Map中的成員-->
<property name="city" value="#{cities['beijing']}"/>
篩選集合成員
<!--篩選人數(shù)大于等于10萬的城市集合-->
<property name="bigCities" value="#{cities.?[population gt 100000]}"/>
<!--篩選第一個符合條件的集合-->
<property name="bigCities" value="#{cities.^[population gt 100000]}"/>
<!--篩選最后一個符合條件的集合-->
<property name="bigCities" value="#{cities.$[population gt 100000]}"/>
投影集合
集合投影是從集合的每一個成員中選擇特定的屬性放入一個新的集合中惕艳。
例如我們僅僅需要包含城市名稱的一個String類型集合搞隐,而不是City對象集合,就需要如下操作
<property name="cityName" value="#{cities.![name]}"/>
如果需要得到城市名字和國家名稱的集合,比如返回"Beijing,China","NewYork,America"這樣的結(jié)果
<property name="cityName" value="#{cities.![name + ',' + state]}"/>