前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot注解

Spring Boot注解

作者头像
程序那些事
发布2020-07-07 16:18:52
4970
发布2020-07-07 16:18:52
举报
文章被收录于专栏:程序那些事

简介

Spring Boot通过自动配置让我们更加简单的使用Spring。在本文中我们将会介绍org.springframework.boot.autoconfigure 和org.springframework.boot.autoconfigure.condition 里面经常会用到的一些注解。

@SpringBootApplication

首先我们看一下@SpringBootApplication:

代码语言:javascript
复制
@SpringBootApplication
public class AnotationApp {
    public static void main(String[] args) {
        SpringApplication.run(AnotationApp.class, args);
    }
}

@SpringBootApplication被用在Spring Boot应用程序的Main class中,表示整个应用程序是Spring Boot。

@SpringBootApplication实际上是@Configuration, @EnableAutoConfiguration 和 @ComponentScan 的集合。

@EnableAutoConfiguration

@EnableAutoConfiguration 意味着开启了自动配置。这意味着Spring Boot会去在classpath中查找自动配置的beans,并且自动应用他们。

注意, @EnableAutoConfiguration需要和@Configuration配合使用。

代码语言:javascript
复制
 @Configuration
@EnableAutoConfiguration
public class VehicleFactoryConfig {
}

条件自动配置

有时候,我们在自定义自动配置的时候,希望根据某些条件来开启自动配置,Spring Boot 提供了一些有用的注解。

这些注解可以和@Configuration 类 或者 @Bean 方法一起使用。

@ConditionalOnClass 和 @ConditionalOnMissingClass

这两个注解的意思是,如果注解参数中的类存在或者不存在则Spring会去实例化自动配置的bean。

代码语言:javascript
复制
 @Configuration
@ConditionalOnClass(DataSource.class)
public class MySQLAutoconfiguration {
}

@ConditionalOnBean 和 @ConditionalOnMissingBean

这两个和上面的区别在于,这两个是判断是否有实例化的bean存在。

代码语言:javascript
复制
 @Bean
@ConditionalOnBean(name = "dataSource")
LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    // ...
}

@ConditionalOnProperty

使用这个注解我们可以判断Property的某些属性是不是需要的值:

代码语言:javascript
复制
@Bean
@ConditionalOnProperty(
    name = "usemysql", 
    havingValue = "local"
)
DataSource dataSource() {
    // ...
}

@ConditionalOnResource

只有当某些resource存在的时候,才会起作用。

代码语言:javascript
复制
@ConditionalOnResource(resources = "classpath:mysql.properties")
Properties additionalProperties() {
    // ...
}

@ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication

这两个注解通过判断是否web应用程序。

代码语言:javascript
复制
    @Bean
    @ConditionalOnWebApplication
    HealthCheckController healthCheckController() {
        // ...
        return null;
    }

@ConditionalExpression

这个注解可以使用SpEL构造更加复杂的表达式:

代码语言:javascript
复制
@Bean
@ConditionalOnExpression("${usemysql} && ${mysqlserver == 'local'}")
DataSource dataSource() {
    // ...
}

@Conditional

还有一种更加复杂的应用叫@Conditional,它的参数是一个自定义的condition类。

代码语言:javascript
复制
    @Bean
    @Conditional(HibernateCondition.class)
    Properties newAdditionalProperties() {
        //...
        return null;
    }
代码语言:javascript
复制
public class HibernateCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        return false;
    }
}

这个类需要实现matches方法。

本文的例子可以参考:https://github.com/ddean2009/learn-springboot2/tree/master/spring-boot-annotations

更多教程请参考 flydean的博客

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • @SpringBootApplication
  • @EnableAutoConfiguration
  • 条件自动配置
  • @ConditionalOnClass 和 @ConditionalOnMissingClass
  • @ConditionalOnProperty
  • @ConditionalOnResource
  • @ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication
  • @ConditionalExpression
  • @Conditional
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档