Skip to content

SpringBoot相关注解

SpringBoot摒弃XML配置方式,改为全注解启动。

1. SpringBoot基本注解

1.1 @Configuration

替代以前Spring相关的XMl配置文件, @Configuration所在的类称为配置类,它本身也是Spring容器中的Bean。

java
@Configuration
public class UserConfiguration {

    @Bean
    public User user01(){
        var user = new User();
        return user;
    }
}

1.2 @Bean

替代以前XML配置文件中的<bean>标签,需要放在加有@Configuration注解的配置类中, 配置的bean默认在Spring容器中名字就是方法名。也可以指定Bean的名字,比如下面:

java
@Configuration
public class UserConfiguration {

    @Bean("myuser")
    public User user01(){
        var user = new User();
        return user;
    }
}

1.3 @Scope

用来配置Spring容器中的Bean是单例("singleton")还是多实例("prototype")的,用来替代XML配置文件中<bean>节点的scope属性. 特殊地,Scope还有"session", "request",这两个属性应用在web项目中, 用来标识Bean生命周期。

java
@Configuration
public class UserConfiguration {

    @Bean("myuser")
    @Scope("prototype")
    public User user01(){
        var user = new User();
        return user;
    }
}

1.4 @SpringBootConfiguration

@SpringBootConfiguration@Configuration作用等效,名称不同而已,这样设计目的是为了规范性,@Configuration用来标识普通的配置类,而@SpringBootConfiguration用来标识和SpringBoot相关的配置类。

1.5 @Import

该注解在类上面配置,注解中需要传入全类名。用于导入第三方的配置类,从而给容器放入指定类型的Bean。 Alt text

2. 条件注解

如果注解指定的条件成立,则触发指定行为。

2.1 类条件

基于类是否在类路径中存在来决定是否应用配置。有以下这些:

  • @ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
  • @ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为

2.2 Bean 条件

根据特定的 bean 是否存在来决定是否应用配置。有以下这些:

  • @ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为,若指定name属性,则触发要求还需要名字是指定的值
  • @ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为
  • @ConditionalOnMissingFilterBean (org.springframework.boot.autoconfigure.web.servlet)
  • @ConditionalOnSingleCandidate 它是@ConditionalOnBean的增强版,它不仅要求被检查的Bean必须存在,而且只能有一个

2.3 属性条件

条件基于应用程序配置文件中的属性值来决定是否应用配置。有以下这些:

  • @ConditionalOnProperty (org.springframework.boot.autoconfigure.condition)

2.4 资源条件

基于特定的资源(如文件或类路径资源)是否存在来决定是否应用配置。有以下这些:

  • @ConditionalOnResource 要求指定的资源必须存在,其修饰的配置类或方法才会生效。使用该注解时只需指定resources属性,该属性指定必须存在的资源。
  • @ConditionalOnEnabledResourceChain 用于条件性地配置资源链(Resource Chain),以提高 Web 应用程序中静态资源(如JavaScript、CSS文件)的服务效率,只有当application.properties或application.yml中的配置项spring.resources.chain.enabled被设置为true时,才会触发。
  • @ConditionalOnJndi 要求指定JNDI必须存在,使用该注解时通过value属性指定要检查的JNDI
  • @ConditionalOnGraphQlSchema 当应用程序中存在GraphQL schema时,会被触发

2.5 Web 应用程序条件

  • @ConditionalOnWebApplication 基于应用是否是一个 web应用来触发生效
  • @ConditionalOnNotWebApplication 基于应用是否是一个不是web应用来触发生效
  • @ConditionalOnDefaultWebSecurity当Spring Security引入的时候被触发
  • @ConditionalOnWarDeployment 要求当前应用以传统WAR包方式被部署到Web服务器或应用服务器中时(不以独立Java程序的方式运行),该注解修饰的配置类或方法才会生效。

2.6 SpEL 表达式条件

基于Spring的表达式语言(SpEL)表达式的计算结果来决定是否应用配置。有以下这些:

  • @ConditionalOnExpression 要求指定SpEL表达式的值为true时,其所修饰的配置类或方法才会生效

2.7 其他注解条件

  • @ConditionalOnRepositoryType 要求特定的Spring Data Repository被启用时,其修饰的配置类或方法才会生效。
  • @ConditionalOnCloudPlatform 要求应用被部署在特定云平台上,这样其修饰的配置类或方法才会生效。该注解可通过value属性指定它所要求的云平台,该value属性支持多个枚举值,详见CloudPlatform枚举类。
  • @ConditionalOnInitializedRestarter 如果Restarter对象已经实例化,并且存在可被监控的类目录(除jar文件之外的目录),触发配置生效
  • @ConditionalOnJava 只在特定版本的Java环境下才激活的配置
java
@Configuration
@ConditionalOnJava(JavaVersion.EIGHT)
public class Java8Config {
    // 配置类定义
}
  • @Profile 相当于只有在指定该环境的情况下,里面的配置才有机会生效。比如指定环境为为dev,则加上参数-Dspring.profiles.active=dev即可。

3. 属性绑定

3.1 @ConfigurationProperties

声明组件的属性和配置文件哪些前缀开始项进行绑定 例如: 在application.properties文件中添加以下属性

ini
person.name=jack
person.age=33
person.address=中国
java
@ConfigurationProperties(prefix = "person")
@Component
public class User {

    private String name;

    private String age;

    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

@ConfigurationProperties一般和@Component配合使用,如果不使用@Component, 那需要和@Bean使用。

3.2 @EnableConfigurationProperties

快速注册注解, 可以用于第三方已经写好的jar包(@ConfigurationProperties@Component)的场景, 用于SpringBoot默认只会扫描所在的目录及其下面的子包。

ini
person.name=jack
person.age=33
person.address=中国
java
@SpringBootApplication
@EnableConfigurationProperties(User.class)
public class DemoApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext ioc = SpringApplication.run(DemoApplication.class, args);
		Object bean = ioc.getBean(User.class);
		System.out.println(bean);
	}
}