【spring——set注入详解】级联、数组、集合、null、空字符串、特殊字符注入

spring基础

DI依赖注入是IoC控制反转思想的实现,可以通过set注入和构造器注入两种方法,将对象的创建和对象依赖关系的维护交给spring容器来处理

本章内容对set相关注入进行介绍和代码范例展示

set注入

  • 方法名要符合spring规范:set+首字母大写+字符串。例如setOrderBean() ,在xml文件中声明定义Bean:

    <bean id = "orderBean" class = "setOrderBean方法所在的类路径"></bean>
    
  • 通过外部Bean或内部Bean来引入其他对象

    外部Bean:

    <bean id = "orderDaoBean" class = "orderDao的路径"></bean>
    <bean id = "orderBean" class = "setOrderBean方法所在的类路径">
    	<property name = "orderDao" ref = "orderDaoBean" ></property>
    </bean>
    

    内部Bean:

    <bean id = "orderBean" class = "setOrderBean方法所在的类路径">
    	<property name = "orderDao">
    		<bean class = "orderDao的路径"></bean>
    	</property>
    </bean>
    
  • 简单类型的注入

    若对象的引用为简单类型,则用value替换ref

    <bean id = "orderBean" class = "setOrderBean方法所在的类路径">
    	<property name = "userName" value = "李四" ></property>
        <property name = "age" value = "20"></property>
    </bean>
    

    是否为简单类型可以通过**BeanUtils.isSimpleValueType()**方法来判断

    源码如下所示:可清晰看出哪些类被定义为简单类型

 public static boolean isSimpleValueType(Class<?> clazz) {
        return  ClassUtils.isPrimitiveOrWrapper(clazz) ||
            	Enum.class.isAssignableFrom(clazz) ||
                CharSequence.class.isAssignableFrom(clazz) ||
                Number.class.isAssignableFrom(clazz) || 
                Date.class.isAssignableFrom(clazz) || 
                URI.class == clazz || 
                URL.class == clazz || 
                Locale.class == clazz || 
                Class.class == clazz;
    }

注意:若把Date当作简单类型,用value赋值时必须注意日期字符串的格式要求:Wed Oct 29 16:00:26 CST 2022d

因此,为了避免赋值的过程过于繁琐,可以用ref对Date类型进行赋值

级联注入

条件:

1.使用级联属性赋值,必须同时设置了getter和setter方法

2.配置的顺序不能颠倒

例如 :A类如下

private name;
private B b_instance;
...
public void setBBean(B b_instance){
    this.b_instance = b_instance;
}

public B getBBean(){
    return b_instance;
}
...

xml文件如下

<bean id="aBean" class="com.lxy.spring.bean.A">
	<property name="name" value="nameOfA"></property>
    <property name="b_instance" ref="bBean"></property>
    <property name="b_instance.location" value="locationOfB" ></property>
</bean>
<bean id="bBean" class="com.lxy.spring.bean.B"></bean>

级联赋值通过getter方法获得b的实例化对象后,通过value给b的location属性赋值

数组注入

  • 简单类型

​ 使用<array><value>进行赋值

<bean id="orderBean" class="com.lxy.spring.bean.orderBean">
	<property name="orderList">
    	<array> 
            <value>电脑</value>
  			<value>空调</value>
            <value>手机</value>
        </array>
    </property>
</bean>
  • 非简单类型进行ref赋值

    使用<array><ref bean=""/>进行赋值

<bean id="iphone6" class="com.lxy.spring.bean.IphoneType">
	<property name="name" value="iphone6"></property>
</bean>

<bean id="iphone7" class="com.lxy.spring.bean.IphoneType">
	<property name="name" value="iphone7"></property>
</bean>

<bean id="iphone8" class="com.lxy.spring.bean.IphoneType">
	<property name="name" value="iphone8"></property>
</bean>

<bean id="orderBean" class="com.lxy.spring.bean.orderBean">
	<property name="orderList">
    	<array> 
            <ref bean="iphone6" />
            <ref bean="iphone7" />
            <ref bean="iphone8" /> 
        </array>
    </property>
</bean>

List&Set&Map集合注入

<bean id="orderBean" class="com.lxy.spring.bean.orderBean">
	<property name="orderList">
        <!--List集合有序可重复-->
    	<list> 
            <value>电脑</value>
  			<value>空调</value>
            <value>手机</value>
            <value>电脑</value>
  			<value>空调</value>
            <value>手机</value>
        </list>
    </property>
    
    <property name="orderSet">
        <!--set集合无序不可重复-->
    	<set>
        	<value>电脑</value>
  			<value>空调</value>
            <value>手机</value>
            <value>电脑</value>
  			<value>空调</value>
            <value>手机</value>
        </set>
    </property>
    
     <property name="orderMap">
        <!--注入Map集合-->
    	<map>
        	<entry key="1" value="电脑1"/>
  			<entry key="2" value="电脑2"/>
            <entry key="3" value="电脑3"/>
        </map>
     </property>
     <!--若为非简单类型,则用<entry key-ref="" value-ref=""/>-->
     <property name="orderMap_ref">
    	<map>
        	<entry key-ref="k1Bean" value-ref="val1Bean"/>
            <entry key-ref="k2Bean" value-ref="val2Bean"/>
            <entry key-ref="K3Bean" value-ref="val3Bean"/>
        </map>
     </property>
</bean>

Properties注入

<bean id="orderBean" class="com.lxy.spring.bean.orderBean">
	<property name="orderList">
    	<props> 
            <prop key="driver">com.mysql.cj.jdbc.Driver</prop>
            <prop key="url">jdbc:mysql://localhost:3306/spring</prop>
            <prop key="username">root</prop>
            <prop key="password">123456</prop>
        </props>
    </property>
</bean>

null 和空字符串注入

  • 手动注入null

    <property name="name">
    	<null/>
    </property>
    
  • 默认注入null

<!--不给属性注入,则属性的默认值为null-->
<!--<property name="name" value="lxy"></property>-->
  • 空字符串注入

    <property name="name" value=""/>
    
    <!--或是-->
    
    <property name="name">
    	<value/>
    </property>
    

特殊字符注入(< , >, …)

  • 方法一:使用实体符号代替特殊符号

    实体符号显示结果描述
    &ensp;半个空白位
    &emsp;一个空白位
    &nbsp;不断行的空白
    &lt;<小于号或显示标记
    &gt;>大于号或显示标记
    &amp;&可用于显示其它特殊字符
    &quot;引号
    &reg;®已注册
    &copy;©版权
    &trade;商标
  • 方法二:使用<![CDATA[ ]]>

    <property name="name">
        <!--注意只能使用value标签,不可以用value属性-->
        <value><![CDATA[2<3]]></value>
    </property>
    

版权声明:本文为wondersfan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。