0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

剖析Spring中最常用的扩展点(中)

jf_78858299 来源:苏三说技术 作者:苏三说技术 2023-02-15 16:06 次阅读

4.类型转换器

spring目前支持3中类型转换器:

  • Converter:将 S 类型对象转为 T 类型对象
  • ConverterFactory:将 S 类型对象转为 R 类型及子类对象
  • GenericConverter:它支持多个source和目标类型的转化,同时还提供了source和目标类型的上下文,这个上下文能让你实现基于属性上的注解或信息来进行类型转换。

这3种类型转换器使用的场景不一样,我们以Converter例。假如:接口中接收参数的实体对象中,有个字段的类型是Date,但是实际传参的是字符串类型:2021-01-03 10:20:15,要如何处理呢?

第一步,定义一个实体User:

@Data
public class User {

    private Long id;
    private String name;
    private Date registerDate;
}

第二步,实现Converter接口:

public class DateConverter implements Converter {

    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public Date convert(String source) {
        if (source != null && !"".equals(source)) {
            try {
                simpleDateFormat.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

第三步,将新定义的类型转换器注入到spring容器中:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DateConverter());
    }
}

第四步,调用接口

@RequestMapping("/user")
@RestController
public class UserController {

    @RequestMapping("/save")
    public String save(@RequestBody User user) {
        return "success";
    }
}

请求接口时User对象中registerDate字段会被自动转换成Date类型。

5.导入配置

有时我们需要在某个配置类中引入另外一些类,被引入的类也加到spring容器中。这时可以使用@Import注解完成这个功能。

如果你看过它的源码会发现,引入的类支持三种不同类型。

但是我认为最好将普通类和@Configuration注解的配置类分开讲解,所以列了四种不同类型:

图片

5.1 普通类

这种引入方式是最简单的,被引入的类会被实例化bean对象。

public class A {
}

@Import(A.class)
@Configuration
public class TestConfiguration {
}

通过@Import注解引入A类,spring就能自动实例化A对象,然后在需要使用的地方通过@Autowired注解注入即可:

@Autowired
private A a;

是不是挺让人意外的?不用加@Bean注解也能实例化bean。

5.2 配置类

这种引入方式是最复杂的,因为@Configuration注解还支持多种组合注解,比如:

  • @Import
  • @ImportResource
  • @PropertySource等。
public class A {
}

public class B {
}

@Import(B.class)
@Configuration
public class AConfiguration {

    @Bean
    public A a() {
        return new A();
    }
}

@Import(AConfiguration.class)
@Configuration
public class TestConfiguration {
}

通过@Import注解引入@Configuration注解的配置类,会把该配置类相关@Import@ImportResource@PropertySource等注解引入的类进行递归,一次性全部引入。

5.3 ImportSelector

这种引入方式需要实现ImportSelector接口:

public class AImportSelector implements ImportSelector {

private static final String CLASS_NAME = "com.sue.cache.service.test13.A";
    
 public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{CLASS_NAME};
    }
}

@Import(AImportSelector.class)
@Configuration
public class TestConfiguration {
}

这种方式的好处是selectImports方法返回的是数组,意味着可以同时引入多个类,还是非常方便的。

5.4 ImportBeanDefinitionRegistrar

这种引入方式需要实现ImportBeanDefinitionRegistrar接口:

public class AImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(A.class);
        registry.registerBeanDefinition("a", rootBeanDefinition);
    }
}

@Import(AImportBeanDefinitionRegistrar.class)
@Configuration
public class TestConfiguration {
}

这种方式是最灵活的,能在registerBeanDefinitions方法中获取到BeanDefinitionRegistry容器注册对象,可以手动控制BeanDefinition的创建和注册。

6.项目启动时

有时候我们需要在项目启动时定制化一些附加功能,比如:加载一些系统参数、完成初始化、预热本地缓存等,该怎么办呢?

好消息是springboot提供了:

  • CommandLineRunner
  • ApplicationRunner

这两个接口帮助我们实现以上需求。

它们的用法还是挺简单的,以ApplicationRunner接口为例:

@Component
public class TestRunner implements ApplicationRunner {

    @Autowired
    private LoadDataService loadDataService;

    public void run(ApplicationArguments args) throws Exception {
        loadDataService.load();
    }
}

实现ApplicationRunner接口,重写run方法,在该方法中实现自己定制化需求。

