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);
}
}

浙公网安备 33010602011771号