SpringBoot2底层注解

一、@ImportResource

@Conditional注解,是根据条件进行装配。满足了 Conditional 指定的条件,就进行组件的注入。

另外@Conditional是个根注解,在idea里使用 ctrl H 可以打开它的结构。

可以看到有许多的派生注解,每个注解都代表着一种功能。比如:

@ConditionalOnBean:当容器中存在指定的组件,才会做某些事情。

@ConditionalOnMissingBean:当容器中没有指定的组件,才会做某些事情。

@ConditionalOnClass:当容器中存在指定的类。

@ConditionalOnMissingClass:当容器中不存在指定的类。

@ConditionalOnResource:项目类路径里存在某个资源的时候。

@ConditionalOnJava:当是指定的 java 版本号。

@ConditionalOnWebApplication:当应用是一个 web 应用的时候。

@ConditionalOnNotWebApplication:当应用不是一个 web 应用的时候。

@ConditionalOnProperty:当配置文件里存在指定属性的时候。

示例

以@ConditionalOnBean为例,演示一下用法。

还是看一下之前 MyConfig 类中的方法:

@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
    @Bean("user1")
    public User user01(){
        User pingguo = new User("pingguo",20);
        pingguo.setPet(tomcatPet());
        return pingguo;
    }
//    @Bean("pet1")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

在这里,我把pet1这个组件给注释掉,现在tomcatPet()其实就是个普通的类方法。

先尝试在主运行类的 main 方法里获取一下 这 2 个 组件:

@SpringBootApplication(scanBasePackages = "com.pingguo")
public class MainApplication {
    public static void main(String[] args) {
        // 返回IOC容器
        final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        boolean tomcatPet = run.containsBean("pet1");
        System.out.println("容器中存在 pet1 的组件:"   tomcatPet);
        boolean user1 = run.containsBean("user1");
        System.out.println("容器中存在 user1 的组件:"   user1);
    }
}

运行一下,查看结果:

果然,是不存在pet1组件的,因为@bean这个注解被我注释掉了。

OK,现在我有个需求,因为user1组件依赖pet1组件,如果没有pet1,我希望user1组件也直接别注册了。

这时候就可以使用@ConditionalOnBean注解来完成。

@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
    @ConditionalOnBean(name = "pet1")
    @Bean("user1")
    public User user01(){
        User pingguo = new User("pingguo",20);
        pingguo.setPet(tomcatPet());
        return pingguo;
    }
//    @Bean("pet1")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

在 user1组件上加上@ConditionalOnBean(name = "pet1"),当没有pet1组件,就不注册user1组件。

现在再运行 main 方法测试一下,应该都是 false,2个组件都不存在。

作用在类上

@ConditionalOnBean(name = "pet1")如果我放在类上:

@ConditionalOnBean(name = "pet1") // 放在类上
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
    @Bean("user1")
    public User user01(){
        User pingguo = new User("pingguo",20);
        pingguo.setPet(tomcatPet());
        return pingguo;
    }
    @Bean("pet22")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

现在就表示,当存在pet1组件的时候,这个类下面的所有才会生效。

这里我改了下面的组件注册变成pet22,也就是说当存在pet1组件的时候,就会注册user1和pet22。

在 main 方法里增加打印pet22,查看是否存在:

... ...
    boolean pet22 = run.containsBean("pet22");
    System.out.println("容器中存在 pet22 的组件:"   pet22);
... ...

运行一下:

因为不存在pet1这个组件,所有MyConfig类下面的2个组件user1和pet22的注册都不生效。

二、@ImportResource

@ImportResource注解是用来导入资源。

比如,之前我们可能会在 spring 配置文件中写非常多的组件导入:

... ...
    <bean id="haha" class="com.pingguo.boot.bean.User">
        <property name="name" value="pingguo"></property>
        <property name="age" value="20"></property>
    </bean>
    <bean id="hehe" class="com.pingguo.boot.bean.User">
        <property name="name" value="tomcat"></property>
    </bean>

这里只是demo,实际工程中可能会存在很多 bean,如果想要逐个迁移成注解的方式,会很麻烦。

但是现在容器里又是没有这些组件的,在 main 方法里输出测试一下:

boolean haha = run.containsBean("haha");
    System.out.println("容器中存在 haha 的组件:"   haha);
    boolean hehe = run.containsBean("hehe");
    System.out.println("容器中存在 hehe 的组件:"   hehe);

因为这些组件声明在 xml 里,springboot 也并不知道这些是干嘛的。

这时候就可以使用@ImportResource来导入这些组件:

//@ConditionalOnBean(name = "pet1")
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
@ImportResource("classpath:beans.xml")  //配置文件的类路径 
public class MyConfig {
    @Bean("user1")
    public User user01(){
        User pingguo = new User("pingguo",20);
        pingguo.setPet(tomcatPet());
        return pingguo;
    }
    @Bean("pet22")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

这个时候再运行测试一下:

xml 配置文件里的组件被成功解析注册到了容器中。

以上就是浅析SpringBoot2底层注解@Conditional@ImportResource的详细内容,更多关于SpringBoot2底层注解的资料请关注Devmax其它相关文章!

浅析SpringBoot2底层注解@Conditional@ImportResource的更多相关文章

  1. Spring Boot自动配置的原理及@Conditional条件注解

    这篇文章主要介绍了Spring Boot自动配置的原理及@Conditional条件注解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的朋友可以参考一下

  2. springboot2学习世界著名程序springboot开发体验

    这篇文章主要为大家介绍了世界著名程序springboot开发体验,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. SpringBoot2底层注解@Configuration配置类详解

    这篇文章主要为大家介绍了SpringBoot2底层注解@Configuration配置类详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. SpringBoot 2.x整合Log4j2日志的详细步骤

    log4j2优越的性能其原因在于log4j2使用了LMAX,一个无锁的线程间通信库代替了,logback和log4j之前的队列,并发性能大大提升,下面这篇文章主要给大家介绍了关于SpringBoot 2.x整合Log4j2日志的相关资料,需要的朋友可以参考下

  5. Spring Boot中@Conditional注解介绍

    @Conditional表示仅当所有指定条件都匹配时,组件才有资格注册。该@Conditional注释可以在以下任一方式使用:作为任何@Bean方法的方法级注释、作为任何类的直接或间接注释的类型级别注释@Component,包括@Configuration类、作为元注释,目的是组成自定义构造型注释

  6. 浅析SpringBoot2底层注解@Conditional@ImportResource

    这篇文章主要为大家介绍了SpringBoot2底层注解@Conditional@ImportResource的分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  7. SpringBoot2底层注解@Import用法详解

    这篇文章主要为大家介绍了SpringBoot2底层注解@Import用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. springboot2+es7使用RestHighLevelClient的示例代码

    本文主要介绍了springboot2+es7使用RestHighLevelClient的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. SpringBoot2之PUT请求接收不了参数的解决方案

    这篇文章主要介绍了SpringBoot2之PUT请求接收不了参数的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  10. SpringBoot2学习之springboot与spring区别分析

    这篇文章主要为大家介绍了SpringBoot2学习之springboot与spring区别分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部