- 浏览: 468457 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (146)
- Maven (3)
- Quartz (10)
- Hessian (3)
- JDK (42)
- eclipse (4)
- 设计思想 (6)
- XML (8)
- JavaMail (1)
- Spring (11)
- mina (1)
- HsqlDb (1)
- Cache (2)
- Tool (6)
- 心情 (5)
- JQuery (0)
- Hadoop (5)
- Hbase (3)
- 自动构建 (7)
- JNDI (0)
- 代码赏析 (5)
- Oracle (1)
- Excel (4)
- Effective Java (5)
- JAXB (4)
- fdafasdf (1)
- ccc (0)
- web (3)
- concurrent (1)
- CVS (1)
- eclipse plugin (2)
- Apache (10)
最新评论
-
chxiaowu:
nice!
Quartz实现固定执行次数 -
zxjlwt:
学习了。http://surenpi.com
自定义ClassLoader -
kadlly:
public static final Logger log ...
Hessian 权限认证 -
spring_springmvc:
java程序语言学习教程 地址http://www.zuida ...
Java-Final -
liushuiwuyan:
[img][/img]
设计模式-单例
因为XmlBeanFactory为BeanFactory的实例,用户需要手工调用registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass)方法注册自定义属性编辑器,Spring属性编辑器的注册方式不支持属性的注入,只能通过需要转化的类型和对应的属性编辑器类型,如此便不能往属性编辑器中传递参数了,如何初始化信息?
可以放在默认构造函数中,因为默认Spring会初始化属性编辑器,所以会默认调用.
在Spring初始化XmlBeanFactory的时候,初始化属性编辑器即可
如此,当遇到对象类型为Date,注入的类型为String的时候,会调用这个方法.
但是使用上面的方法注册进去,参数是不会初始化的,因为其注册是类型.
所以请使用PropertyEditorRegistrars
这种属性编辑器使用起来比较麻烦[XmlBeanFactory不支持xml注册的方式],而且也不够灵活[输入类型只支持String,而且也很难分享使用,比如我页面等地方的类型转换].
当然Spring对于属性编辑器还是支持的PropertyEditorRegistrySupport,比如BeanWrapperImpl,不过可以指定registerDefaultEditors.[true:引入默认的属性编辑器]
默认的属性编辑器如下:
属性编辑器基本上支持基本类型(int,long,float,double等).
这是以前Spring的使用方法属性编辑器,Spring3.0之后的版本[我是参阅spring3.0源码].
都是使用Converter,为了兼容以前的版本,属性编辑器也支持使用,spring的逻辑是先属性编辑器,如果没有找到,则会检测类型转换器,类型转化器针对的是全局的。只会注册一次,而属性编辑器会在每一个BeanWrapper中注册.
优先级如下:
如果编辑器中没有找到匹配的类型,才会执行convert
如此使用ApplicationContext,则不需要这么麻烦了,只需要xml配置即可
我这里定义了两种方式,可以通过Registar注册,也可以直接通过customEditors注册自定义的属性编辑器,但是我不推荐这么做,毕竟属性编辑器会在每一个spring bean的初始化。
所以在spring3.0出了一个叫convert的类型转换器,在属性编辑器不存在的时候,则会调用类型转换器,针对全局的。
package org.springframework.beans.factory.xml.support; import java.beans.PropertyEditorSupport; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class DatePropertyEditor extends PropertyEditorSupport { private List<String> formats; public void setFormats(List<String> formats) { this.formats = formats; } public DatePropertyEditor(){ formats = new ArrayList<String>(); formats.add("yyyy-MM-dd"); formats.add("yyyy-MM-dd HH:mm:ss"); } @Override public void setAsText(String text) throws IllegalArgumentException { try { SimpleDateFormat sdf = null; if(text.length() == 10){ sdf = new SimpleDateFormat((String)formats.get(0)); }else if(text.length() == 19){ sdf = new SimpleDateFormat((String)formats.get(1)); } Date date = sdf.parse(text); // 获取时间信息 this.setValue(date); } catch (ParseException e) { e.printStackTrace(); } } }
可以放在默认构造函数中,因为默认Spring会初始化属性编辑器,所以会默认调用.
在Spring初始化XmlBeanFactory的时候,初始化属性编辑器即可
beanFactory.registerCustomEditor(java.util.Date.class, DatePropertyEditor.class);
如此,当遇到对象类型为Date,注入的类型为String的时候,会调用这个方法.
但是使用上面的方法注册进去,参数是不会初始化的,因为其注册是类型.
所以请使用PropertyEditorRegistrars
PropertyEditorRegistrar registrar =new PropertyEditorRegistrar() { public void registerCustomEditors(PropertyEditorRegistry registry) { DatePropertyEditor dpe = new DatePropertyEditor(); List<String> formats = new ArrayList<String>(); formats.add("yyyy-MM-dd"); formats.add("yyyy-MM-dd HH:mm:ss"); dpe.setFormats(formats); registry.registerCustomEditor(Date.class, dpe); } }; xct.beanFactory.addPropertyEditorRegistrar(registrar);
这种属性编辑器使用起来比较麻烦[XmlBeanFactory不支持xml注册的方式],而且也不够灵活[输入类型只支持String,而且也很难分享使用,比如我页面等地方的类型转换].
当然Spring对于属性编辑器还是支持的PropertyEditorRegistrySupport,比如BeanWrapperImpl,不过可以指定registerDefaultEditors.[true:引入默认的属性编辑器]
默认的属性编辑器如下:
private void createDefaultEditors() { this.defaultEditors = new HashMap<Class<?>, PropertyEditor>(64); // Simple editors, without parameterization capabilities. // The JDK does not contain a default editor for any of these target types. this.defaultEditors.put(Charset.class, new CharsetEditor()); this.defaultEditors.put(Class.class, new ClassEditor()); this.defaultEditors.put(Class[].class, new ClassArrayEditor()); this.defaultEditors.put(Currency.class, new CurrencyEditor()); this.defaultEditors.put(File.class, new FileEditor()); this.defaultEditors.put(InputStream.class, new InputStreamEditor()); this.defaultEditors.put(InputSource.class, new InputSourceEditor()); this.defaultEditors.put(Locale.class, new LocaleEditor()); this.defaultEditors.put(Pattern.class, new PatternEditor()); this.defaultEditors.put(Properties.class, new PropertiesEditor()); this.defaultEditors.put(Resource[].class, new ResourceArrayPropertyEditor()); this.defaultEditors.put(TimeZone.class, new TimeZoneEditor()); this.defaultEditors.put(URI.class, new URIEditor()); this.defaultEditors.put(URL.class, new URLEditor()); this.defaultEditors.put(UUID.class, new UUIDEditor()); // Default instances of collection editors. // Can be overridden by registering custom instances of those as custom editors. this.defaultEditors.put(Collection.class, new CustomCollectionEditor(Collection.class)); this.defaultEditors.put(Set.class, new CustomCollectionEditor(Set.class)); this.defaultEditors.put(SortedSet.class, new CustomCollectionEditor(SortedSet.class)); this.defaultEditors.put(List.class, new CustomCollectionEditor(List.class)); this.defaultEditors.put(SortedMap.class, new CustomMapEditor(SortedMap.class)); // Default editors for primitive arrays. this.defaultEditors.put(byte[].class, new ByteArrayPropertyEditor()); this.defaultEditors.put(char[].class, new CharArrayPropertyEditor()); // The JDK does not contain a default editor for char! this.defaultEditors.put(char.class, new CharacterEditor(false)); this.defaultEditors.put(Character.class, new CharacterEditor(true)); // Spring's CustomBooleanEditor accepts more flag values than the JDK's default editor. this.defaultEditors.put(boolean.class, new CustomBooleanEditor(false)); this.defaultEditors.put(Boolean.class, new CustomBooleanEditor(true)); // The JDK does not contain default editors for number wrapper types! // Override JDK primitive number editors with our own CustomNumberEditor. this.defaultEditors.put(byte.class, new CustomNumberEditor(Byte.class, false)); this.defaultEditors.put(Byte.class, new CustomNumberEditor(Byte.class, true)); this.defaultEditors.put(short.class, new CustomNumberEditor(Short.class, false)); this.defaultEditors.put(Short.class, new CustomNumberEditor(Short.class, true)); this.defaultEditors.put(int.class, new CustomNumberEditor(Integer.class, false)); this.defaultEditors.put(Integer.class, new CustomNumberEditor(Integer.class, true)); this.defaultEditors.put(long.class, new CustomNumberEditor(Long.class, false)); this.defaultEditors.put(Long.class, new CustomNumberEditor(Long.class, true)); this.defaultEditors.put(float.class, new CustomNumberEditor(Float.class, false)); this.defaultEditors.put(Float.class, new CustomNumberEditor(Float.class, true)); this.defaultEditors.put(double.class, new CustomNumberEditor(Double.class, false)); this.defaultEditors.put(Double.class, new CustomNumberEditor(Double.class, true)); this.defaultEditors.put(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, true)); this.defaultEditors.put(BigInteger.class, new CustomNumberEditor(BigInteger.class, true)); // Only register config value editors if explicitly requested. if (this.configValueEditorsActive) { StringArrayPropertyEditor sae = new StringArrayPropertyEditor(); this.defaultEditors.put(String[].class, sae); this.defaultEditors.put(short[].class, sae); this.defaultEditors.put(int[].class, sae); this.defaultEditors.put(long[].class, sae); } }
属性编辑器基本上支持基本类型(int,long,float,double等).
这是以前Spring的使用方法属性编辑器,Spring3.0之后的版本[我是参阅spring3.0源码].
都是使用Converter,为了兼容以前的版本,属性编辑器也支持使用,spring的逻辑是先属性编辑器,如果没有找到,则会检测类型转换器,类型转化器针对的是全局的。只会注册一次,而属性编辑器会在每一个BeanWrapper中注册.
优先级如下:
if (editor == null && conversionService != null && convertedValue != null && typeDescriptor != null) { TypeDescriptor sourceTypeDesc = TypeDescriptor.forObject(newValue); TypeDescriptor targetTypeDesc = typeDescriptor; if (conversionService.canConvert(sourceTypeDesc, targetTypeDesc)) { try { return (T) conversionService.convert(convertedValue, sourceTypeDesc, targetTypeDesc); } catch (ConversionFailedException ex) { // fallback to default conversion logic below firstAttemptEx = ex; } } } // Value not of required type? if (editor != null || (requiredType != null && !ClassUtils.isAssignableValue(requiredType, convertedValue))) { if (requiredType != null && Collection.class.isAssignableFrom(requiredType) && convertedValue instanceof String) { TypeDescriptor elementType = typeDescriptor.getElementTypeDescriptor(); if (elementType != null && Enum.class.isAssignableFrom(elementType.getType())) { convertedValue = StringUtils.commaDelimitedListToStringArray((String) convertedValue); } } if (editor == null) { editor = findDefaultEditor(requiredType, typeDescriptor); } convertedValue = doConvertValue(oldValue, convertedValue, requiredType, editor); }
如果编辑器中没有找到匹配的类型,才会执行convert
如此使用ApplicationContext,则不需要这么麻烦了,只需要xml配置即可
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.util.Date"> <bean class="org.springframework.beans.factory.xml.support.DatePropertyEditor"> 设置时间格式 <property name="formats"> <list> <value>yyyy-MM-dd</value> <value>yyyy-MM-dd HH:mm:ss</value> </list> </property> </bean> </entry> </map> </property> <property name="propertyEditorRegistrars"> <set> <ref bean="propertyEditorRegistrar" /> </set> </property> </bean> <bean id="propertyEditorRegistrar" class="org.springframework.context.DDPropertyRegister"> </bean>
我这里定义了两种方式,可以通过Registar注册,也可以直接通过customEditors注册自定义的属性编辑器,但是我不推荐这么做,毕竟属性编辑器会在每一个spring bean的初始化。
所以在spring3.0出了一个叫convert的类型转换器,在属性编辑器不存在的时候,则会调用类型转换器,针对全局的。
发表评论
-
(重拾)Spring之类型转换器
2013-03-28 11:36 1789因为非常的简单,原则就不说明了,与属性转换器差不多功能,针对的 ... -
接口与抽象类
2012-07-11 16:53 11241. 接口设计必谨慎,除非业务变更,否则打死不能动接口。[不变 ... -
Spring expression 解读
2012-07-04 17:17 9037SPEL表达式支持: 一、基本表达式:字面量表达式、关系,逻辑 ... -
Annotation实现缓存,Bean指定代码缓存类
2011-12-28 13:52 1336<!-- Ehcache拦截,使 ... -
Annotation实现缓存,Bean创建代理模式
2011-12-28 13:24 1145这是BeanPostProcessor,生成一个代理对象 ... -
Spring实现国际化
2011-12-23 17:40 16157覆写ResourceBundleMessage. Spring ... -
Spring的属性初始化解析
2011-12-16 09:49 1855Spring加载一个Bean是通过其xml中定义的class属 ... -
Java如何处理异常
2011-08-18 15:17 1993异常 受检异常 FileNot ... -
Spring的继承
2011-03-11 17:58 2135parent-init.xml <?xml vers ... -
Spring对Bean和BeanFactory生命周期的管理
2011-03-11 15:19 2061Java对象的生命周期,从初始化到销毁如下: Object ...
相关推荐
在Spring框架中,属性编辑器(PropertyEditor)是一种强大的工具,允许我们自定义类型转换过程。当我们需要将字符串形式的数据转换为Java对象时,属性编辑器就发挥了关键作用。例如,从请求参数或配置文件中读取的...
在Spring框架中,属性编辑器(PropertyEditor)扮演着至关重要的角色。它们是JavaBeans规范的一部分,用于在Java对象和其字符串表示之间进行转换。在Spring中,我们可以通过自定义属性编辑器来处理特定类型的值,...
在Spring 2.0框架中,自定义属性编辑器(Custom Property Editor)是一个重要的功能,它允许开发者扩展Spring的默认属性绑定机制,以处理特定类型的转换。本文将深入探讨这一特性,结合源码分析和实际应用,帮助你...
在Spring框架中,属性编辑器(PropertyEditor)扮演着至关重要的角色。它们是JavaBeans规范的一部分,用于在Java对象和字符串之间进行数据转换。在Spring中,属性编辑器被广泛应用于IoC容器,用于处理配置文件中的...
在Spring框架中,属性编辑器(PropertyEditor)是一个关键组件,它负责将配置文件中非标准格式的数据转换为JavaBean的可识别类型。属性编辑器是基于JavaBeans规范的,因此理解这个概念需要先了解JavaBean和JavaBeans...
在Spring中,核心概念之一就是Bean,它是一个简单的Java对象,由Spring IoC容器管理。Spring通过XML配置文件或注解来定义、配置和管理Beans。下面将深入探讨`<beans>`、`<bean>`及其属性,以及其他相关的配置元素。 ...
总结起来,Spring的属性管理是其强大的功能之一,它提供了灵活多样的方式来管理应用的配置,确保了配置的可扩展性、可维护性和可管理性。开发者可以根据项目需求选择适合的方式来处理和注入属性,提高开发效率和应用...
在Spring框架中,属性注入是核心特性之一,它允许我们通过依赖注入(Dependency Injection, DI)来管理对象的属性,而不是让对象自行创建或查找它们的依赖。这有助于提高代码的可测试性、可维护性和解耦性。下面将...
### Spring自定义编辑器详解 #### 一、引言 在Spring框架中,自定义编辑器主要用于处理数据类型的转换问题,特别是在将用户输入的数据转换为Java对象时非常有用。例如,用户通过表单提交了一个日期格式的字符串,...
在Spring MVC框架中,属性编辑器(PropertyEditor)和参数解析器(HandlerMethodArgumentResolver)是两个关键组件,用于处理数据转换和模型绑定的过程。它们是实现灵活性和扩展性的重要手段,尤其在处理用户输入...
标题 "spring编辑器" 暗示我们讨论的是与Spring框架相关的开发工具,可能是用于编辑、配置或调试Spring应用的工具。描述中的链接指向了一篇2019年的博客文章,但无法直接访问以获取详细信息。不过,我们可以基于...
《Spring属性参考与自动绑定详解》 在Java的Spring框架中,属性参考和自动绑定是两个重要的概念,它们为开发者提供了灵活且强大的依赖注入机制。本文将深入解析这两个概念,并通过示例代码来阐述其工作原理。 ### ...
java中的属性编辑器详细说明及Spring中AnnotationMethodHandlerAdapter说明和DefaultAnnotationHandlerMapping的说明及用法
### Spring注解注入属性 #### 一、传统方式与注解方式对比 在Spring框架中,依赖注入(DI)是一种核心的设计模式,用于促进松耦合的系统设计,使得组件之间的依赖关系可以在运行时动态地建立,而不是在编译时硬...
Spring的核心特性之一就是依赖注入,它简化了组件之间的耦合度,提高了代码的可维护性和可测试性。 #### 二、属性值注入概述 在Spring框架中,属性值注入是一种常见的依赖注入方式,用于设置一个Bean的属性值。...
在Spring中,属性注入(Property Injection)是一种重要的功能,它允许开发者在不直接创建对象的情况下设置对象的属性,从而实现了松耦合和更好的可测试性。 **XML方式的属性注入** 1. **Set注入**:这是Spring ...
在Spring框架中,装配是核心概念之一,它允许开发者声明性地配置和组合应用程序组件。本文将深入探讨Spring装配基本属性的原理,帮助你更好地理解如何在代码中使用和配置这些属性。 首先,Spring装配的基本方式有两...
此外,"009_Spring属性编辑器.avi"和"011_Spring属性编辑器_日期格式可配置_多文件读取方式.avi"将讲解Spring属性编辑器的用法,如何处理复杂类型的属性注入,如日期格式化和文件操作。 "010_上午内容回顾.avi"是对...
在Spring框架中,集合属性(Collections Property)是一个重要的概念,它允许我们配置bean的属性为集合类型,如List、Set、Map等。这些集合可以由Spring容器动态填充,提供了极大的灵活性和可配置性,使得我们可以...