当前位置: 首页 > news >正文

网上做结婚照的网站安装wordpress提示500错误

网上做结婚照的网站,安装wordpress提示500错误,网站页面,网站怎么做实名认证文章目录 第十七章 数据类型转换工厂设计实现背景技术背景Spring数据转换实现方式类型转换器#xff08;Converter#xff09;接口设计实现 业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件转换器工厂Bean测试用例测试结果#xff1a; 总结 第十七章 数… 文章目录 第十七章 数据类型转换工厂设计实现背景技术背景Spring数据转换实现方式类型转换器Converter接口设计实现 业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件转换器工厂Bean测试用例测试结果 总结 第十七章 数据类型转换工厂设计实现 背景 技术背景 Spring数据转换实现方式 Spring提供了多种机制来实现数据转换以下是一些主要的方式 类型转换器Converter接口 Spring提供了ConverterS, T接口允许开发者自定义转换逻辑。通过实现这个接口你可以定义如何将源类型S转换为目标类型T。例如 Component public class StringToIntegerConverter implements ConverterString, Integer {Overridepublic Integer convert(String source) {return Integer.valueOf(source);} }然后你可以在配置中注册这个转换器Spring会自动在需要的时候使用它。 属性编辑器PropertyEditor PropertyEditor是Java的一个老机制Spring也支持它。通过实现PropertyEditor接口你可以定义如何将字符串转换为其他类型。不过从Spring 5开始推荐使用Converter接口因为PropertyEditor将在未来版本中被弃用。 格式化程序Formatter Formatter是Java的一个接口用于格式化和解析对象。Spring通过FormattingConversionService支持Formatter可以在Spring MVC中使用它来格式化和解析数据。 自动应用的转换器Global Converters 在Spring MVC中可以通过实现WebMvcConfigurer接口的addFormatters方法来添加全局的转换器这些转换器会对所有的控制器方法参数和返回值进行转换。 java Override public void addFormatters(FormatterRegistry registry) {registry.addConverter(new StringToIntegerConverter()); }局部转换器Local Converters 除了全局转换器你还可以在方法级别使用InitBinder注解来添加局部转换器这些转换器只对特定的控制器或请求参数有效。 Spring Expression LanguageSpEL SpEL也支持类型转换当你在表达式中使用不同类型的值时SpEL会尝试进行适当的类型转换。 Java标准转换 Spring还会利用Java的自动装箱和拆箱特性以及Number类的intValue、longValue等方法来进行基本的类型转换。 自定义转换服务 你可以通过编程方式创建ConversionService的实例并注册自定义的转换器然后在你的应用程序中使用这个服务来进行类型转换。 类型转换器Converter接口设计实现 Spring 中的类型转换器Converter接口的底层生效思路主要涉及以下几个方面 接口定义 ConverterS, T 是一个函数式接口用于将类型 S 的对象转换为类型 T 的对象。这个接口定义了一个 convert 方法该方法接受一个类型为 S 的源对象并返回一个类型为 T 的目标对象。 转换器注册 转换器可以通过实现 Converter 接口并注册到 ConversionService 中来生效。ConversionService 是 Spring 中的一个核心接口负责管理所有的转换器并根据需要调用适当的转换器来执行类型转换。 条件转换器 ConditionalConverter 接口允许在转换过程中添加条件判断以决定是否使用特定的转换器。这提供了更细粒度的控制允许在运行时根据具体情况选择是否应用某个转换器。 转换器工厂 ConverterFactoryS, R 接口用于创建一系列相关转换器它允许从类型 S 转换到类型 R 的子类型。这种设计模式支持了范围转换即从一种类型到多种可能的子类型的转换。 泛型转换器 GenericConverter 接口提供了在两个或多个类型之间进行转换的能力它是最灵活但也是最为复杂的转换器SPI接口。GenericConverter 可以处理更复杂的转换场景比如集合到集合的转换。 默认转换服务 DefaultConversionService 是 GenericConversionService 的一个实现它提供了一个默认的转换服务包含了许多内置的转换器覆盖了大多数常用的类型转换场景。如果需要自定义转换逻辑可以向 DefaultConversionService 添加自定义的转换器。 转换器查找和缓存 Spring 会根据源类型和目标类型查找合适的转换器。如果找到了匹配的转换器Spring 会将其缓存起来以提高性能。如果缓存中没有找到匹配的转换器Spring 会尝试查找并添加新的转换器然后再次尝试转换。 转换器的链式调用 Converter 接口中的 andThen 方法支持转换器的链式调用允许将多个转换步骤串联起来先应用一个转换器然后将结果传递给下一个转换器。 业务背景 其实实现到本章节关于IOC、AOP在日常使用和面试中高频出现的技术点都该涵盖了。那么为了补全整个框架内容的结构方便大家后续在阅读 Spring 时不至于对类型转换的知识体系陌生这里添加数据类型转换中关于类型转换器的实现。类型转换也叫做数据转换比如从String到Integer、从String到Date、从Double到Long等等但这些操作不能在已经使用框架的情况下还需要手动处理所以我们要把这样的功能扩展到Spring框架中。 目标 基于当前实现的 Spring 框架扩展类型转换功能并熟悉spring组件服务的开发思路。 设计 如果我们来把只是看上去一个简单的类型转换操作抽象成框架那么它就需要一个标准的接口谁实现这个接口就具备类型转换的具体实现提供类型转换的能力。 那么在有了这样接口后还需要类型转换服务的注册、工厂等内容才可以把类型转换抽象成一个组件服务。整体设计结构如下图 首先从工厂出发我们需要实现一个 ConversionServiceFactoryBean 来对类型转换服务进行操作。 而实现类型转换的服务需要定义 Converter 转换类型、ConverterRegistry 注册类型转换功能另外转换类型的操作较多所以这里也会需要定义一个类型转换工厂 ConverterFactory 各个具体的转换操作来实现这个工厂接口。 实现 代码结构 源码实现https://github.com/swg209/spring-study/tree/main/step17-type-converter-factory 类图 实现步骤 类型转换接口 a. Converter 转换器提供类型转换方法。 public interface ConverterS, T {/*** 将source从 S类型转换为T类型.*/T convert(S source); } b. ConverterFactory 转换工厂用于获取转换器。 public interface ConverterFactoryS, R {/*** 获取转换器将source从S类型转换为T类型其中T也是R的实例。** param targetType* param T* return*/T extends R ConverterS, T getConverter(ClassT targetType);}c. ConverterRegistry 转换注册中心用于服务注册转换器、转换工厂。 public interface ConverterRegistry {void addConverter(Converter?, ? converter);void addConverter(GenericConverter converter);void addConverterFactory(ConverterFactory?, ? converterFactory);} d. ConverterService 转换服务提供 判断类型能否转换以及转换方法。 public interface ConversionService {/*** 是否可以转换.** param sourceType* param targetType* return*/boolean canConvert(Class? sourceType, Class? targetType);/*** 转换.** param source* param targetType* param T* return*/T T convert(Object source, ClassT targetType); }e. GenericConverter 通用转换器门面接口并有一个内部类 ConvertiblePair包装 源类型 与 目标类型。 public interface GenericConverter {/*** Return the source and target types that this converter can convert between.* 返回此转换器可以在其之间转换的源和目标类型.*/SetConvertiblePair getConvertibleTypes();/*** Convert the source object to the targetType described by the {code TypeDescriptor}.* 将源对象转换为由{code TypeDescriptor}描述的targetType.** param source* param sourceType* param targetType* return*/Object convert(Object source, Class sourceType, Class targetType);/*** Holder for a source-to-target class pair.* 源类型到目标类型的持有者.*/final class ConvertiblePair {private final Class? sourceType;private final Class? targetType;public ConvertiblePair(Class? sourceType, Class? targetType) {Assert.notNull(sourceType, source type must not be null);Assert.notNull(targetType, target type must not be null);this.sourceType sourceType;this.targetType targetType;}public Class? getSourceType() {return this.sourceType;}public Class? getTargetType() {return this.targetType;}Overridepublic boolean equals(Object obj) {if (this obj) {return true;}if (obj null || obj.getClass() ! ConvertiblePair.class) {return false;}ConvertiblePair other (ConvertiblePair) obj;return this.sourceType.equals(other.sourceType) this.targetType.equals(other.targetType);}Overridepublic int hashCode() {return this.sourceType.hashCode() * 31 this.targetType.hashCode();}} } 类型转换服务 a. GenericConversionService 实现 ConversionService ConverterRegistry 并添加 根据 转换器或工厂 生成对应类型的 ConvertiblePair 以及 遍历源和目标一系列超类的所有组合获取转换器 的方法辅助设有 内部类 ConverterFactoryAdapter ConverterAdapter 实现 GenericConverter用于 适配 通用转换器方便注册及调用。 public class GenericConversionService implements ConversionService, ConverterRegistry {// 转换器映射表.private MapConvertiblePair, GenericConverter converters new HashMap();Overridepublic boolean canConvert(Class? sourceType, Class? targetType) {GenericConverter converter getConvert(sourceType, targetType);return converter ! null;}Overridepublic T T convert(Object source, ClassT targetType) {Class? sourceType source.getClass();GenericConverter converter getConvert(sourceType, targetType);return (T) converter.convert(source, sourceType, targetType);}Overridepublic void addConverter(Converter?, ? converter) {GenericConverter.ConvertiblePair typeInfo getRequiredTypeInfo(converter);ConverterAdapter converterAdapter new ConverterAdapter(typeInfo, converter);for (GenericConverter.ConvertiblePair convertibleType : converterAdapter.getConvertibleTypes()) {converters.put(convertibleType, converterAdapter);}}Overridepublic void addConverter(GenericConverter converter) {// 遍历转换器支持的类型将其添加到转换器映射表中.for (GenericConverter.ConvertiblePair convertibleType : converter.getConvertibleTypes()) {converters.put(convertibleType, converter);}}Overridepublic void addConverterFactory(ConverterFactory?, ? converterFactory) {ConvertiblePair typeInfo getRequiredTypeInfo(converterFactory);ConverterFactoryAdapter converterFactoryAdapter new ConverterFactoryAdapter(typeInfo, converterFactory);for (ConvertiblePair convertibleType : converterFactoryAdapter.getConvertibleTypes()) {converters.put(convertibleType, converterFactoryAdapter);}}private GenericConverter getConvert(Class? sourceType, Class? targetType) {ListClass? sourceCandidates getClassHierarchy(sourceType);ListClass? targetCandidates getClassHierarchy(targetType);for (Class? sourceCandidate : sourceCandidates) {for (Class? targetCandidate : targetCandidates) {ConvertiblePair convertiblePair new ConvertiblePair(sourceCandidate, targetCandidate);GenericConverter converter converters.get(convertiblePair);if (converter ! null) {return converter;}}}return null;}private ListClass? getClassHierarchy(Class? clazz) {ListClass? hierarchy new ArrayList();while (clazz ! null) {hierarchy.add(clazz);clazz clazz.getSuperclass();}return hierarchy;}//因为要同时兼容 Converter、ConverterFactory所以这里传参为Object.private ConvertiblePair getRequiredTypeInfo(Object object) {Type[] types object.getClass().getGenericInterfaces();ParameterizedType parameterizedType (ParameterizedType) types[0];Type[] actualTypeArguments parameterizedType.getActualTypeArguments();Class sourceType (Class) actualTypeArguments[0];Class targetType (Class) actualTypeArguments[1];return new ConvertiblePair(sourceType, targetType);}private final class ConverterAdapter implements GenericConverter {private final ConvertiblePair typeInfo;private final ConverterObject, Object converter;public ConverterAdapter(ConvertiblePair typeInfo, Converter?, ? converter) {this.typeInfo typeInfo;this.converter (ConverterObject, Object) converter;}Overridepublic SetConvertiblePair getConvertibleTypes() {return Collections.singleton(typeInfo);}Overridepublic Object convert(Object source, Class sourceType, Class targetType) {return converter.convert(source);}}private final class ConverterFactoryAdapter implements GenericConverter {private final ConvertiblePair typeInfo;private final ConverterFactoryObject, Object converterFactory;public ConverterFactoryAdapter(ConvertiblePair typeInfo, ConverterFactory?, ? converterFactory) {this.typeInfo typeInfo;this.converterFactory (ConverterFactoryObject, Object) converterFactory;}Overridepublic SetConvertiblePair getConvertibleTypes() {return Collections.singleton(typeInfo);}Overridepublic Object convert(Object source, Class sourceType, Class targetType) {return converterFactory.getConverter(targetType).convert(source);}} } b. DefaultConversionService 继承 GenericConversionService 通过构造函数注册 内置的 类型转换器或工厂, 并对外作为一个 注册中心使用。 public class DefaultConversionService extends GenericConversionService {public DefaultConversionService() {addDefaultConverters(this);}public static void addDefaultConverters(ConverterRegistry converterRegistry) {// 添加各类类型转换工厂.converterRegistry.addConverterFactory(new StringToNumberConverterFactory());} } 融入 Bean 的生命周期 a. 类型转换工厂 ConversionServiceFactoryBean实现 FactoryBean, InitializingBean这样 在其初始化时就可以 注册类型转换器、工厂。 public class ConversionServiceFactoryBean implements FactoryBeanConversionService, InitializingBean {Nullableprivate Set? converters;Nullableprivate GenericConversionService conversionService;Overridepublic ConversionService getObject() throws Exception {return conversionService;}Overridepublic Class? getObjectType() {return conversionService.getClass();}Overridepublic boolean isSingleton() {return true;}Overridepublic void afterPropertiesSet() throws BeansException {this.conversionService new DefaultConversionService();registerConverters(converters, conversionService);}private void registerConverters(Set? converters, ConverterRegistry registry) {if (converters ! null) {for (Object converter : converters) {if (converter instanceof GenericConverter) {registry.addConverter((GenericConverter) converter);} else if (converter instanceof Converter?, ?) {registry.addConverter((Converter?, ?) converter);} else if (converter instanceof ConverterFactory?, ?) {registry.addConverterFactory((ConverterFactory?, ?) converter);} else {throw new IllegalArgumentException(Each converter object must implement one of the Converter, ConverterFactory, or GenericConverter interfaces Unsupported converter type: converter.getClass());}}}}public void setConverters(Set? converters) {this.converters converters;} } b. 通过 ConfigurableBeanFactory 添加 设置、获取类型转换服务方法由 AbstractBeanFactory 实现使得 在刷新容器 实例化单例对象前可以优先获取到 ConversionServiceFactoryBean 并设置 beanfactory 的 类型转换服务并在 AbstractAutowireCapableBeanFactory 的 createBean 属性填充前 增加 类型转换的操作。 测试 事先准备 多类型属性的类 Husband Husband public class Husband {private String wifeName;private LocalDate marriageDate;public String getWifeName() {return wifeName;}public void setWifeName(String wifeName) {this.wifeName wifeName;}public LocalDate getMarriageDate() {return marriageDate;}public void setMarriageDate(LocalDate marriageDate) {this.marriageDate marriageDate;}Overridepublic String toString() {return Husband{ wifeName wifeName \ , marriageDate marriageDate };} }属性配置文件 spring.xml 配置husband类型转换服务工厂Bean, 类型转换服务 ?xml version1.0 encodingUTF-8? beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlnshttp://www.springframework.org/schema/beansxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdbean idhusband classcn.suwg.springframework.test.bean.Husbandproperty namewifeName value老老/property namemarriageDate value2022-04-14//beanbean idconversionService classcn.suwg.springframework.context.support.ConversionServiceFactoryBeanproperty nameconverters refconverters//beanbean idconverters classcn.suwg.springframework.test.converter.ConvertersFactoryBean/ /beans转换器工厂Bean ConvertersFactoryBean public class ConvertersFactoryBean implements FactoryBeanSet? {Overridepublic Set? getObject() throws Exception {HashSetObject converters new HashSet();StringToLocalDateConverter stringToLocalDateConverter new StringToLocalDateConverter(yyyy-MM-dd);converters.add(stringToLocalDateConverter);return converters;}Overridepublic Class? getObjectType() {return null;}Overridepublic boolean isSingleton() {return true;} } StringToIntegerConverter public class StringToIntegerConverter implements ConverterString, Integer {Overridepublic Integer convert(String source) {return Integer.valueOf(source);} } StringToLocalDateConverter public class StringToLocalDateConverter implements ConverterString, LocalDate {private final DateTimeFormatter DATE_TIME_FORMATTER;public StringToLocalDateConverter(String pattern) {DATE_TIME_FORMATTER DateTimeFormatter.ofPattern(pattern);}Overridepublic LocalDate convert(String source) {return LocalDate.parse(source, DATE_TIME_FORMATTER);} } 测试用例 public class ApiTest {Testpublic void testConvert() {ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(classpath:spring.xml);Husband husband applicationContext.getBean(husband, Husband.class);System.out.println(测试结果: husband);}//返回转换好的日期. 年-月-日Testpublic void testStringToLocalDateConverter() {StringToLocalDateConverter converter new StringToLocalDateConverter(yyyy-MM-dd hh:mm:ss);LocalDate convert converter.convert(2024-11-07 10:00:11);LocalDate expect LocalDate.of(2024, 11, 7);Assert.assertEquals(expect, convert);System.out.println(convert);}// 测试字符串转换为整数.Testpublic void testStringToIntegerConverter() {StringToIntegerConverter converter new StringToIntegerConverter();Integer convert converter.convert(12345);Assert.assertEquals(Integer.valueOf(12345), convert);System.out.println(convert);} } 测试结果 从测试结果可以看到字符串转日期转换器功能正常。 从测试结果可以看到字符串转数字转换器功能正常。 从测试结果可以看到对象属性值可以正常输出到日志。这个测试内容还是比较简单的可以自行验证结果虽然最终的结果看上去比较简单但整个框架结构实现设计还是蛮复杂的把这么一个转换操作抽象为接口适配、工厂模型等方式还是很值得借鉴的。 总结 本章节实现的类型转换操作如果只是功能性的开发就像你自己承接的需求那样可能只是简单的if判断就搞定了但放在一个成熟的框架要中要考虑的是可复用性、可扩展性所以会看到接口的定义、工厂的使用等等设计模式在这里体现。恭喜你能够坚持学习到这一章节。如果你在学习过程中每一章节都是通过阅读文章、编写代码、调试错误以及理解设计来完成的那么一定会在这个过程中获得很多宝贵的经验和知识。以后再次阅读Spring源码时就不会觉得那么困难了。 参考书籍《手写Spring渐进式源码实践》 书籍源代码https://github.com/fuzhengwei/small-spring
http://www.dnsts.com.cn/news/50127.html

