Spring表达式和自动装配
【重要】spring表达式
作用
-
通过spring表达式可以在配置
Y
节点时,如果Y的某些属性需要注入值,可以是已经配置的好的X
类的节点中的值 -
直接使用
#{id.属性名}
前提
- 必须为每个属性都要设置
set
方法
实现
-
新建两个类
-
Message
public class Message {
private String name;
private List<String> cities; //城市 。List集合
private Set<String> friend; //Set集合
private Map<Integer,String> bookes; //Map集合
private Properties properties; //Properties集合
private String[] names;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getNames() {
return names;
}
public void setNames(String[] names) {
this.names = names;
}
public List<String> getCities() {
return cities;
}
public void setCities(List<String> cities) {
this.cities = cities;
}
public Set<String> getFriend() {
return friend;
}
public void setFriend(Set<String> friend) {
this.friend = friend;
}
public Map<Integer, String> getBookes() {
return bookes;
}
public void setBookes(Map<Integer, String> bookes) {
this.bookes = bookes;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
- ValueBean的类
public class ValueBean {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
获取不是集合类型的值
- 在sprig的配置文件中配置如下:
<util:list id="cities">
<value>徐州</value>
<value>无锡</value>
<value>常州</value>
</util:list>
<util:set id="friends">
<value>Jack</value>
<value>Tom</value>
<value>陈加兵</value>
</util:set>
<util:map id="bookes">
<entry key="1001" value="java编程基础"></entry>
<entry key="1002" value="java编程思想"></entry>
</util:map>
<!-- 引入外部的Properties文件,location指定的就是位置 -->
<util:properties id="properties" location="classpath:jdbc.properties"></util:properties>
<bean id="message" class="cn.tedu.spring.beans.Message">
<property name="name" value="陈加兵"></property>
<!-- List集合的注入 ref指定的上面定义的List的id -->
<property name="cities" ref="cities"></property>
<!-- Set集合的注入 -->
<property name="friend" ref="friends"></property>
<!-- Map集合的注入 -->
<property name="bookes" ref="bookes"></property>
<!-- properties的集合的注入 -->
<property name="properties" ref="properties"></property>
<!-- 为数组赋值 -->
<property name="names">
<array>
<value>Alex</value>
<value>Billy</value>
</array>
</property>
</bean>
<!-- 配置ValueBean -->
<bean id="valueBean" class="cn.tedu.spring.beans.ValueBean">
<!-- value的值是使用spring表达式获取的,形式为:#{前面定义好的id.属性名} -->
<property name="username" value="#{message.name}"></property>
</bean>
引用数组集合或者List的值
- 直接使用
#{bean的id.数组名[index]}
<!-- 配置ValueBean -->
<bean id="valueBean" class="cn.tedu.spring.beans.ValueBean">
<!-- value的值是使用spring表达式获取的,形式为:#{前面定义好的id.属性名} -->
<property name="username" value="#{message.names[0]}"></property>
</bean>
ValueBean的name属性设置为Person中的Address对象的city值
-
#{person.address.city}
-
Person类中有一个成员变量是Address类的对象
-
这里不再写这三个类了,直接在spring中配置
<!-- 创建一个Address的实例 -->
<bean id="address" class="cn.tedu.spring.beans.Address">
<property name="city" value="无锡"></property>
<property name="pro" value="江苏"></property>
</bean>
<bean id="person" class="cn.tedu.spring.beans.Person">
<property name="name" value="陈加兵"></property>
<property name="age" value="22"></property>
<!-- 引用上面address -->
<property name="address" ref="address"></property>
</bean>
<!-- 配置ValueBean -->
<bean id="valueBean" class="cn.tedu.spring.beans.ValueBean">
<!-- value的值是使用spring表达式获取的,形式为:#{前面定义好的id.属性名} -->
<property name="username" value="#{person.address.city}"></property>
</bean>
引用Map集合中的某个value
#{id.Map名称.key名称}
#{id.Map名称['key名称']}
【了解】spring表达式支持方法的调用
【了解】 自动装装配(autowire)
-
<bean id="" class="" autowire="">
-
自动装配表现为不需要配置
<property>
节点来注入,spring会自动的为属性注入值 -
在
bean
节点中添加autowire
属性以配置自动装配,当值为byName
,表示根据名称自动装配,即spring会检查这个bean的所有属性名称,然后在搜平日那个管理的所有Bean中查找bean-id一致的Bean对象,如果找到,则自动赋值 -
当取值为
byType
时,表示根据类型自动装配,及自动化赋值的标准是找数据类型匹配的Bean对象,需要注意的是:如果根据类型装配,必须保证可以匹配上的,由spring自动管理的Bean只有一个,如果有2个或者更多,会导致异常
实例
- UserDao
public class UserDao(){
public void reg(){
}
}
- UserService
public class UserService{
private UserDao userDao;
private void reg(){
userDao.reg();
}
}
- spring 的配置文件
<bean id="userDao" class="cn.tedu.spring.UserDao"/>
<!--这里不需要配置property节点来ref上面定义的bean,只需要使用自动装配即可-->
<bean id="userService" class="cn.tedu.spring.UserService" autowire="byName">
网友评论