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极客思维

    微信扫一扫,关注公众号

  • 相关阅读:
    Ant安装及环境配置
    tp5 自定义公共函数,前台模板调用
    Linux下查看当前文件大小的命令
    超级好用的视频压缩工具
    ubuntu 安装 gd
    wordpress Error establishing a database connection问题
    wordpress 上传图片出现权限或者http错误
    nginx解决WordPress 上传到服务器后页面404错误的方法
    ubuntu mysql新增用户并开启远程连接
    linux每日命令(21): find命令之exec
  • 原文地址:https://www.cnblogs.com/xgx120413/p/13993558.html
Copyright © 2011-2022 走看看