相关文章:

  • 网站建设经营范围怎么写网站开发要用什么工具软件
  • 网站建设教程这篇苏州久远网络淮安公司企业网站建设
  • 站内站怎么搭建wordpress装在xampp
  • 企业网站开发外包合同公司推广哪个平台好
  • 网站开发与管理微网站建设教程视频
  • 那个网站卖做防水的烤枪邀请注册推广赚钱
  • 海口网站公司如何做好专业类网站
  • 网站开发费怎样入账淄博网站建设团队
  • 长沙做信息seo网站软件开发外包商业模式
  • 网站开发流程进度表用vue做网站
  • 怎样电脑登录网站乐平网站
  • pageadmin仿站教程学物联网工程后悔死了
  • 网站建设营业执照wordpress链接跳转错误
  • 开通公司网站怎么做分录哈尔滨建站模板
  • 网站搭建详细教程discuz模板下载
  • 广州优化网站推广网站的虚拟人怎么做的
  • 网站的ftp怎么登陆有哪些企业官网做得比较好
  • 外链网站推荐几个巴中做网站公司
  • 网站 流量攻击免费发布便民信息平台
  • 从事网站开发需要哪些知识学做网站需要什么基础
  • 怎样用网站做淘宝推广WordPress站点地图代码
  • 傻瓜建网站湖南网站设计公司
  • 自己做的网站改变字体企业网站数防泄露怎么做
  • 做网站的工资网络营销的主要手段和策略
  • 陕西省信用建设门户网站有代源码怎么做自己网站
  • 怎么做网站demowordpress ldap外部登录认证
  • 亚马逊如何做站外促销网站上传自己做的网站后台怎么办
  • 秒收的网站文明网网站建设
  • 网站后台密码忘记了怎么办母婴网站模板dede
  • 社交网站开发教程张家界搜索引擎优化