zoukankan      html  css  js  c++  java
  • Spring Boot Annotations 注解

    1.概述

    Spring Boot通过其自动配置功能使Spring更容易配置。

    在本教程中,我们将探讨org.springframework.boot.autoconfigureorg.springframework.boot.autoconfigure.condition包中的注释

    2. @SpringBootApplication

    我们使用此批注来标记Spring Boot应用程序的主类

     

    @SpringBootApplication封装@Configuration@EnableAutoConfiguration@ComponentScan注解与他们的默认属性。

    springboot程序默认会扫描主类所在包及其子包,所以一般主类放在最外层

    1 @SpringBootApplication
    2 class VehicleFactoryApplication {
    3  
    4     public static void main(String[] args) {
    5         SpringApplication.run(VehicleFactoryApplication.class, args);
    6     }
    7 }

    3. @EnableAutoConfiguration

    @EnableAutoConfiguration,正如其名称所示,支持自动配置。这意味着Spring Boot在其类路径中查找自动配置bean并自动应用它们。(如根据配置文件,classpath下jar包动态决定要自动注入哪些bean)

    注意,我们必须在@Configuration中使用此注释

    1 @Configuration
    2 @EnableAutoConfiguration
    3 class VehicleFactoryConfig {}
     

    4.自动配置条件

    通常,当我们编写自定义自动配置时,我们希望Spring 有条件使用它们我们可以通过本节中的注释来实现这一点。

    我们可以在本节中将注释放在@Configuration类或@Bean方法上。

    在接下来的部分中,我们将仅介绍每种情况背后的基本概念。

    4.1.@ConditionalOnClass@ConditionalOnMissingClass

    如果注释参数中的类在classpath中存在/不存在,Spring依据此结果决定是否启动这个configuration(即是否实例化这个bean)

    1 @Configuration
    2 @ConditionalOnClass(DataSource.class)
    3 class MySQLAutoconfiguration {
    4     //...
    5 }

    4.2.@ConditionalOnBean@ConditionalOnMissingBean

    当我们想要根据特定bean存在与否来定义条件时,我们可以使用这些注释:(如下例,只有依赖的bean存在时,自身的bean才会被实例化)

    1 @Bean
    2 @ConditionalOnBean(name = "dataSource")
    3 LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    4     // ...
    5 }

    4.3.@ConditionalOnProperty

    使用此注释,我们可以为属性值创建条件:(判断是否存在一个属性usemysql,且其值为local)

    1 @Bean
    2 @ConditionalOnProperty(
    3     name = "usemysql", 
    4     havingValue = "local"
    5 )
    6 DataSource dataSource() {
    7     // ...
    8 }

    4.4.@ConditionalOnResource

    我们可以让Spring仅在存在特定资源时使用定义:(只有mysql.properties文件存在时才满足条件)

    1 @ConditionalOnResource(resources = "classpath:mysql.properties")
    2 Properties additionalProperties() {
    3     // ...
    4 }

    4.5.@ConditionalOnWebApplication@ConditionalOnNotWebApplication

    通过这些注释,我们可以根据当前应用程序是否是Web应用程序创建条件:(应用程序是否是web程序有springboot自己判断,其是根据servlet相关类判断的)

    1 @ConditionalOnWebApplication
    2 HealthCheckController healthCheckController() {
    3     // ...
    4 }

    4.6.@ConditionalExpression

    我们可以在更复杂的情况下使用此注释。SpEL表达式求值为true时,Spring将使用标记的定义

    spel表达式语法 ${} ,  这里的条件就是环境变量(配置信息)中usemysql=true,mysqlserver == local

    1 @Bean
    2 @ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}")
    3 DataSource dataSource() {
    4     // ...
    5 }

    4.7.@Conditional

    对于更复杂的条件,我们可以创建一个评估自定义条件的类我们告诉Spring使用@Conditional这个自定义条件:

    HibernateCondition.java类是需要自己创建的,需要实现接口Condition,重写方法matches,返回true or false。 返回true则条件成立)

    1 @Conditional(HibernateCondition.class)
    2 Properties additionalProperties() {
    3     //...
    4 }

    5.结论

    在本文中,我们概述了如何微调自动配置过程并为自定义自动配置bean提供条件。

  • 相关阅读:
    【渗透攻防】深入了解Windows
    浅析B/S架构数据库连接方式
    剖析泄露你银行卡密码的钓鱼网站:真假“10086”
    红黑树的删除和加入节点
    Unity里包裹Debug,且不影响Debug的重定向
    Java向上转型和向下转型(附具体样例)
    Javascript 方法apply和call的差别
    普通androidproject转换为C/C++project之后,再还原成androidproject的解决方式
    初识双网卡
    js面向对象编程: js类定义函数时prototype和this差别?
  • 原文地址:https://www.cnblogs.com/gc65/p/10611890.html
Copyright © 2011-2022 走看看