Java中的SSH框架之spring(2)

下面说下属性的依赖注入。
1、导入spring相应包。

2、我们在项目组构建一个类bean,其中包含属性类型有字符串、list、map、set数组。

package spring.bean;  

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

public class Bean {  
    private String st;  
    private List list;  
    private Map map;  
    private Set set;  

    public String getSt() {  
        return st;  
    }  

    public void setSt(String st) {  
        this.st = st;  
    }  

    public List getList() {  
        return list;  
    }  

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

    public Map getMap() {  
        return map;  
    }  

    public void setMap(Map map) {  
        this.map = map;  
    }  

    public Set getSet() {  
        return set;  
    }  

    public void setSet(Set set) {  
        this.set = set;  
    }  

}  

3、编写spring的配置文件,针对bean属性中,不同类型的属性,均可在配置文件中进行注入

<?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:aop="http://www.springframework.org/schema/aop"  
         xmlns:tx="http://www.springframework.org/schema/tx"  
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
    <bean id="bean" class="spring.bean.Bean">  
        <property name="st" value="str" />  
        <property name="list">  
            <list>  
                <value>list1</value>  
                <value>list2</value>  
            </list>  
        </property>  
        <property name="map">  
            <map>  
                <entry key="key1" value="value1"/>  
                <entry key="key2" value="value2"/>  
            </map>  
        </property>  
        <property name="set">  
            <set>  
                <value>set1</value>  
                <value>set2</value>  
            </set>  
        </property>  
    </bean>  
</beans>  

4、建立个main方法进行下测试

package spring.test;  

import org.springframework.beans.factory.BeanFactory;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  

import spring.bean.Bean;  

public class BeanTest {  

    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        BeanFactory factory = new ClassPathXmlApplicationContext(  
                "applicationContext.xml");  
        Bean bean = (Bean)factory.getBean("bean");  
        System.out.println(bean.getSt());  
        System.out.println(bean.getList());  
        System.out.println(bean.getMap());  
        System.out.println(bean.getSet());  
    }  

}  

输出结果:

str
[list1, list2]
{key1=value1, key2=value2}
[set1, set2]

在spring的配置文件中会通过属性类型的标签自动为我们转换,但是有些类型就无法转换(如 date),这时就需要我们自己去定义一个属性编辑器。

1、在类bean中增加一个类型为date的属性

package spring.bean;  

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

public class Bean {  
    private String st;  
    private List list;  
    private Map map;  
    private Set set;  
    private Date date;  

    public String getSt() {  
        return st;  
    }  

    public void setSt(String st) {  
        this.st = st;  
    }  

    public List getList() {  
        return list;  
    }  

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

    public Map getMap() {  
        return map;  
    }  

    public void setMap(Map map) {  
        this.map = map;  
    }  

    public Set getSet() {  
        return set;  
    }  

    public void setSet(Set set) {  
        this.set = set;  
    }  

    public Date getDate() {  
        return date;  
    }  

    public void setDate(Date date) {  
        this.date = date;  
    }  

}  

2、spring配置文件中为date类型注入值

<?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:aop="http://www.springframework.org/schema/aop"  
         xmlns:tx="http://www.springframework.org/schema/tx"  
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
    <bean id="bean" class="spring.bean.Bean">  
        <property name="st" value="str" />  
        <property name="list">  
            <list>  
                <value>list1</value>  
                <value>list2</value>  
            </list>  
        </property>  
        <property name="map">  
            <map>  
                <entry key="key1" value="value1"/>  
                <entry key="key2" value="value2"/>  
            </map>  
        </property>  
        <property name="set">  
            <set>  
                <value>set1</value>  
                <value>set2</value>  
            </set>  
        </property>  
        <property name="date">  
            <value>2012-01-01</value>  
        </property>  
    </bean>  
</beans>  

3、运行main方法

package spring.test;  

import org.springframework.beans.factory.BeanFactory;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  

import spring.bean.Bean;  

public class BeanTest {  

    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        BeanFactory factory = new ClassPathXmlApplicationContext(  
                "applicationContext.xml");  
        Bean bean = (Bean)factory.getBean("bean");  
        System.out.println(bean.getSt());  
        System.out.println(bean.getList());  
        System.out.println(bean.getMap());  
        System.out.println(bean.getSet());  
        System.out.println(bean.getDate());  
    }  

}  

4、控制台抛出这样一个异常,意思是string类型无法转换成date类型。

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bean' defined in class path resource [applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:  
PropertyAccessException 1: org.springframework.beans.TypeMismatchException: Failed to convert property value of type [java.lang.String] to required type [java.util.Date] for property 'date'; nested exception is java.lang.IllegalArgumentException: No matching editors or conversion strategy found  
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessException details (1) are:  
PropertyAccessException 1:  
org.springframework.beans.TypeMismatchException: Failed to convert property value of type [java.lang.String] to required type [java.util.Date] for property 'date'; nested exception is java.lang.IllegalArgumentException: No matching editors or conversion strategy found  
Caused by: java.lang.IllegalArgumentException: No matching editors or conversion strategy found  
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:212)  
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:127)  
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:775)  
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:608)  
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValue(AbstractPropertyAccessor.java:49)  
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:74)  
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:57)  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:970)  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:729)  
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:416)  
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)  
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)  
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)  
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156)  
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:290)  
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:348)  
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)  
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)  
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:68)  
    at spring.test.BeanTest.main(BeanTest.java:15) 

此时需要我们自定义一个属性转换器。

1、增加一个继承PropertyEditorSupport类并重写setAsText方法,并对日期类型的字符串进行一个转换处理。

package spring.util;  

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

public class DateEditUtil extends PropertyEditorSupport {  

    @Override  
    public void setAsText(String arg0) throws IllegalArgumentException {  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");  

        try {  
            Date d = sdf.parse(arg0);  
            this.setValue(d);  
        } catch (ParseException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  

}  

2、上面的属性转换类写好后,也需要进行一个注入。

<?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:aop="http://www.springframework.org/schema/aop"  
         xmlns:tx="http://www.springframework.org/schema/tx"  
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
    <bean id="bean" class="spring.bean.Bean">  
        <property name="st" value="str" />  
        <property name="list">  
            <list>  
                <value>list1</value>  
                <value>list2</value>  
            </list>  
        </property>  
        <property name="map">  
            <map>  
                <entry key="key1" value="value1"/>  
                <entry key="key2" value="value2"/>  
            </map>  
        </property>  
        <property name="set">  
            <set>  
                <value>set1</value>  
                <value>set2</value>  
            </set>  
        </property>  
        <property name="date">  
            <value>2012-01-01</value>  
        </property>  
    </bean>  

    <bean name="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">  
        <property name="customEditors">  
            <map>  
                <entry key="java.util.Date">  
                    <bean class="spring.util.DateEditUtil"></bean>  
                </entry>  
            </map>  
        </property>  
    </bean>  
</beans>  

3、这时在运行测试程序就没有问题了。

str
[list1, list2]
{key1=value1, key2=value2}
[set1, set2]
Sun Jan 01 00:01:00 CST 2012

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值