SpringBoot属性注入的各种姿势(含2.2.0版本最新方式)

常见的spring boot属性注入相关注解

常见的SpringBoot属性注入使用的注解类含以下几种:

  • @Value:常用于字段上,将Spring加载到的属性匹配注入到当前实例字段,可通过冒号:设置属性默认值。
  • @Configuration:作用于类上,声明一个类作为配置类并生成单例到Spring容器中。
  • @PropertySource:作用于类上,读取指定资源文件属性,常与@Configuration@ConfigurationProperties一起使用,可通过application.yml的引入配置取代该注解的使用。
  • @ConfigurationProperties:作用于类或方法上,将加载到的属性进行前缀匹配,再根据属性名与注解类中的字段名匹配进行属性注入,可与@PropertySource@Configuration一起使用,在配置文件中可通过冒号:设置属性默认值。2.2.0版本后大部分情况下无需再与@Configuration组合使用

2.2.0版本后新增的属性注入相关注解:

  • @DefaultValue:作用域参数上,设置不可变属性时的默认值的注释。
  • @ConstructorBinding:作用于类或构造方法上,通过通过函数而非set方法进行属性注入,常与@ConfigurationProperties一起使用,适用于设置不可变属性,建议不可变属性通过构造方法设置而非set方法。
  • @ConfigurationPropertiesScan:生成指定package下@ConfigurationProperties注解的属性配置类单例并进行属性注入放入容器管理。

在2.2.0版本之后的@SpringBootApplication注解添加了@ConfigurationPropertiesScan的功能,即应用启动时会扫描@SpringBootApplication注解的启动类所在package及所有子孙package下被@ConfigurationProperties注解的类并生成相应对象到容器中,因此2.2.0以后的版本@ConfigurationProperties大部分情况下都可单独使用,不需再与@Configuration组合生成实例。以下为2.2.0之后的SpringBootApplication:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@ConfigurationPropertiesScan
public @interface SpringBootApplication {
	...
}

各注解属性注入用例

  • @Value用例

    @Value("${server.port:8080}") //没有设置则默认设为8080
    private String port;
    
  • @PropertySource用例

    classpath添加datasource.properties:

    datasource.url=test-url
    datasource.username=wilson
    datasource.password=test-password
    datasource.driver=${db.driver:com.mysql.jdbc.Driver}
    

    属性配置类DataSourceProperties :

    @PropertySource("classpath:datasource.properties")
    @ConfigurationProperties("datasource")
    @Configuration
    @Data
    @Slf4j
    public class DataSourceProperties {
        private String url;
        private String username;
        private String password;
        private String driver;
    
        @PostConstruct
        public void init() {
            log.info(toString());
            log.info("DataSourceProperties initialized");
        }
    }
    
  • @ConfigurationProperties用例

    application.yml添加db配置:

    datasource:
      url: test-url
      username: wilson
      password: test-password
      driver: ${db.driver:com.mysql.jdbc.Driver}
    

    也可在resources下新建一个application-datasource.yml进行属性配置,再通过application.yml中添加spring.profiles.include: datasource进行文件的属性引入。

    属性配置类DataSourceProperties :

    @ConfigurationProperties("datasource")
    @Configuration
    @Data
    @Slf4j
    public class DataSourceProperties {
        private String url;
        private String username;
        private String password;
        private String driver;
    
        @PostConstruct
        public void init() {
            log.info(toString());
            log.info("DataSourceProperties initialized");
        }
    }
    
  • @ConstructorBinding与@DefaultValue用例

    用例1:

    @ConfigurationProperties("datasource")
    @Slf4j
    @ConstructorBinding
    @AllArgsConstructor
    @Getter
    @ToString
    public class DataSourceProperties {
        private String url;
        private String username;
        private String password;
        private String driver;
    
        @PostConstruct
        public void init() {
            log.info(toString());
            log.info("DataSourceProperties initialized");
        }
    }
    

    用例2:

    @ConfigurationProperties("datasource")
    @Slf4j
    @ConstructorBinding
    @Getter
    @ToString
    public class DataSourceProperties {
        private String url;
        private String username;
        private String password;
        private String driver;
    
        public DataSourceProperties(String url, String username, String password, @DefaultValue("com.mysql.jdbc.Driver") String driver) {
            this.url = url;
            this.username = username;
            this.password = password;
            this.driver = driver;
        }
    
        @PostConstruct
        public void init() {
            log.info(toString());
            log.info("DataSourceProperties initialized");
        }
    }
    

    @DefaultValue注解的参数若没有在配置文件中设置值或默认值,则初始化时使用注解中的值,即注入优先级为:文件属性值>文件属性默认值>@Default注解值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章