如果项目中有多个类实现了ApplicationRunner接口,他们的执行顺序要怎么指定呢?

答案是使用@Order(n)注解,n的值越小越先执行。当然也可以通过@Priority注解指定顺序。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • spring
    +关注

    关注

    0

    文章

    338

    浏览量

    14299
  • AOP
    AOP
    +关注

    关注

    0

    文章

    40

    浏览量

    11085
  • IOC
    IOC
    +关注

    关注

    0

    文章

    28

    浏览量

    10083
收藏 人收藏

    评论

    相关推荐

    Spring框架的设计理念

    Spring作为现在最优秀的框架之一,已被广泛的使用,51CTO也曾经针对Spring框架的hqC应用做过报道。本文将从另外一个视角试图剖析Sp
    发表于 07-15 08:17

    电路中最常见到的电容使用方法

    基于电容常用功能,详细介绍各功能应用电路中最常见到的电容使用方法
    发表于 03-17 08:08

    请问射击探测器中最常用的口径是什么?

    射击探测器中最常用的口径是什么?
    发表于 04-12 06:56

    开关电源中最常用的电阻有哪些呢

    一 电阻1.开关电源中最常用的电阻有贴片电阻、插件色环电阻、压敏电阻、热敏电阻等。2.贴片电阻2.1 贴片电阻:主要按封装和功率来分,常用的有0402 1/16W; 0603 1/10W; 0805
    发表于 12-29 06:14

    单片机系统中最常用的三种通信协议是什么?

    单片机系统中最常用的三种通信协议是什么?
    发表于 02-17 06:03

    EMC问题中最常用的手段RC滤波详细资料说明

    让我们一起来看看处理 EMC 问题中最常用的手段 -RC 滤波。本文介绍了滤波的概念,并详细说明了电阻 - 电容(RC)低通滤波器的用途和特性。
    发表于 12-25 07:08 8次下载
    EMC问题<b class='flag-5'>中最常用</b>的手段RC滤波详细资料说明

    联网应用中最常用的传感器是什么?

    环境、运动、光电/图像和健康监测传感器是物联网应用中最常用的传感器类型
    的头像 发表于 08-16 11:26 935次阅读

    Spring中最常用的11个扩展

    除此之外,我们在使用spring的过程,有没有发现它的扩展能力非常强。由于这个优势的存在,让spring拥有强大的包容能力,让很多第三方应用能够轻松投入
    的头像 发表于 01-11 10:31 846次阅读

    剖析Spring中最常用扩展(上)

    我们一说到spring,可能第一个想到的是 `IOC`(控制反转) 和 `AOP`(面向切面编程)。 没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架
    的头像 发表于 02-15 16:06 717次阅读
    <b class='flag-5'>剖析</b><b class='flag-5'>Spring</b><b class='flag-5'>中最常用</b>的<b class='flag-5'>扩展</b><b class='flag-5'>点</b>(上)

    剖析Spring中最常用扩展(下)

    我们一说到spring,可能第一个想到的是 `IOC`(控制反转) 和 `AOP`(面向切面编程)。 没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架
    的头像 发表于 02-15 16:07 434次阅读

    电子线路中最常用的元器件在射频电路又会是什么情况呢?

    电阻,电容和电感是电子线路中最常用的元器件,在低频电子线路或者直流电路,这些元器件的特性很一致。
    的头像 发表于 02-20 09:09 1131次阅读

    基于spring的SPI扩展机制是如何实现的?

    基本上,你一说是基于 spring 的 SPI 扩展机制,再把spring.factories文件和EnableAutoConfiguration提一下,那么这个问题就答的八九不离十了。
    的头像 发表于 03-07 09:17 994次阅读

    Spring11个最常用扩展分享1

    在使用spring的过程,我们有没有发现它的扩展能力很强呢?由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到
    的头像 发表于 05-11 10:48 529次阅读

    Spring11个最常用扩展分享2

    在使用spring的过程,我们有没有发现它的扩展能力很强呢?由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到
    的头像 发表于 05-11 10:48 364次阅读

    在SIEMENSI工业通讯中最常用的串口介绍

    在SIEMENSI工业通讯最常用的是串口;Profibus;MPI;以太网通讯,在下表中分别对其最大通讯距离进行描述。
    的头像 发表于 09-06 16:16 903次阅读