美文网首页
spring中属性编辑器

spring中属性编辑器

作者: 叶小松_ea46 | 来源:发表于2021-04-15 17:58 被阅读0次

在spring中如果你想实现一个字符串格式的时间转成Date类型的属性 方式 如下 

1.定义一个属性解析器

public class Time implements PropertyEditorRegistrar {

    public void registerCustomEditors(PropertyEditorRegistry registry) {

        registry.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));

    }

}

2.将自定义的属性解析器 注入propertyEditorRegistrars属性中

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">

    <property name="propertyEditorRegistrars">

        <list>

            <bean class="Time"></bean>

        </list>

    </property>

</bean>

但是它是怎么注入的呢?

其实它是在ApplicationContext中注入的

prepareBeanFactory方法ApplicationContext对BeanFactory进行各种功能的扩展的地方

其中有一个方法addPropertyEditorRegistrar 可以看到 将自定义的属性解析器注入其中

那它是什么时候执行的呢?

在我们创建Bean的时候 其中有一个步骤是将BeanDefinition转换为BeanWrapper的过程

可以看到 在转换完成后 BeanWrapper会进行初始化操作

在初始化的过程中有一步回去调用属性解析器 进行属性的解析

顺便提一嘴

BeanWrapper的实现是BeanWrapperImpl,BeanWrapperImpl继承自PropertyEditorRegistrySupport, 其中有createDefaultEditors()提供了默认的属性解析器 如果下

所以如果没有特殊需求 spring自带的属性解析器就能满足属性的转换 如果需要自定义 spring也提供了其功能 让用户自定义书写并且注入到容器中

private void createDefaultEditors() {

   this.defaultEditors = new HashMap<>(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(Path.class, new PathEditor());

   this.defaultEditors.put(Pattern.class, new PatternEditor());

   this.defaultEditors.put(Properties.class, new PropertiesEditor());

   this.defaultEditors.put(Reader.class, new ReaderEditor());

   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());

   this.defaultEditors.put(ZoneId.class, new ZoneIdEditor());

   // 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);

   }

}

相关文章

网友评论

      本文标题:spring中属性编辑器

      本文链接:https://www.haomeiwen.com/subject/cchjlltx.html