Java中的SSH框架之spring(2)

来源:互联网 发布:cortex a8 linux 编辑:程序博客网 时间:2024/05/16 08:28

下面说下属性的依赖注入。
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