set注入专题1接代码写在course5中.set注入专题级联属性赋值25
要点:
●在spring配置文件中,如上,注意顺序。
●clazz属性必须在spring配置文件中提供getter方法
com.powernode.spring6.bean
Clazz
package com.powernode.spring6.bean;/** * set注入专题级联属性赋值 25 * 表示班级 **/public class Clazz { // 班级名称 private String name; public void setName(String name) { this.name = name; } @Override public String () { return "Clazz{" + "name='" + name + '\'' + '}'; }}
Student
package com.powernode.spring6.bean;/** * set注入专题级联属性赋值 25 * 表示学生 **/public class Student { private String name; // 学生属于哪个班? private Clazz clazz; public void setClazz(Clazz clazz) { this.clazz = clazz; } // 使用级联属性赋值,这需要这种get方法。 public Clazz getClazz() { return clazz; } public void setName(String name) { this.name = name; } @Override public String () { return "Student{" + "name='" + name + '\'' + ", clazz=" + clazz + '}'; }}
<!--使用级联属性赋值需要注意两点: 25 1. 配置顺序不能颠倒,必须按以下顺序进行。 2. 必须提供clazz属性的getter方法。 --> <bean id="studentBean" class="com.powernode.spring6.bean.Student"> <!--使用value简单类型--> <property name="name" value="张三"/> <!--这不是一个简单的类型,使用ref--> <property name="clazz" ref="clazzBean"/> <!--级联属性赋值 25--> <property name="clazz.name" value=“高三二班”/> </bean> <bean id="clazzBean" class="com.powernode.spring6.bean.Clazz"></bean> <!--<bean id="clazzBean" class="com.powernode.spring6.bean.Clazz"> <property name="name" value=“高三一班”/> </bean>-->
///set注入专题级联属性赋值 25 @Test public void testCascade(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("cascade.xml"); Student studentBean = applicationContext.getBean("studentBean", Student.class); System.out.println(studentBean); Clazz clazzBean = applicationContext.getBean("clazzBean", Clazz.class); System.out.println(clazzBean); }
2.set注入专题注入数组26要点:
●若数组类型简单,则使用value标签。
●若数组中是非简单类型,则使用ref标签。
com.powernode.spring6.bean
Woman
package com.powernode.spring6.bean;/** * set注入专题注入数组 26 **/public class Woman { private String name; public void setName(String name) { this.name = name; } @Override public String () { return "Woman{" + "name='" + name + '\'' + '}'; }}
QianDaYe
package com.powernode.spring6.bean;import java.util.Arrays;/** * set注入专题注入数组 26 **/public class QianDaYe { //String 是简单类型 26 private String[] aiHaos; public void setAiHaos(String[] aiHaos) { this.aiHaos = aiHaos; } // 多个女性朋友 这不是一个简单的类型 26 private Woman[] womens; public void setWomens(Woman[] womens) { this.womens = womens; } @Override public String () { return "QianDaYe{" + "aiHaos=" + Arrays.(aiHaos) + ", womens=" + Arrays.(womens) + '}'; }}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- set注入专题注入数组 26--> <bean id="w1" class="com.powernode.spring6.bean.Woman"> <property name="name" value="小花"/> </bean> <bean id="w2" class="com.powernode.spring6.bean.Woman"> <property name="name" value="小亮"/> </bean> <bean id="w3" class="com.powernode.spring6.bean.Woman"> <property name="name" value="小明"/> </bean> <bean id="yuQian" class="com.powernode.spring6.bean.QianDaYe"> <!-- 这个数组属性中的元素类型是String的简单类型 26--> <property name="aiHaos"> <array> <value>抽烟</value> <value>喝酒</value> <value>烫头</value> </array> </property> <!-- 这个数组中的类型不是简单的类型--> <property name="womens"> <array> <ref bean="w1"/> <ref bean="w2"/> <ref bean="w3"/> </array> </property> </bean></beans>
/set注入专题注入数组 26 @Test public void testArray(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-array.xml"); QianDaYe yuQian = applicationContext.getBean("yuQian", QianDaYe.class); System.out.println(yuQian); }
3.List和Set集合27set注入专题List集合:有序可重复
注:注入List集合时使用List标签,如果List集合是简单类型使用value标签,则使用ref标签。
Set集合:无序不能重复
要点:
●使用标签
●set集中元素是使用value标签的简单类型,相反,使用ref标签
在这里,代码和第四点一起写
4.Map和Properties28set注入专题Map要点:
●使用标签
●若key类型简单,则使用key属性,则使用key-ref属性。
●假如value是一种简单的类型,使用value属性,反之,使用value-ref属性。
Properties要点:
java.util.Properties继承java.util.Hashtable,所以Properties也是Map集合。
●使用标签嵌套标签完成。
package com.powernode.spring6.bean;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.Set;/** * List和Set集合注入set专题 27 **/public class Person { // 注入List集合 private List names; // 注入Set集合 private Set addrs; // 注入Map集合 28 // 多个电话 private Map phones; // 注入属性类对象 28 // 本质上,Properties也是Map集合。 // Properties的父类Hashtable,Hashtable实现了Map接口。 // Properties的父类Hashtable,Hashtable实现了Map接口。 // 虽然这也是一个Map集合,但它有点像Map的注入方式,但不同。 // Propertieskey和value只能是String类型。 private Properties properties; public void setProperties(Properties properties) { this.properties = properties; } public void setPhones(Map phones) { this.phones = phones; } public void setNames(List names) { this.names = names; } public void setAddrs(Set addrs) { this.addrs = addrs; } @Override public String toString() { return "Person{" + "names=" + names + ", addrs=" + addrs + ", phones=" + phones + ", properties=" + properties + '}'; }}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- List和Set集合注入set专题 27--> <bean id="personBean" class="com.powernode.spring6.bean.Person"> <property name="properties"> <!--注入Properties属性对象--> <props> <prop key="driver">com.mysql.cj.jdbc.Driver</prop> <prop key="url">jdbc:mysql://localhost:3306/spring6</prop> <prop key="username">root</prop> <prop key="password">123456</prop> </props> </property> <property name="phones"> <!--注入Map集合 28--> <map> <!--注入Map集合 28--> <map> <!--如果key和value不是简单的类型,请使用此配置。--> <!--<entry key-ref="" value-ref=""/>--> <!--如果是简单的类型,key和value--> <entry key="1" value="110"/> <entry key="2" value="120"/> <entry key="3" value="119"/> </map> </property> <property name="names"> <!--list集合有序可重复--> <list> <value>张三</value> <value>李四</value> <value>王五</value> <value>张三</value> <value>张三</value> <value>张三</value> <value>张三</value> </list> </property> <property name="addrs"> <!--set集合无序不能重复--> <set> <value>北京大兴区</value> <value>北京大兴区</value> <value>北京海淀区</value> <value>北京海淀区</value> <value>北京大兴区</value> </set> </property> </bean></beans>
///set注入专题List和set集合 27 //set注入专题Map和Propertiese 28 @Test public void testCollection(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-collection.xml"); Person personBean = applicationContext.getBean("personBean", Person.class); System.out.println(personBean); }
5.注入nulll和空字符串295.1注入set专题使用注入空字符串,或value=“”
●让我们来看看如何注入空字符串。
<!--第一种方法是注入空字符串--><!-- <property name="name" value=""/>--> <!--第二种方法是注入空字符串--> <property name="name"> <value/> </property>
5.2如何注入null?29注入null使用:或者不赋值该属性
第一种方法:默认注入nullll而不给属性赋值
<!--不注入属性,属性的默认值为null--> <!--<property name="name" value="tom"></property>--> <property name="age" value="20"/> <!-- 这不是注入null,而是注入一个“”null"字符串--><!-- <property name="name" value="null"/>-->
第二种方式:使用
<!--这种方法是手动注入nullll--> <property name="name"> <null/> </property>
com.powernode.spring6.bean
Cat
package com.powernode.spring6.bean;/** * @author 动力节点 * @version 1.0 * @className Cat * @since 1.0 **/public class Cat { private String name; private int age; public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Cat{" + "name='" + name + '\'' + ", age=" + age + '}'; }}
set-di.xml
///set注入null和空字符串 29 @Test public void testNull(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("set-di.xml"); Cat catBean = applicationContext.getBean("catBean", Cat.class); //System.out.println(catBean); System.out.println(catBean.getName().toUpperCase()); }
6.set注入特殊字符30com.powernode.spring6.bean
MathBean
package com.powernode.spring6.bean;/** * 特殊字符注入set注入专题 30 **/public class MathBean { private String result; public void setResult(String result) { this.result = result; } @Override public String toString() { return "MathBean{" + "result='" + result + '\'' + '}'; }}
XML有五个特殊字符,分别是:<、>、'、"、&
XML将特别对待上述五个特殊符号,并将其作为XML语法的一部分进行分析。如果这些特殊符号直接出现在注入的字符串中,则会报告错误。
6.1第一种:转义字符代替特殊符号。30对应五个特殊字符的转义字符是:
特殊字符
转义字符
>
>
<
<
'
'
"
"
&
&
<!-- 第一种方案:用实体符号代替特殊符号--> <property name="result" value="2 < 3" />
///set注入特殊字符 30 @Test public void testSpecial(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("set-di.xml"); MathBean mathBean = applicationContext.getBean("mathBean", MathBean.class); System.out.println(mathBean); }
6.2第二种:30将含有特殊符号的字符串放入:其中。XML文件解析器不会分析CDATA区域中的数据。
注:使用CDATA时,value不能使用属性,value只能使用标签。
<!--第二种方案:使用<![CDATA[]]>--> <property name="result"> <!--value标签只能使用--> <value><![CDATA[2 < 3]]></value> </property>
///set注入特殊字符 30 @Test public void testSpecial(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("set-di.xml"); MathBean mathBean = applicationContext.getBean("mathBean", MathBean.class); System.out.println(mathBean); }