zoukankan      html  css  js  c++  java
  • Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!

    前一篇《不要再说不会Spring了!Spring第一天,学会进大厂!》文章可点击下方链接进行回看。

    不要再说不会Spring了!Spring第一天,学会进大厂!

    今天将继续讲解Spring的注册bean的方式。将通过代码片段+源码的方式,用图文结合来讲清楚这些注册bean的方式。

    一、@Conditional条件注册bean

    @Conditional:是Spring4新提供的注解,它的作用是按照一定条件进行判断,满足条件后往IOC容器中进行注册。

    场景:往IOC容器中注册bean时,当操作系统为Windows时,注册cansluck实例;当操作系统为Linux时,注册xgx实例;此时用到@Conditional注解进行定制化条件选择注册bean。

    实例:

    新建WinCondition.java类作为条件类,用来处理操作系统为Windows的bean注册;同时必须得实现Spring提供的Condition接口。

    WinCondition.java类:

    新建LinuxConditional条件类,用来处理操作系统为Linux的bean注册。

    LinuxConditional.java类:

    来解析一下接口Condition,看下Condition接口的代码(JDK封装):

    接口中定义了一个抽象方法:matches(),返回true时,则意味着注册被注解的bean,反之返回false。因此实现该接口时,都要实现该接口的matches抽象方法。

    ConditionContext接口为获取IOC容器或者对象工厂的接口,里面提供了几个抽象方法,如下图:

    可以看到提供了5个抽象方法,分别返回不同的对象。在这里我们用到getEnvironment()获取到当前编译环境的方法,来结合场景配合@Conditional注解来使用。(有兴趣的朋友可以自行拓展,比如获取IOC容器bean可以使用getBeanFacroty()方法等等。)

    回过头来,我们在MainConfig.java配置类中,如果为windows环境,则将cansluck注册到IOC容器中;如果为linux环境,则将xgx注册到IOC容器中。下面用测试类来测试一下:

    我们可以看到person是传统@Bean注解进行了注册,当前环境为windows环境,因此cansluck符合条件,因此将cansluck注册到IOC容器中,xgx并没有注册到IOC容器。

    如果不加@Conditional注解,则会将cansluck和xgx全部注册到IOC容器中(这里就不做演示了,有兴趣的小伙伴可以自行去掉注解进行操作);因此当引入@Conditional注解时,容器可以选择性注册bean。

    二、@Import注册bean

    上面讲的基本上是@Bean的方式往IOC容器中注册bean,那样需要在配置类中添加多个对应bean的实现方法,这样也会让代码看起来非常的冗余。因此Spring也提供了@Import注解的方式,可以按照数组的形式,添加一个或者多个bean完成IOC容器中bean的注册。

    1. 使用@Import注解方式注册bean

    当前项目中,已经建立了一个Person实体类,并且通过@Bean的方式往IOC容器中注册bean。

    现在,分别再建立一个Dog 和 Cat 实体类,通过@Import的方式往IOC容器中注册备案。

    代码如下:

    新建Dog.java 和 Cat.java 类

    MainConfig.java配置类

    这样,就能够不需要再写@Bean的方式写很多方法,而是可以通过@Import注解的方式,将一个或者多个类注册往IOC容器中进行注册。就省了很多重复代码工作量的过程。

    2. 使用@ImportSelector注册bean

    使用@ImportSelector注解可以批量导入组件的全类名数组,自定义逻辑返回需要导入组件对应ImportSelector.java类

    代码如下:

    新建Fish.java 和 Tiger.java类

    CansluckImportSelector.java类

    MainConfig.java配置类

    Test测试类

    通过测试类测试后可以看到,Fish和Tiger两个实体类也被注册到了IOC容器中。

    3. 使用@ImportBeanDefinitionRegister注册bean

    使用@ImportBeanDefinitionRegister自定义注册向IOC容器注册bean。

    新建Pig.java类

    CansluckImportBeanDefinitionRegistrar.java类

    (在上面的代码中,我们看到引用了RootBeanDefinition类对象进行实例化,在后续的持续学习中,会介绍到该类的一个源码介绍,而且会发现基本上都是用了这个类来进行bean的注册)

    MainConfig.java配置类

    Test测试类

    通过测试类测试后可以看到,Pig实体类也被注册到了IOC容器中。

    4. 通过实现FactoryBean接口来注册bean

    新建Monkey.java类

    CansluckFactoryBean.java类

    可以看到实现了FactoryBean接口,并实现了三个抽象方法。

    可以先来看下FactoryBean的源码:

    使用Spring提供的FactoryBean(工厂bean)接口,可以根据源码看到有三个抽象方法:

    1. getObject()返回对象,把对象放到容器中;

    2. getObjectType()返回对象类型;

    3. isSingleton()是否单例进行控制

    MainConfig.java配置类

    在这里采用了@​Bean的方式进行注册,也可以在@Import中引入进行注册

    以上就是给容器注册组件的​方式。有兴趣的小伙伴可以根据案例自行尝试并​阅读源码进行分析。

    给容器中注册组件的方式总结

    1. @Bean​:【导入第三方的类或包的组件】

    2. 包扫描 + 组件的标注注解(@ComponentScan: 针对@Controller、@Service、@Reponsitory、@Component),一般是针对我们自己写的类使用该方式

    3. @Import​:【快速给容器导入一个或多个组件】,@Bean有点简单

        ​① @Import(要导入到容器中的组件)​:容器会自动注册这个组件,其中注册的bean的id为组件的全路径类名(比如com.java.xxx.Person)

        ​② ​ImportSelector:是一个接口,返回需要导入到容器的组件全类名数组

        ​③ ImportBeanDefinitionRegistr​ar:可以手动添加组件到IOC容器中,所有Bean的注册可以使用BeanDefinitionRegistry(例如写CansluckBeanDefinitionRegistrar实现ImportBeanDefinitionRegistrar接口即可)

        ​④ 使用Spring提供的FactoryBean(工厂Bean)进行注册

    以上为Spring相关给容器中注册组件的方式总结,小伙伴们有更多的一些建议和看法可以在下方进行留言​。

    码字不易,希望能够点赞,关注,分享~谢谢啦

    < END >

    Java极客思维

    微信扫一扫,关注公众号

  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/xgx120413/p/13993558.html
Copyright © 2011-2022 走看看