springboot 自动注解
上一节我们讲过springboot的@Enable*实现 了解了springboot的实现原理,本小节聊一下autoconfig自动注解。
在spring.factories 中EnableAutoConfiguration配置项配置了
很多XXXXautoconfiguration,这些配置项都是在某些条件或者类存在的情况下才会自动生成对应Bean。下面讲解一下这些配置项的含义。
- springboot 中提供的注解
@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效
@EnableConfigurationProperties自动映射一个POJO到Spring Boot配置文件(默认是application.properties文件)的属性集。
@ConfigurationProperties Springboot配置文件中键值对配置项,例如前缀,默认值等一些属性。
@PropertySource("classpath:xxx.properties") 指定配置文件读取。
@AutoConfigureAfter:在指定的配置类初始化后再加载
@AutoConfigureBefore:在指定的配置类初始化前加载
@AutoConfigureOrder:数越小越先初始化
举个栗子
在HelloProperties属性类和Hello存在的情况下,才去加载对应配置类。
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(Hello.class)
@ConditionalOnProperty(prefix = "hello", value = "enabled", matchIfMissing = true)
public class HelloAutoConfiguration {
@Autowired
private HelloProperties helloProperties;
@Bean
//Hello这个Bean不存在情况下,才生成这个Bean
@ConditionalOnMissingBean(Hello.class)
public Hello hello() {
Hello hello = new Hello();
hello.setMsg(helloProperties.getMsg());
return hello;
}
}
HelloProperties配置类,读取对应配置
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
private static final String MSG = "world";
private String msg = MSG;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
Hello类,
public class Hello {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String sayHello() {
return "hello " + msg;
}
}
上述的配置都是为了读取配置文件中的值赋值到Hello msg属性上,生成Hello 这个Bean
使用
@RestController
@SpringBootApplication
@EnableLogInfo(name = "onlySale")
public class SpringbootHelloApplication {
//自动注入,使用Hello 这个Bean
@Autowired
private Hello hello;
@RequestMapping("/hello")
public String hello() {
return hello.sayHello();
}
public static void main(String[] args) {
SpringApplication.run(SpringbootHelloApplication.class, args);
}
}