SpringBoot的核心注解
前言
springboot的核心就是注解。springboot通过各种组合注解,极大地简化了spring项目的搭建和开发。
在springboot中有一些注解是其中的关键,必须掌握。
@Configuration
@Configuration并不是一个新的注解,在Spring3.0时已经存在了。@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被
AnnotationConfigApplicationContext或
AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
注意:@Configuration注解的配置类有如下要求:
- @Configuration不可以是final类型;
- @Configuration不可以是匿名类;
- 嵌套的configuration必须是静态类。
@Configuration用法:
- 用@Configuration加载spring
- @Configuration配置spring并启动spring容器
- @Configuration启动容器+@Bean注册Bean
- @Configuration启动容器+@Component注册Bean
- 使用 AnnotationConfigApplicationContext 注册 AppContext 类的两种方法
- 配置Web应用程序(web.xml中配置AnnotationConfigApplicationContext)
2.组合多个配置类
- 在@configuration中引入spring的xml配置文件
- 在@configuration中引入其它注解配置
- @configuration嵌套(嵌套的Configuration必须是静态类)
3.@EnableXXX注解
4.@Profile逻辑组配置
5.使用外部变量
@Conditional
@Conditional是spring4就提供出来的基于条件的注解。该注解可以根据是否满足某一个特定条件来决定是否创建某个特定的Bean。
比如可以通过@Conditional注解来实现只有当某个Bean被已创建时(存在时)才会创建另外一个Bean,这样就可以依据这一特定的条件来控制Bean的创建行为,这样的话我们就可以利用这样一个特性来实现一些自动的配置。
@Conditional是springboot实现自动配置的关键基础能力。在此基础上,springboot又创建了多个适用于不同场景的组合条件注解。
- @ConditionalOnBean:当上下文中有指定Bean的条件下进行实例化。
- @ConditionalOnMissingBean:当上下文没有指定Bean的条件下进行实例化。
- @ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化。
- @ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化。
- @ConditionalOnWebApplication:当项目本身是一个Web项目时进行实例化。
- @ConditionalOnNotWebApplication:当项目本身不是一个Web项目时进行实例化。
- @ConditionalOnProperty:当指定的属性有指定的值时进行实例化。
- @ConditionalOnExpression:基于SpEL表达式的条件判断。
- @ConditionalOnJava:当JVM版本为指定的版本范围时进行实例化。
- @ConditionalOnResource:当类路径下有指定的资源时进行实例化。
- @ConditionalOnJndi:在JNDI存在时触发实例化。
- @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。
具体用法还要具体查看文档或源码
@SpringBootApplication
这是SpringBoot最核心的注解。当然也是个组合注解。
@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) }) public @interface SpringBootApplication {
我们比较熟悉的是@ComponentScan注解,设置包扫描范围。
除此之外,最核心的是@EnableAutoConfiguration注解。开启自动配置。
具体的实现,通过查看源码可知,是通过导入
AutoConfigurationImportSelector类。
@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector最终是要加载所在jar下的META-INF/spring.factories文件。
该文件则声明了有哪些自动配置需要被Spring容器加载,
配置的是注解和它对应的类。
从而Spring Boot应用程序就能自动加载Spring核心容器配置,以及其他依赖的项目组件配置,从而最终完成应用的自动初始化,通过这种方法就向开发者屏蔽了启动加载的过程。