zoukankan      html  css  js  c++  java
  • Spring属性编辑器详解

    1、常见的属性的注入:int,string,list,set,map

    2、什么是属性编辑器及作用?

      (1)将spring配置文件中的字符串转换为相应的java对象

      (2)spring内置了一些属性编辑器,也可以自定义属性编辑器

    3、如果自定义属性编辑器

    (1)继承propertyEditorSupport

    (2)重写setAsText 方法

    (3)使用 setValue 完成属性对象设置

    下面通过实例来说明类属性自定义动态加载

    工程截图:

     

     工程说明:

    1、Education.java 自定义属性(自定义类属性)

    2、EducationPropertyEditor.java自定义属性编辑器

    3、PropertyDateEditor.java 自定义日期属性编辑器

    4、testPropertyEditot 单元测试类

    测试结果截图:

     

    代码:

     beans.xm文件

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

        <bean id="PropertyEditorConfigurer1"
            class="org.springframework.beans.factory.config.CustomEditorConfigurer">
            <property name="customEditors">
                <map>
                    <!-- 引用类的属性类型,本例子中对应 com.test.Person 类的 education 属性 东北大亨对应读取的学校属性 -->
                    <entry key="com.test.Education">
                        <!--对应Address的编辑器 -->
                        <bean class="com.test.EducationPropertyEditor" />
                    </entry>
                </map>
            </property>
        </bean>
        <bean id="PropertyEditorConfigurer2"
            class="org.springframework.beans.factory.config.CustomEditorConfigurer">
            <property name="customEditors">
                <map>
                    <!-- 引用类的属性类型,本例子中对应 com.test.Person 类的 dataValue属性 -->
                    <entry key="java.util.Date">
                        <!--对应dataValue 属性的编辑器 -->
                        <bean class="com.test.PropertyDateEditor" >
                            <property name="dataPattern" value="yyyy/MM/dd"/>
                        </bean>
                    </entry>
                </map>
            </property>
        </bean>
        <bean id="person" class="com.test.Person">
            <property name="id" value="1003" />
            <property name="name" value="东北大亨" />
            <property name="education" value="中国,北京海淀区清华大学" />
            <property name="dataValue" value="2018/12/30" />
        </bean>
    </beans>

    测试类 testPropertyEditot:

    package com.test;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import junit.framework.TestCase;

    public class testPropertyEditot extends TestCase {
        
        public void testPrintProperty() {
            System.out.println("测试springPropertyUtil  start");

            // 可以同时配置多个xml配置文件,如果多个配置具有一定规则情况下可以采用匹配方式进行读取
            // 例如有两个xml 文件。既:beans-1.xml,beans-2.xml,beans-3.xml
            // 采用匹配方式进行读取
            // ApplicationContext ctx = new
            // ClassPathXmlApplicationContext("beans-*.xml");

            // 废弃方法不建议使用
            // BeanFactory factory=new XmlBeanFactory(new
            // ClassPathResource("beans.xml"));

            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
            Person person = (Person) ctx.getBean("person");

            System.out.println("学生ID:" + person.getId());
            System.out.println("名称:" + person.getName());
            System.out.println("毕业时间:" + person.getDataValue());
            System.out.println("学生就读国别:" + person.getEducation().getCountry());
            System.out.println("学生就读地址:" + person.getEducation().getDirectory());
            
            assertEquals(person.getId(),1003);
            assertEquals(person.getName(),"东北大亨");

            System.out.println("测试springPropertyUtil  end");
        }
    }

    日期编辑器 PropertyDateEditor :

    package com.test;

    import java.beans.PropertyEditorSupport;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    /**
     *
     * @author 东北大亨
     *
     */
    public class PropertyDateEditor extends PropertyEditorSupport {
        
        
        private String dataPattern;

        

        /**
         * Parse the value from the given text, using the SimpleDateFormat
         */
        @Override
        public void setAsText(String text) {
            System.out.println("------UtilDatePropertyEditor.setAsText()------" + text);
            try {
                //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf = new SimpleDateFormat(dataPattern);
                Date date = new Date();
                date = sdf.parse(text);
                this.setValue(date);
            } catch (Exception e) {
                e.printStackTrace();
                throw new IllegalArgumentException(text);
            }
        }
        
        // 只要有set方法就可以注入进来
        public void setDataPattern(String pattern) {
            this.dataPattern = pattern;
        }
    }

    人员 Person pojo类:

    package com.test;

    import java.util.Date;
    import org.apache.commons.lang.builder.ToStringBuilder;

    /**
     *
     * @author 东北大亨
     *
     */
    public class Person {

        private int id;
        private String name;
        private Education education;
        

        private Date dataValue;
        
        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public Date getDataValue() {
            return dataValue;
        }

        public void setDataValue(Date dataValue) {
            this.dataValue = dataValue;
        }

        public Education getEducation() {
            return education;
        }

        public void setEducation(Education education) {
            this.education = education;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String toString() {
            return ToStringBuilder.reflectionToString(this);
        }
    }

    实体类属性编辑器:

    package com.test;

    import java.beans.PropertyEditorSupport;
    import org.springframework.util.StringUtils;

    /**
     * 实体类编辑器
     * @author 东北大亨
     *
     */
    public class EducationPropertyEditor extends PropertyEditorSupport {

        @Override
        public void setAsText(String text) {
            if (text == null || !StringUtils.hasText(text)) {
                throw new IllegalArgumentException("就读住址不能为空!");
            } else {
                String[] StrAddressArr = StringUtils.tokenizeToStringArray(text, ",");
                Education add = new Education();
                add.setCountry(StrAddressArr[0]);
                add.setDirectory(StrAddressArr[1]);
                setValue(add);
            }
        }

        public String getAsText() {
            Education add = (Education) getValue();
            return "" + add;
        }
    }

    学校实体类:

    package com.test;

    import org.apache.commons.lang.builder.ToStringBuilder;

    /**
     * 读取学校实体类
     * @author 东北大亨
     *
     */
    public class Education {

        private String country;

        private String directory;

        public String getDirectory() {
            return directory;
        }

        public void setDirectory(String directory) {
            this.directory = directory;
        }

        public String getCountry() {
            return country;
        }

        public void setCountry(String country) {
            this.country = country;
        }

    }

  • 相关阅读:
    UVA
    计算几何 点和线
    CTU Open Contest 2017
    2018 Multi-University Training Contest 2
    2018 Multi-University Training Contest 1
    Nordic Collegiate Programming Contest (NCPC) 2016
    The 2016 ACM-ICPC Asia Shenyang Regional Contest
    The 2016 ACM-ICPC Asia Qingdao Regional Contest
    CCPC 2016-2017, Finals
    North American Invitational Programming Contest (NAIPC) 2016
  • 原文地址:https://www.cnblogs.com/northeastTycoon/p/spring.html
Copyright © 2011-2022 走看看