Spring基于XML管理bean---(下)---特殊值处理p名称空间bean属性赋值(集合)
Posted 写Bug的渣渣高
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring基于XML管理bean---(下)---特殊值处理p名称空间bean属性赋值(集合)相关的知识,希望对你有一定的参考价值。
特殊值处理
声明一个类
public class PropValue
private String commonValue;
private String expression;
public String getCommonValue()
return commonValue;
public void setCommonValue(String commonValue)
this.commonValue = commonValue;
public String getExpression()
return expression;
public void setExpression(String expression)
this.expression = expression;
@Override
public String toString()
return "PropValue" +
"commonValue='" + commonValue + '\\'' +
", expression='" + expression + '\\'' +
'';
public PropValue(String commonValue, String expression)
this.commonValue = commonValue;
this.expression = expression;
public PropValue()
2、字面量
①用Java代码举例说明
字面量是相对于变量来说的。看下面的代码:
int a = 10;
声明一个变量a,初始化为10,此时a就不代表字母a了,而是作为一个变量的名字。当我们引用a的时候,我们实际上拿到的值是10。
而如果a是带引号的:‘a’,那么它现在不是一个变量,它就是代表a这个字母本身,这就是字面量。所以字面量没有引申含义,就是我们看到的这个数据本身。
②Spring配置文件中举例
[1]字面量举例
<!-- 使用value属性给bean的属性赋值时,Spring会把value属性的值看做字面量 -->
<property name="commonValue" value="hello"/>
[2]类似变量举例
<!-- 使用ref属性给bean的属性复制是,Spring会把ref属性的值作为一个bean的id来处理 -->
<!-- 此时ref属性的值就不是一个普通的字符串了,它应该是一个bean的id -->
<property name="happyMachine" ref="happyMachine"/>
3、null值
<property name="commonValue">
<!-- null标签:将一个属性值明确设置为null -->
<null/>
</property>
4、XML实体
<!-- 实验九 给bean的属性赋值:特殊值处理 -->
<bean id="propValue" class="com.ggzx.ioc.component.PropValue">
<!-- 小于号在XML文档中用来定义标签的开始,不能随便使用 -->
<!-- 解决方案一:使用XML实体来代替 -->
<property name="expression" value="a < b"/>
</bean>
5、CDATA节
<!-- 实验九 给bean的属性赋值:特殊值处理 -->
<bean id="propValue" class="com.ggzx.ioc.component.PropValue">
<property name="expression">
<!-- 解决方案二:使用CDATA节 -->
<!-- CDATA中的C代表Character,是文本、字符的含义,CDATA就表示纯文本数据 -->
<!-- XML解析器看到CDATA节就知道这里是纯文本,就不会当作XML标签或属性来解析 -->
<!-- 所以CDATA节中写什么符号都随意 -->
<value><![CDATA[a < b]]></value>
</property>
</bean>
使用p名称空间
## 1、配置
使用 p 名称空间的方式可以省略子标签 property,将组件属性的设置作为 bean 标签的属性来完成。
```xml
<!-- 实验十 给bean的属性赋值:使用p名称空间 -->
<bean id="happyMachine3"
class="com.ggzx.ioc.component.HappyMachine"
p:machineName="goodMachine"
/>
使用 p 名称空间需要导入相关的 XML 约束,在 IDEA 的协助下导入即可:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
具体操作时,输入p:稍微等一下,等IDEA弹出下面的提示:
2、测试
@Test
public void testExperiment10()
HappyMachine happyMachine3 = (HappyMachine) iocContainer.getBean("happyMachine3");
String machineName = happyMachine3.getMachineName();
System.out.println("machineName = " + machineName);
bean属性赋值:集合
1、给组件类添加属性
2、配置
<!-- 实验十三 集合类型的bean -->
<bean id="happyTeam2" class="com.atguigu.ioc.component.HappyTeam">
<property name="memberList">
<list>
<value>member01</value>
<value>member02</value>
<value>member03</value>
</list>
</property>
</bean>
3、测试
@Test
public void testExperiment13()
HappyTeam happyTeam2 = (HappyTeam) iocContainer.getBean("happyTeam2");
List<String> memberList = happyTeam2.getMemberList();
for (String member : memberList)
System.out.println("member = " + member);
4、其他变化形式
<!-- 实验十一 给bean的属性赋值:集合属性 -->
<bean id="happyTeam2" class="com.atguigu.ioc.component.HappyTeam">
<property name="memberNameList">
<!-- list标签:准备一组集合类型的数据,给集合属性赋值 -->
<!--<list>
<value>member01</value>
<value>member02</value>
<value>member03</value>
</list>-->
<!-- 使用set标签也能实现相同效果,只是附带了去重功能 -->
<!--<set>
<value>member01</value>
<value>member02</value>
<value>member02</value>
</set>-->
<!-- array也同样兼容 -->
<array>
<value>member01</value>
<value>member02</value>
<value>member02</value>
</array>
</property>
<property name="managerList">
<!-- 给Map类型的属性赋值 -->
<!--<map>
<entry key="财务部" value="张三"/>
<entry key="行政部" value="李四"/>
<entry key="销售部" value="王五"/>
</map>-->
<!-- 也可以使用props标签 -->
<props>
<prop key="财务部">张三2</prop>
<prop key="行政部">李四2</prop>
<prop key="销售部">王五2</prop>
</props>
</property>
</bean>
自动装配
1、声明组件类
其中HappyController需要用到HappyService。所谓自动装配就是一个组件需要其他组件时,由 IOC 容器负责找到那个需要的组件,并装配进去。
public class HappyController
private HappyService happyService;
public HappyService getHappyService()
return happyService;
public void setHappyService(HappyService happyService)
this.happyService = happyService;
public class HappyService
2、配置
<!-- 实验十二 自动装配 -->
<bean id="happyService3" class="com.atguigu.ioc.component.HappyService"/>
<bean id="happyService2" class="com.atguigu.ioc.component.HappyService"/>
<!-- 使用bean标签的autowire属性设置自动装配效果 -->
<!-- byType表示根据类型进行装配,此时如果类型匹配的bean不止一个,那么会抛NoUniqueBeanDefinitionException -->
<!-- byName表示根据bean的id进行匹配。而bean的id是根据需要装配组件的属性的属性名来确定的 -->
<bean id="happyController"
class="com.atguigu.ioc.component.HappyController"
autowire="byName"
>
<!-- 手动装配:在property标签中使用ref属性明确指定要装配的bean -->
<!--<property name="happyService" ref="happyService"/>-->
</bean>
3、测试
@Test
public void testExperiment12()
HappyController happyController = iocContainer.getBean(HappyController.class);
HappyService happyService = happyController.getHappyService();
System.out.println("happyService = " + happyService);
集合类型bean
1、配置
<!-- 实验十一 给bean的属性赋值:集合属性 -->
<util:list id="machineList">
<bean class="com.atguigu.ioc.component.HappyMachine">
<property name="machineName" value="machineOne"/>
</bean>
<bean class="com.atguigu.ioc.component.HappyMachine">
<property name="machineName" value="machineTwo"/>
</bean>
<bean class="com.atguigu.ioc.component.HappyMachine">
<property name="machineName" value="machineThree"/>
</bean>
</util:list>
2、测试
@Test
public void testExperiment11()
List<HappyMachine> machineList = (List<HappyMachine>) iocContainer.getBean("machineList");
for (HappyMachine happyMachine : machineList)
System.out.println("happyMachine = " + happyMachine);
以上是关于Spring基于XML管理bean---(下)---特殊值处理p名称空间bean属性赋值(集合)的主要内容,如果未能解决你的问题,请参考以下文章
Spring-IOC容器-Bean管理-基于XML方式超详解!