NO.7 Spring IOC DI依赖注入(2)
四:注入集合
在spring IOC 容器中,向bean属性注入集合,也是通过property标签注入 ,不同的集合在注入值时,采用的标签不一样,
如果是list类型,则使用标签
<bean id="class" class="com.xt.spring.ioc.test.Classes">
<property name="className" value="5班"></property>
<property name="stuNames">
<list>
<value>小强</value>
<value>小红</value>
<value>小明</value>
</list>
</property>
</bean>
如果是set类型,则使用标签
<bean id="class" class="com.xt.spring.ioc.test.Classes">
<property name="className" value="5班"></property>
<property name="scores">
<set>
<value>95</value>
<value>90</value>
<value>100</value>
</set>
</property>
</bean>
如果是map类型,则采用标签
<bean id="class" class="com.xt.spring.ioc.test.Classes">
<property name="className" value="5班"></property>
<property name="map">
<map>
<entry key="小强" value="1500"></entry>
<entry key="小红" value="1800"></entry>
<entry key="小明" value="1000"></entry>
</map>
</property>
</bean>
代码复用——若两个类中含有相同的list、set、map,可使用工具标签标签,声明公用集合,需要引入util命名空间及xsd文件。xmlns:util=”http://www.springframework.org/schema/util”
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
使用util:类型 配置一个id属性提供引用,其他配置与原集合标签一样。在使用时,bean属性值内容需要使用ref属性引用公用集合。
<?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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="class" class="com.xt.spring.ioc.test.Classes">
<property name="map" ref="stuScoresMap"></property>
</bean>
<util:map id="stuScoresMap">
<entry key="小强" value="1500"></entry>
<entry key="小红" value="1800"></entry>
<entry key="小明" value="1000"></entry>
</util:map>
</beans>
五:p 命名空间
为了简化 XML 文件的配置,越来越多的 XML 文件采用属性而非子元素配置信息。
Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 元素属性的方式配置 Bean 的属性。
使用 p 命名空间后,基于 XML 的配置方式将进一步简化。
需要声明p命名空间:
xmlns:p=”http://www.springframework.org/schema/p”
使用:
在bean标签内 通过p:属性名 = “属性值”方式向bean属性注入值,如果bean的属性为另外bean的引用,则需要p:属性名-ref=”bean的Id”
<bean id="stu" class="com.xt.spring.ioc.test.Student" p:stuNo="2016123456" p:stuName="小明" p:coll-ref="coll"></bean>
<bean id="coll" class="com.xt.spring.ioc.test.Colledge" >
<property name="id" value="0"></property>
<property name="name" value="****学院"></property>
</bean>
六:专项配置专项文件
Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量。
<context:property-placeholder location="classpath:DB.properties"/>
<bean id="dataSource" class="com.xt.spring.ioc.test.DBDataSourse">
<property name="driverName" value="${driverName}"></property>
<property name="url" value="${url}"></property>
<property name="userName" value="${userName}"></property>
<property name="passwd" value="${passwd}"></property>
</bean>
DB.properties为:(“=”后为属性值)
driverName=
url=
userName=
passwd=
DBDataSourse为
package com.xt.spring.ioc.test;
public class DBDataSourse {
private String driverName;
private String url;
private String userName;
private String passwd;
public String getDBConn(){
System.out.println("获取数据库链接了。。。。");
return "mysql数据库链接";
}
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String toString() {
return "DBDataSourse [driverName=" + driverName + ", url=" + url + ", userName=" + userName + ", passwd=" + passwd + "]";
}
}
七:SpEL表达式
Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。
语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL。
SpEL 为 bean 的属性进行动态赋值提供了便利。
Spring EL 支持大多数的数学操作符、逻辑操作符、关系操作符。
1)关系操作符
包括:等于 (==, eq),不等于 (!=, ne),小于 (<, lt),,小于等于(<= , le),大于(>, gt),大于等于 (>=, ge)
2)逻辑操作符
包括:and,or,and not(!)
3)数学操作符
包括:加 (+),减 (-),乘 (*),除 (/),取模 (%),幂指数 (^)。
SpEL作用:
1)通过 bean 的 id 对 bean 进行引用
2)调用方法以及引用对象中的属性
3)计算表达式的值
4)正则表达式的匹配
<bean id="spel" class="com.xt.spring.ioc.test.SpelTest">
<property name="avgAge" value="#{117/3}"></property>
<property name="passwd" value="#{dataSourse.passwd}" ></property>
<property name="dataSourse" value="#{dataSourse}"></property>
<property name="DBConn" value="#{dataSourse.getDBConn()}"></property>
</bean>
SpelTest为:
package com.xt.spring.ioc.test;
public class SpelTest {
private int avgAge;
private String passwd;
private DBDataSourse dataSourse;
private String DBConn;
public int getAvgAge() {
return avgAge;
}
public void setAvgAge(int avgAge) {
this.avgAge = avgAge;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public DBDataSourse getDataSourse() {
return dataSourse;
}
public void setDataSourse(DBDataSourse dataSourse) {
this.dataSourse = dataSourse;
}
public String getDBConn() {
return DBConn;
}
public void setDBConn(String dBConn) {
DBConn = dBConn;
}
@Override
public String toString() {
return "SpelTest [avgAge=" + avgAge + ", passwd=" + passwd + ", dataSourse=" + dataSourse + ", DBConn=" + DBConn + "]";
}
}
倘若想要获取工厂创建的对象,同样采用如下方式获取:
DBDataSourse data = ioc0.getBean(“dataSource”,DBDataSourse.class);
SpelTest data = ioc0.getBean(“spel”,SpelTest.class);