@ConfigurationProperties是springboot提供读取配置文件的一个注解。
@ConfigurationProperties注解支持属性文件和javabean的映射,而@Value支持spel表达式。
如果是多个属性映射,而且常常被复用,推荐使用@ConfigurationProperties,如果只读取单个属性则使用@Value要方便许多
特殊的后缀名是“driver-class-name”这种带横杠的情况, 下划线转驼峰 就可以绑定成功,所以就是 “driverClassName”
需要注意的是,如果我们没有指定属性文件的地址,SpringBoot 默认读取 application.properties/application.yml 中的属性文件名。
@EnableConfigurationProperties注解的作用是:让使用 @ConfigurationProperties 注解的类注入。与@component一样。
注意:如果@ConfigurationProperties是在第三方包中,那么@component是不能注入到容器的。只有@EnableConfigurationProperties才可以注入到容器。
如何获取我们使用了 @ConfigurationProperties 注解的类呢?
1 @Autowired 注入
@Autowired private JdbcProperties prop;2 构造函数注入
private JdbcProperties prop; public JdbcConfig(Jdbcproperties prop){ this.prop = prop; }3 声明有@Bean的方法参数注入
@Bean public TestBean dataSource(JdbcProperties jdbcProperties) { syso(jdbcProperties.getUsername());// syso 简写 return new TestBean; }
@Conditional:满足条件给容器注册bean。
从代码中可以看到,需要传入一个Class数组,并且需要继承Condition接口。Condition是个接口,需要实现matches方法,返回true则注入bean,false则不注入。
例如:@Conditional({WindowsCondition.class}),@Conditional({LinuxCondition.class})
@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)
@ConditionalOnProperty
组合 @Conditional 注解,当指定的属性有指定的值时才开启配置。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效。
@AutoConfigureAfter
用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。
如 Mybatis 的自动配置类,需要在数据源自动配置类之后。
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@AutoConfigureBefore
这个和@AutoConfigureAfter注解使用相反,表示该自动配置类需要在另外指定的自动配置类配置之前。
@Qualifier
注解与我们想要使用的特定 Spring bean 的名称一起进行装配,Spring 框架就能从多个相同类型并满足装配要求的 bean 中找到我们想要的
@Autowired
@Qualifier("fooFormatter")
private Formatter formatter;
@Primary
当存在多个相同类型的 bean 时,此注解定义了首选项。除非另有说明,否则将使用与 @Primary
注释关联的 bean 。
@Bean
@Primary
public Employee johnEmployee() { return new Employee("john"); }