3.属性注入

**Spring框架的属性注入(重点掌握)**
	
	1. 对于类成员变量,注入方式有三种
		* 构造函数注入
		* 属性setter方法注入(开发中使用的比较多的)
		* 接口注入
	
	2. 在Spring框架中提供了前两种的属性注入的方式
		1. 构造方法的注入方式,两步
			* 编写Java的类,提供构造方法
				public class Car {
					private String name;
					private double money;
					public Car(String name, double money) {
						this.name = name;
						this.money = money;
					}
					@Override
					public String toString() {
						return "Car [name=" + name + ", money=" + money + "]";
					}
				}
			
			* 编写配置文件
				<bean id="car" class="com.itheima.demo4.Car">
					<constructor-arg name="name" value="大奔"/>
					<constructor-arg name="money" value="100"/>
				</bean>
		
		2. 属性的setter方法的注入方式
			* 编写Java的类,提供属性和对应的set方法即可。
			* 编写配置文件
		
		3. 如果Java类的属性是另一个Java的类,那么需要怎么来注入值呢?
			* <property name="name" rel="具体的Bean的ID或者name的值"/>
			* 例如:
				<bean id="person" class="com.itheima.demo4.Person">
					<property name="pname" value="美美"/>
					<property name="car2" ref="car2"/>
				</bean>

构造函数注入:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd ">

	
	<!-- 将Car对象配置到容器中 -->
	<bean name="car" class="cn.itcast.bean.Car" >
		<property name="name" value="兰博基尼"></property>
		<property name="color" value="黄色"></property>
	</bean>
	
	
<!--  ======================================================================-->

	<!-- 构造函数注入 -->
	<bean name="user2" class="cn.itcast.bean.User">
		<constructor-arg name="name" value="jerry"></constructor-arg>
		<constructor-arg name="car" ref="car"></constructor-arg>
	</bean>

</beans>

User

public class User {

	private String name;
	private Integer age;
	private Car car;
	
	public User(String name, Car car) {
		System.out.println("User(String name, Car car)!!!!");
		this.name = name;
		this.car = car;
	}
	public Car getCar() {
		return car;
	}
	public void setCar(Car car) {
		this.car = car;
	}
	public User() {
		System.out.println("User对象空参构造方法");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
	}
	
}

Demo

public class Demo {

	@Test
	//构造函数注入
	public void fun2(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/c_injection/applicationContext.xml");
		User user = (User) ac.getBean("user2");
		System.out.println(user);
	}
}

 

 

set方法注入:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd ">
	
	<!-- set方式注入: -->
	<bean name="user" class="cn.itcast.bean.User">
		<!-- 值类型注入:为User对象中名为name的属性注入tom作为值 -->
		<property name="name" value="tom"></property>
		<property name="age"  value="18"></property>
		<!-- 引用类型注入:为car属性注入下方配置的car对象 -->
		<property name="car" ref="car"></property>
	</bean>
	
	<!-- 将Car对象配置到容器中 -->
	<bean name="car" class="cn.itcast.bean.Car" >
		<property name="name" value="兰博基尼"></property>
		<property name="color" value="黄色"></property>
	</bean>
	
</beans>

Car

public class Car {

	private String name;
	private String color;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	@Override
	public String toString() {
		return "Car [name=" + name + ", color=" + color + "]";
	}
	
}

User

public class User {

	private String name;
	private Integer age;
	private Car car;
	
	public Car getCar() {
		return car;
	}
	public void setCar(Car car) {
		this.car = car;
	}
	public User() {
		System.out.println("User对象空参构造方法");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
	}
	
}

Demo

public class Demo {

	@Test
	//set方法注入
	public void fun1(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/c_injection/applicationContext.xml");
		User user = (User) ac.getBean("user");
		System.out.println(user);
	}
}

  

p空间名称注入

**Spring的2.5版本中提供了一种:p名称空间的注入(了解)**

	1. 步骤一:需要先引入 p 名称空间
		* 在schema的名称空间中加入该行:xmlns:p="http://www.springframework.org/schema/p"

	2. 步骤二:使用p名称空间的语法
		* p:属性名 = ""
		* p:属性名-ref = ""
	
	3. 步骤三:测试
		* <bean id="person" class="com.itheima.demo4.Person" p:pname="老王" p:car2-ref="car2"/>
 xmlns:p="http://www.springframework.org/schema/p"

         <!-- 采用名称空间的方式注入值 -->
         <bean id="computer2" class="demo4.Computer" p:cname="神州" p:money="2000"></bean>

         <!-- 采用名称空间的方式设置人的属性  -->
        <bean id="person2" class="demo4.Person" p:pname="风车车" p:com-ref="computer2"></bean>


	<!--  使用SpEL表达式的反射 -->
	 <bean id="bird1" class="demo5.Bird">
	 	<property name="bname" value="#{'贾雀'}"></property>
	 	<property name="money" value="#{25.5}"></property>
	 </bean>
	 
	 <bean id="user" class="demo5.User">
	 	<property name="uname" value="#{'艾福西西'}"></property>
	 	<property name="bird" value="#{bird1}"></property>
	 </bean>                

 

复杂类型注入:

<!--  演示集合的注入 -->
	<bean id="collectionBean" class="demo6.CollectionBean">
		<property name="arrs">
			<list>
				<value>小美</value>
				<value>小综</value>
			</list>
		</property>
		
		<property name="list">
			<list>
				<value>哈哈</value>
				<value>呵呵</value>
			</list>
		</property>
		
		<property name="set">
			<set>
				<value>奇瑞QQ</value>
				<value>长安奔奔</value>
			</set>
		</property>
		
		<property name="map">
			<map>
				<entry key="aaa" value="AAA"></entry>
				<entry key="bbb" value="BBB"></entry>
			</map>
		</property>
		
		<property name="pro">
			<props>
				<prop key="uname">root</prop>
				<prop key="pass">123</prop>
			</props>
		</property>
	</bean>

CollectionBean:

package demo6;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class CollectionBean {

	//数组
	private String[] arrs;

	public void setArrs(String[] arrs) {
		this.arrs = arrs;
	}

	private List<String> list;
	public void setList(List<String> list) {
		this.list = list;
	}
	
	private Set<String> set;
	public void setSet(Set<String> set) {
		this.set = set;
	}
	
	private Map<String,String> map;
	public void setMap(Map<String, String> map) {
		this.map = map;
	}
	
	private Properties pro;
	public void setPro(Properties pro) {
		this.pro = pro;
	}
	
	public String toString() {
		return "CollectionBean [arrs=" + Arrays.toString(arrs) + ", list=" + list + ", set=" + set + ", map=" + map
				+ ", pro=" + pro + "]";
	}
}

SpringDemo6:

package demo6;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import demo5.Bird;

public class SpringDemo6 {
	
	@Test
	public void run1(){
		ApplicationContext as=new ClassPathXmlApplicationContext("applicationContext.xml");
		CollectionBean b=(CollectionBean) as.getBean("collectionBean");
		System.out.println(b);
	}
}

  

  

  

  

  

  

  

  

  

  

  

  

posted @ 2018-03-13 23:08  一日看尽长安花cxjj  阅读(128)  评论(0)    收藏  举报