Spring注入集合

举报
CoderX 发表于 2022/04/11 12:13:57 2022/04/11
【摘要】 Spring注入集合可在Bean标签下的<property>元素中,使用以下元素配置Java集合类型的属性和参数:标签说明<list>用于注入 list 类型的值,允许重复<set>用于注入 set 类型的值,不允许重复<map>用于注入 key-value 的集合,其中 key 和 value 都可以是任意类型<props>用于注入 key-value 的集合,其中 key 和 valu...

Spring注入集合

可在Bean标签下的<property>元素中,使用以下元素配置Java集合类型的属性和参数:

标签 说明
<list> 用于注入 list 类型的值,允许重复
<set> 用于注入 set 类型的值,不允许重复
<map> 用于注入 key-value 的集合,其中 key 和 value 都可以是任意类型
<props> 用于注入 key-value 的集合,其中 key 和 value 都是字符串类型

1.在集合中设置普通类型的值(使用value属性)

package org.demo3;

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

public class JavaCollection {
    //数组类型
    private String[] courses;
    //list集合类型
    private List<String> list;
    //map集合类型
    private Map<String,String> maps;
    //set集合类型
    private Set<String> sets;

    @Override
    public String toString() {
        return "JavaCollection{" +
                "courses=" + Arrays.toString(courses) +
                ", list=" + list +
                ", maps=" + maps +
                ", sets=" + sets +
                '}';
    }

    public void setCourses(String[] courses) {
        this.courses = courses;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }

    public void setSets(Set<String> sets) {
        this.sets = sets;
    }
}

package org.demo3;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    private static final Log LOGGER= LogFactory.getLog(MainApp.class);

    public static void main(String[] args) {
        //获取ApplicationContext容器
        ApplicationContext context=new ClassPathXmlApplicationContext("demo3beans.xml");
        //获取名为JavaCollection的Bean
        JavaCollection javaCollection=context.getBean("javaCollection",JavaCollection.class);
        LOGGER.info(javaCollection.toString());
    }

}

<?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-3.0.xsd">

    <bean id="javaCollection" class="org.demo3.JavaCollection">
        <!--数组类型-->
        <property name="courses">
            <array>
                <value>Java</value>
                <value>PHP</value>
                <value>C语言</value>
            </array>
        </property>
        <!--List类型-->
        <property name="list">
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </list>
        </property>
        <!--map类型-->
        <property name="maps">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="PHP" value="php"></entry>
            </map>
        </property>
        <!--set类型-->
        <property name="sets">
            <set>
                <value>JAVA</value>
                <value>PHP</value>
            </set>
        </property>
    </bean>
</beans>

2.在集合中设置对象类型的值(使用ref属性)

package org.demo3;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Course {
    //private static final Log LOGGER = LogFactory.getLog(Course.class);
    //课程编号
    private String courseId;
    //课程名称
    private String courseName;

    public String getCourseId() {
        return courseId;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseId(String courseId) {
        this.courseId = courseId;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    @Override
    public String toString() {
        return "Course{" +
                "courseId=" + courseId +
                ", courseName='" + courseName + '\'' +
                '}';
    }
}

package org.demo3;

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

public class JavaCollection {
    //数组类型
    //普通类型
    private String[] courses;
    //对象类型
    private Course[] courses1;

    public void setCourses1(Course[] courses1) {
        this.courses1 = courses1;
    }

    //list集合类型String
    private List<String> list;
    //map集合类型
    private Map<String,String> maps;
    //set集合类型
    private Set<String> sets;

    @Override
    public String toString() {
        return "JavaCollection{" +
                "courses(普通类型)=" + Arrays.toString(courses) +
                ", courses1(对象类型)=" + Arrays.toString(courses1) +
                ", list=" + list +
                ", maps=" + maps +
                ", sets=" + sets +
                '}';
    }

    public void setCourses(String[] courses) {
        this.courses = courses;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }

    public void setSets(Set<String> sets) {
        this.sets = sets;
    }
}

package org.demo3;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    private static final Log LOGGER= LogFactory.getLog(MainApp.class);

    public static void main(String[] args) {
        //获取ApplicationContext容器
        ApplicationContext context=new ClassPathXmlApplicationContext("demo3beans.xml");
        //获取名为JavaCollection的Bean  集合中设置普通类型值
        JavaCollection javaCollection=context.getBean("javaCollection",JavaCollection.class );
        //获取名为colloection的Bean 集合中设置对象类型值
        JavaCollection colloection=context.getBean("colloection",JavaCollection.class);
        LOGGER.info(javaCollection.toString());
        LOGGER.info(colloection.toString());

    }

}

<?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-3.0.xsd">

    <bean id="javaCollection" class="org.demo3.JavaCollection">
        <!--数组类型-->
        <property name="courses">
            <array>
                <value>Java</value>
                <value>PHP</value>
                <value>C语言</value>
            </array>
        </property>
        <!--List类型-->
        <property name="list">
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
            </list>
        </property>
        <!--map类型-->
        <property name="maps">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="PHP" value="php"></entry>
            </map>
        </property>
        <!--set类型-->
        <property name="sets">
            <set>
                <value>JAVA</value>
                <value>PHP</value>
            </set>
        </property>
    </bean>


    <!--course类的Bean-->
    <bean id="course1" class="org.demo3.Course">
        <property name="courseId" value="1"/>
        <property name="courseName" value="Java"/>
    </bean>
    <bean id="course2" class="org.demo3.Course">
        <property name="courseId" value="2"/>
        <property name="courseName" value="PHP"/>
    </bean>
    <bean id="course3" class="org.demo3.Course">
        <property name="courseId" value="3"/>
        <property name="courseName" value="C"/>
    </bean>
    <!--在集合中设置对象类型的值-->
    <bean id="colloection" class="org.demo3.JavaCollection">
        <!--数组类型-->
        <property name="courses1">
            <array>
                <ref bean="course1"/>
                <ref bean="course2"/>
                <ref bean="course3"/>
            </array>
        </property>
        <!--List 类型-->
        <property name="list">
            <list>
                <value>张三</value>
                <value>李四</value>
                <value>王五</value>
                <value>赵六</value>
            </list>
        </property>
        <!--Map 类型-->
        <property name="maps">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="PHP" value="php"></entry>
            </map>
        </property>
        <!--Set 类型-->
        <property name="sets">
            <set>
                <value>MySQL</value>
                <value>Redis</value>
            </set>
        </property>
    </bean>
</beans>

Spring注入其他类型的属性

1.注入Null值

可以再XML配置文件中,通过<null/>元素将Null值注入到Bean中.

2.注入空字符串

在value属性值中空参数会当做空字符串处理

3.注入字面量

XML 配置中“<”、“>”、“&”等特殊字符是不能直接保存的,否则 XML 语法检查时就会报错可以通过两种方式将包含特殊符号的属性注入 Bean 中。

①转义

特殊符号转义字符:

特殊字符 转义字符
& &amp ;
< &lt ;
> &gt ;
&quot ;
&apos ;

在转义过程中,需要注意以下几点:

  • 转义序列字符之间不能有空格
  • 转义序列必须以“;”结束
  • 单独出现的“&”不会被认为是转义的开始
  • 区分大小写

②使用短字符串<![CDATA[]]>

通过短字符串 <![CDATA[]]> 将包含特殊符号的属性值包裹起来,可以让 XML 解析器忽略对其中内容的解析,以属性原本的样子注入到 Bean 中。

使用短字符串 <![CDATA[]]> 需要注意以下几点:

  • 此部分不能再包含”]]>”;
  • 不允许嵌套使用;
  • “]]>”中不能包含空格或者换行。

