在springboot现在如日中天的时候,虽然很多人都在用它,但是有些伙伴可能并不知道它的神秘之处,或许或多或少有一些疑问?
比如:
最近笔者在学习gateway的路由predicate、filters的配置,就是在思考怎么转换成对象RouteDefinition,所以今天特地深入研究下。
private Binder getBinder() {
if (this.binder == null) {
//在这里发现,这个binder对象,拥有ConversionService(这个对象拥有我们所需要的的List<Converter>集合)
this.binder = new Binder(getConfigurationPropertySources(), getPropertySourcesPlaceholdersResolver(),
getConversionService(), getPropertyEditorInitializer(), null,
ConfigurationPropertiesBindConstructorProvider.INSTANCE);
}
return this.binder;
}
//ApplicationConversionService类中
public static ConversionService getSharedInstance() {
ApplicationConversionService sharedInstance = ApplicationConversionService.sharedInstance;
if (sharedInstance == null) {
synchronized (ApplicationConversionService.class) {
sharedInstance = ApplicationConversionService.sharedInstance;
if (sharedInstance == null) {
sharedInstance = new ApplicationConversionService();
ApplicationConversionService.sharedInstance = sharedInstance;
}
}
}
return sharedInstance;
}
protected void configureEnvironment(ConfigurableEnvironment environment, String[] args) {
//这个默认是true
if (this.addConversionService) {
//ApplicationConversionService的单例加载
ConversionService conversionService = ApplicationConversionService.getSharedInstance();
environment.setConversionService((ConfigurableConversionService) conversionService);
}
configurePropertySources(environment, args);
configureProfiles(environment, args);
}
在ApplicationConversionService类初始化的时候,就会添加很多很多Converter,在#addDefaultConverters方法中我们就可以找到今天的主角。
通过看代码和代码注释,可以得出ObjectToObjectConverter类进行转换有几个关注方法。
代码可以各位去看,我就不贴出来了,只是根据具体例子来演示。这个我们先定义好源类型和目标类型(想要转换的类型)
源类型SourceClass => String.class (因为我们配置的东西大多都是字符串)
源的值 SourceValue => “abc”
目标类型TargetClass => People.class (假设我们有一个People对象)
指的是:在SourceClass类中查找to${TargetClass.simpleClassName}的方法。
在这里的例子中,也就是在String类中,查找toPeople的方法,如果找不到,则跳过
public People toPeople(String source){}
不过我们也不可能在String类中定义方法,所以这个determineToMethod 有判断,只要任何一方为String类型,就直接返回null
if (String.class == targetClass || String.class == sourceClass) {
// Do not accept a toString() method or any to methods on String itself
return null;
}
指的是: 在TargetClass中查找静态方法,valueOf、 of 、from方法
在这里的例子中,就是在People中查找如下三种方法,进行工厂方法转换
public static People valueOf (String source){}
public static People of (String source){}
public static People from(String source){}
指的是: 根据构造函数转换对象
也就是在People类中,查找source的构造函数,进行转换
public People(String source){}
本文地址:https://blog.csdn.net/he702170585/article/details/107332094
如对本文有疑问, 点击进行留言回复!!
springmvc之ResponseBody响应json数据遇到的错误及解决
uni-app 后台升级 静默升级 uniapp 后台更新 静默更新 在线升级
SpringBoot多Module启动报错Could not transfer metadata
Hibernate项目报错:Cannot call sendError() after the response has been committed
网友评论