你真的了解 spring 属性编辑器吗?它竟能实现如此神奇的转换

配置文件在Spring运行过程中扮演着”魔法书”的关键角色,包含大量丰富的”咒语”,用来指引开发者成功实现Bean的创建和管理。然而,有些时候这些咒语(即配置信息)可能不为Spring所直接识别,这时就需要借助”翻译大师”——自定义属性编辑器进行解读。

什么是Spring属性编辑器?

概括来说,Spring属性编辑器系实现配置文件字符串实体化处理(即将字符串转化为Java对象)的关键手段。以地址式字符串为例,假使您在Spring配置文件中对此类字符串进行定义,其实际需求则转为对Resource对象的创建。在此种情况下,Spring内置的ResourceEditor便会自动启动并协助完成该任务,使配置文件中的字符串顺利转化为实际可用的Java对象。


		
		

ResourceEditor属性编辑器

private Resource configLocation;

ResourceEditor以资源处理见长,在Spring框架中功不可没。它能巧妙地将字符串转化成Resource型对象。其核心技术在于setAsText(Stringtext)方法,犹如魔法师挥舞魔杖,轻松完成字符串到Resource对象的神奇转变。

xmlConfigBuilder = new XMLConfigBuilder(configLocation.getInputStream(), null, configurationProperties);
            configuration = xmlConfigBuilder.getConfiguration();

自定义属性编辑器:让你的配置文件更智能

在特定环境下,Spring自带的属性编辑器可能无法满足需求。例如,将字符串形式的日期转为Date类型需自定义属性编辑器。为此,只需全方位复制并覆盖PropertyEditorSupport接口中的getAsText()与setAsText(Stringtext)方法。如此操作后,自定义属性编辑器便可实现字符至对象的灵活转换,如同Spring内置功能一样强大。

public class ResourceEditor extends PropertyEditorSupport {
    private final ResourceLoader resourceLoader;
    @Nullable
    private PropertyResolver propertyResolver;
    private final boolean ignoreUnresolvablePlaceholders;
    public ResourceEditor() {
        this(new DefaultResourceLoader(), (PropertyResolver)null);
    }
    public ResourceEditor(ResourceLoader resourceLoader, @Nullable PropertyResolver propertyResolver) {
        this(resourceLoader, propertyResolver, true);
    }
    public ResourceEditor(ResourceLoader resourceLoader, @Nullable PropertyResolver propertyResolver, boolean ignoreUnresolvablePlaceholders) {
        Assert.notNull(resourceLoader, "ResourceLoader must not be null");
        this.resourceLoader = resourceLoader;
        this.propertyResolver = propertyResolver;
        this.ignoreUnresolvablePlaceholders = ignoreUnresolvablePlaceholders;
    }
    public void setAsText(String text) {
        if (StringUtils.hasText(text)) {
            String locationToUse = this.resolvePath(text).trim();
            this.setValue(this.resourceLoader.getResource(locationToUse));
        } else {
            this.setValue((Object)null);
        }
    }
    protected String resolvePath(String path) {
        if (this.propertyResolver == null) {
            this.propertyResolver = new StandardEnvironment();
        }
        return this.ignoreUnresolvablePlaceholders ? this.propertyResolver.resolvePlaceholders(path) : this.propertyResolver.resolveRequiredPlaceholders(path);
    }
    @Nullable
    public String getAsText() {
        Resource value = (Resource)this.getValue();
        try {
            return value != null ? value.getURL().toExternalForm() : "";
        } catch (IOException var3) {
            return null;
        }
    }
}

“CustomEditorConfigurer负责属性编辑器的全面管理工作。”

在Spring特性内,属性编辑器的应用依托两大内存管理机构。首先,通过注册到propertyEditorRegistrars以实现,此乃Spring预设策略;其次,亦可委派CustomEditorConfigurer承担任务,此类执行方式遵循BeanFactoryPostProcessor原则,即在Spring开局时,由PropertyEditor配置抽象接口携带自定义属性编辑器存入customEditors。从而确保各用户定制型属性编辑器无缝融入Spring应用程序。

配置类MyConfig:让属性编辑器生效

public class MyDateEditor extends PropertyEditorSupport {
	private List list;
	{
		list = new ArrayList();
		list.add(new SimpleDateFormat("yyyy-MM-dd"));
		list.add(new SimpleDateFormat("yyyy年MM月dd日"));
	}
	public String getAsText() {
		return getValue().toString();
	}
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public void setAsText(String text) throws IllegalArgumentException {
		for (SimpleDateFormat format : list) {
			try {
				Date date = format.parse(text);
				setValue(date);
				return;
			} catch (ParseException e) {
			}
		}
		throw new RuntimeException("无法转换");
	}
}

为了让Spring框架中的定制属性编辑器有效,需要进行参数化处理。首先,我们需要创建一个叫作’MyConfig’的配置文件,然后通过’CustomEditorConfigurer’在其中注册该自定义编辑器。这样就可以确保编辑器能在Spring环境下正常工作了。

属性转换测试:见证奇迹的时刻

在研发专属特性编辑器过程中,务必严谨执行完整测试程序。通过精炼的测试环节与Spring配置文件配合运行此编辑器。完成以上步骤后,你将惊奇地察觉到配置文件内的字符串已精确无误地转化为所需的Java对象。这是一项卓越的成果——我们的配置文件由此焕发新生。

private final Set propertyEditorRegistrars = new LinkedHashSet(4);
private final Map<Class, Class> customEditors = new HashMap(4);

总结与展望

通过利用自定义属性编辑器的优势,我们能进一步提升Spring配置文件的智能化程度,从而极大提高开发效率。设想一下,如果缺少这样的辅助工具,面对充满复杂字符串的配置文件,无疑会给我们带来诸多困扰。因此,我强烈推荐您尽早创建专属于自己的自定义属性编辑器,让其成为您高效工作的得力助手。

请问诸位前辈,您是否曾面临设计定制属性编辑器的困扰?请不吝在下方留言区分享您的成功策略,感激不尽!

public class CustomEditorConfigurer implements BeanFactoryPostProcessor, Ordered {
    protected final Log logger = LogFactory.getLog(this.getClass());
    private int order = 2147483647;
    @Nullable
    private PropertyEditorRegistrar[] propertyEditorRegistrars;
    @Nullable
    private Map<Class, Class> customEditors;
    public CustomEditorConfigurer() {
    }
    public void setOrder(int order) {
        this.order = order;
    }
    public int getOrder() {
        return this.order;
    }
    public void setPropertyEditorRegistrars(PropertyEditorRegistrar[] propertyEditorRegistrars) {
        this.propertyEditorRegistrars = propertyEditorRegistrars;
    }
    public void setCustomEditors(Map<Class, Class> customEditors) {
        this.customEditors = customEditors;
    }
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        if (this.propertyEditorRegistrars != null) {
            PropertyEditorRegistrar[] var2 = this.propertyEditorRegistrars;
            int var3 = var2.length;
            for(int var4 = 0; var4 < var3; ++var4) {
                PropertyEditorRegistrar propertyEditorRegistrar = var2[var4];
                beanFactory.addPropertyEditorRegistrar(propertyEditorRegistrar);
            }
        }
        if (this.customEditors != null) {
            this.customEditors.forEach(beanFactory::registerCustomEditor);
        }
    }
}

发表评论