4.级联属性赋值

可以再<bean>的<property>子元素中,为它所依赖的Bean属性进行赋值,这就是"级联属性赋值"

使用级联属性赋值时,需要注意以下 3点:

  • Java 类中必须有 setter 方法;
  • Java 类中必须有无参构造器(默认存在);
  • 依赖其他 Bean 的类中,必须提供一个它依赖的 Bean 的 getXxx() 方法。

示例

package org.demo4;

public class ExamBean {
    //null值
    private String propertyNull;
    //空字符串
    private String propertyEmpty;
    //包含特殊符号的字面量
    private String propertyLiteral;
    //使用短字符串转义特殊符号
    private String propertyCDATA;
    //依赖的Bean(对象属性)
    private DependBean dependBean;



    //使用级联属性赋值时,需要提供一个依赖对象的getter方法
    public DependBean getDependBean() {
        return dependBean;
    }

    public void setPropertyCDATA(String propertyCDATA) {
        this.propertyCDATA = propertyCDATA;
    }

    public void setDependBean(DependBean dependBean) {
        this.dependBean = dependBean;
    }

    @Override
    public String toString() {
        return "ExamBean{" +
                "propertyNull='" + propertyNull + '\'' +
                ", propertyEmpty='" + propertyEmpty + '\'' +
                ", propertyLiteral='" + propertyLiteral + '\'' +
                ", propertyCDATA='" + propertyCDATA + '\'' +
                ", dependBean=" + dependBean +
                '}';
    }

    public void setPropertyNull(String propertyNull) {
        this.propertyNull = propertyNull;
    }

    public void setPropertyEmpty(String propertyEmpty) {
        this.propertyEmpty = propertyEmpty;
    }

    public void setPropertyLiteral(String propertyLiteral) {
        this.propertyLiteral = propertyLiteral;
    }

}

package org.demo4;

/**
 * 级联 依赖
 */
public class DependBean {
    private String dependProperty;

    public void setDependProperty(String dependProperty) {
        this.dependProperty = dependProperty;
    }

    @Override
    public String toString() {
        return "DependBean{" +
                "dependProperty='" + dependProperty + '\'' +
                '}';
    }
}

package org.demo4;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    private static final Log LOGGER= LogFactory.getLog(MainApp.class);
    public static void main(String[] args) {
        //创建bean工厂
        ApplicationContext context=new ClassPathXmlApplicationContext("demo4beans.xml");

        ExamBean exam=context.getBean("exampleBean",ExamBean.class);
        LOGGER.info(exam.toString());
    }
}

<?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-3.0.xsd">

    <bean id="exampleBean" class="org.demo4.ExamBean">
        <!--使用null标签注入Null值-->
        <property name="propertyNull">
            <null/>
        </property>
        <!--使用空参数注入空字符串-->
        <property name="propertyEmpty" value=""/>
        <!--通过转义注入包含特殊符号的字面量-->
        <property name="propertyLiteral" value="&lt;bdqn&gt;"/>
        <!--使用 <![CDATA[]]> 注入包含特殊符号的字面量-->
        <property name="propertyCDATA">
            <value><![CDATA[<bdqn>]]></value>
        </property>
        <!--注入依赖的Bean-->
        <property name="dependBean" ref="dependBean"></property>
        <!--级联属性赋值-->
        <property name="dependBean.dependProperty" value="级联属性赋值"></property>
    </bean>
    <!--对 ExampleBean 依赖的 Bean 进行定义-->
    <bean id="dependBean" class="org.demo4.DependBean">
        <!--对属性进行赋值-->
        <property name="dependProperty" value="依赖 Bean 内部赋值"></property>
    </bean>
</beans>
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。