即框架技术--S2SH框架整合(spring部分)No 1这章讲解后,简单了解了下,spring的IOC容器的依赖注入,及相应的配置。
下面继续说下属性的依赖注入。
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