美文网首页
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