SpringBoot相关注解
SpringBoot摒弃XML配置方式,改为全注解启动。
1. SpringBoot基本注解
1.1 @Configuration
替代以前Spring相关的XMl配置文件, @Configuration
所在的类称为配置类,它本身也是Spring容器中的Bean。
@Configuration
public class UserConfiguration {
@Bean
public User user01(){
var user = new User();
return user;
}
}
1.2 @Bean
替代以前XML配置文件中的<bean>
标签,需要放在加有@Configuration
注解的配置类中, 配置的bean默认在Spring容器中名字就是方法名。也可以指定Bean的名字,比如下面:
@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生命周期。
@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。
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环境下才激活的配置
@Configuration
@ConditionalOnJava(JavaVersion.EIGHT)
public class Java8Config {
// 配置类定义
}
@Profile
相当于只有在指定该环境的情况下,里面的配置才有机会生效。比如指定环境为为dev,则加上参数-Dspring.profiles.active=dev
即可。
3. 属性绑定
3.1 @ConfigurationProperties
声明组件的属性和配置文件哪些前缀开始项进行绑定 例如: 在application.properties文件中添加以下属性
person.name=jack
person.age=33
person.address=中国
@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默认只会扫描所在的目录及其下面的子包。
person.name=jack
person.age=33
person.address=中国
@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);
}
}