框架技术--S2SH框架整合(spring部分)No 2--属性注入

框架技术--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










 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值