【Spring 基础篇三】属性注入与属性编辑器

     上篇我们了解了一下applicationContext.xml的两种注入方式,本篇我们来了解一下关于属性的注入以及操作。

     在敲代码的过程中,我们很容易遇到这样的问题,比如一个List的集合,我之前给他赋值两个,现在我想给他再重新赋值,一般的想法当然是修改代码,然后完成自己想要的需求了,但是这种做法是不可取了,所以我们完成可以采用Spring属性注入的方式来解决此问题。看如下demo:

1、我们创建一个类,来创建几个不同类型的属性:

常用属性的注入有:int,String,list,set,map等。

Bean01属性类:

public class Bean01 {

	private String strValue;  //String类型实体

	private int intValue;   //int类型实体  

	private List listValue;   //list类型实体

	private Set setValue;    //Set类型实体

	private String[] arrayValue;  //String集合实体

	private Map mapValue;   //Map集合实体

	private Date dateValue;   //date类型实体

	…………省略get,set方法
}
     由于有了set方法,所以我们完全可以采用setter注入的方式对其属性赋值

applicationContext.xml具体属性赋值如下:





	
		
		
		
			
				list1
				list2
			
		
		
			
				set1
				set2
			
		
		
			
				array1
				array2
			
		
		
			
				
				
			
		
		  //日期格式赋值
		
	

     但是有好多信息并非是简简单单的赋值就能够满足需求的,比如我们的日期,存有各种格式,到界面会存在乱码或者格式显示的问题,相关日期乱码博客Laydate日期乱码。我们该如何去应如自如呢?当然,对于这种情况,我们完全可以单独罗列出来,新建一个类来完成我们的需求,对于这个类的作用,我们称其为“属性编辑器”。

如何自定义属性编辑器?
  • 继承PropertyEditorSupport
  • 覆盖setAsText()方法
  • 将自定义的属性编辑器注入到spring中

创建UtilDatePropertyEditor类:

// 继承于Java beans的PropertyEditorSupport来实现我们的功能。
public class UtilDatePropertyEditor extends PropertyEditorSupport {

	// 定义一个实体,获得set方法
	private String pattern;

	// 获得的set方法,便于注入
	public void setPattern(String pattern) {
		this.pattern = pattern;
	}

	// 覆盖方法setAsText满足需求
	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		// 输出来,便于测试显示结果
		System.out.println("---UtilDatePropertyEditor.setAsText()---" + text);
		try {
			// 只适用于一种格式
			Date date = new SimpleDateFormat(pattern).parse(text);
			// 将其赋值进去
			this.setValue(date);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// 异常抛出
			throw new IllegalArgumentException(text);
		}
	}
}
     由于Spring是支持多文件配置的,就和文件一样,每个文件都干着不一样的事,所以我们可以再新建一个配置applicationContext-editor.xml,用来专门为属性编辑器服务。




	
	
		
		
			
			
				
					
					
						
						
					
				
			
		
	

	
	
	
     这样我们的关于日期的一个属性编辑器就完工了,不管是pattern,日期类型的注入还是整个编辑器的注入,整个过程都采用的setter的注入方式,最后我们使用单元测试的方式测试一下:

public class InjectionTest extends TestCase {

	// 定义成员变量
	private BeanFactory factory;

	@Override
	protected void setUp() throws Exception {

		// 只创建一次对配置文件的读取
		/*
		 * factory = new
		 * ClassPathXmlApplicationContext("applicationContext.xml");
		 */

		// 传递数组,两个配置文件的读取
		String[] configLocations = new String[] { "applicationContext.xml",
				"applicationContext-editor.xml" };
		factory = new ClassPathXmlApplicationContext(configLocations);
	}

	@Override
	protected void tearDown() throws Exception {
		// 销毁,删除的方法
	}

	public void testInjection1() {
		Bean01 bean01 = (Bean01) factory.getBean("bean01");
		System.out.println("bean01.strValue=" + bean01.getStrValue());
		System.out.println("bean01.intValue=" + bean01.getIntValue());
		System.out.println("bean01.listValue=" + bean01.getListValue());
		System.out.println("bean01.setValue=" + bean01.getSetValue());
		System.out.println("bean01.arrayValue=" + bean01.getArrayValue());
		System.out.println("bean01.mapValue=" + bean01.getMapValue());
		System.out.println("bean01.dateValue=" + bean01.getDateValue());
	}
最后的结果:

【Spring 基础篇三】属性注入与属性编辑器_第1张图片

总结:

     1、通过spring的BeanFactory实例化,配置和管理对象,当有多个对象的时候,其实除了数组的方式来管理,我们还可以采取规范化的管理方式,在配置文件定义名字的时候,我们可以规定为统一的格式,比如上述例子的两个文件,我们可以修改名称为:“applicationContext-beans.xml”、“applicationContext-editor.xml”

这样我们则可以简单化调用:

factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");

你可能感兴趣的:(●技术分享和架构设计,------【框架学习】,spring,属性编辑器,spring属性注入)