转载

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:listid="cities">
	<value>徐州</value>
	<value>无锡</value>
	<value>常州</value>
</util:list>

<util:setid="friends">
	<value>Jack</value>
	<value>Tom</value>
	<value>陈加兵</value>
</util:set>


<util:mapid="bookes">
	<entrykey="1001"value="java编程基础"></entry>
	<entrykey="1002"value="java编程思想"></entry>
</util:map>

<!-- 引入外部的Properties文件,location指定的就是位置 -->
<util:propertiesid="properties"location="classpath:jdbc.properties"></util:properties>

<beanid="message"class="cn.tedu.spring.beans.Message">
	<propertyname="name"value="陈加兵"></property>
	<!-- List集合的注入 ref指定的上面定义的List的id -->
	<propertyname="cities"ref="cities"></property>

	<!-- Set集合的注入 -->
	<propertyname="friend"ref="friends"></property>

	<!-- Map集合的注入 -->
	<propertyname="bookes"ref="bookes"></property>

	<!-- properties的集合的注入 -->
	<propertyname="properties"ref="properties"></property>

	<!-- 为数组赋值 -->
	<propertyname="names">
		<array>
			<value>Alex</value>
			<value>Billy</value>
		</array>
	</property>
</bean>

<!-- 配置ValueBean -->
<beanid="valueBean"class="cn.tedu.spring.beans.ValueBean">
	<!-- value的值是使用spring表达式获取的,形式为:#{前面定义好的id.属性名} -->
	<propertyname="username"value="#{message.name}"></property>
</bean>

引用数组集合或者List的值

  • 直接使用 #{bean的id.数组名[index]}
<!-- 配置ValueBean -->
<beanid="valueBean"class="cn.tedu.spring.beans.ValueBean">
	<!-- value的值是使用spring表达式获取的,形式为:#{前面定义好的id.属性名} -->
	<propertyname="username"value="#{message.names[0]}"></property>
</bean>

ValueBean的name属性设置为Person中的Address对象的city值

  • #{person.address.city}

  • Person类中有一个成员变量是Address类的对象

  • 这里不再写这三个类了,直接在spring中配置
<!-- 创建一个Address的实例 -->
	<beanid="address"class="cn.tedu.spring.beans.Address">
		<propertyname="city"value="无锡"></property>
		<propertyname="pro"value="江苏"></property>
	</bean>

	<beanid="person"class="cn.tedu.spring.beans.Person">
		<propertyname="name"value="陈加兵"></property>
		<propertyname="age"value="22"></property>
		<!-- 引用上面address -->
		<propertyname="address"ref="address"></property>
	</bean>

	<!-- 配置ValueBean -->
	<beanid="valueBean"class="cn.tedu.spring.beans.ValueBean">
		<!-- value的值是使用spring表达式获取的,形式为:#{前面定义好的id.属性名} -->
		<propertyname="username"value="#{person.address.city}"></property>
	</bean>

引用Map集合中的某个value

  1. #{id.Map名称.key名称}
  2. #{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 的配置文件
<beanid="userDao"class="cn.tedu.spring.UserDao"/>

<!--这里不需要配置property节点来ref上面定义的bean,只需要使用自动装配即可-->
<beanid="userService"class="cn.tedu.spring.UserService"autowire="byName">
原文  https://chenjiabing666.github.io/2018/04/24/Spring表达式和自动装配/
正文到此结束
Loading...