springboot- 注解汇总,Java 自学宝典下载
[](
)@Configuration
@Configuration,将类作为配置,最主要的就是可以在类中使用 @Bean 注解,标注在方法上,可以将方法的返回值对象放入的容器中,对象的名称是方法名称。
[](
)@Component
此注解主要作用是将标注的类放入的容器,@controller,@service 本质一样。
[](
)@ComponentScans
见名知意,就是扫描 @Component 注解的,给定包名,可以将包内的使用 @Component 注解标注的类放入到容器中。注意,这个注解不能单独使用,需要搭配 @Configuration 注解。
[](
)@PropertySource
这个注解的作用是加载一个属性文件,通常用法是加载属性文件,将属性文件值赋值给 bean 的属性。
使用方法可以参考[使用方法](
),注意,这个注解不能单独使用,需要搭配 @Configuration 注解。
[](
)@ConfigurationProperties
这个注解通常是用来获取主配置文件的(application.yml 或者 application.properties)中的属性值,将其赋值给 bean 属性。
[](
)使用方法
以 DataSourceProperties 为例
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
private ClassLoader classLoader;
private String name;
private boolean generateUniqueName;
private Class<? extends DataSource> type;
private String driverClassName;
private String url;
private String username;
private String password;
private String jndiName;
。。。
}
配置文件中的属性:
spring:
datasource:
driver-class-name:
url:
password:
username:
前缀+属性名称,如果可以对应上配置文件中的 key,就把 key 对应的 value,赋值给 bean 的属性。这个注解可以单独使用,但你想把这个类放入到容器中,就要搭配 @Configuration。注意;这个的搭配和前面两个注解的搭配不一样。@PropertySource,@ComponentScans,如果不和 @Configuration 注解一起使用,那么其功能就不能实现。而 @ConfigurationProperties 注解,搭配 @Configuration 的目的仅仅是将其放入到容器中。如果单独使用功能是可以实现的。 为了方便,springboot 还提供了一个注解,EnableConfigurationProperties,这个注解可以将配置的属性 bean 放入的容器中。
[](
)@EnableConfigurationProperties
这个注解可以把属性 bean 放入到容器中,将处理 ConfigurationProperties 注解的逻辑类放入到容器中。
[](
)使用方法
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcTemplateAutoConfiguration {
[](
)原理
直接看 EnableConfigurationPropertiesImportSelector
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EnableConfigurationPropertiesImportSelector.class)
public @interface EnableConfigurationProperties {
org.springframework.boot.context.properties.EnableConfigurationPropertiesImportSelector
实现了 ImportSelector 接口,直接看 selectImports 方法
private static final String[] IMPORTS = {
ConfigurationPropertiesBeanRegistrar.class.getName(),
ConfigurationPropertiesBindingPostProcessorRegistrar.class.getName() };
@Override
public String[] selectImports(AnnotationMetadata metadata) {
return IMPORTS;
}
返回了两个类 ConfigurationPropertiesBeanRegistrar 是将配置的属性 bean 放入到容器。ConfigurationPropertiesBindingPostProcessorRegistrar 是处理 ConfigurationProperties 注解的,绑定逻辑。这两个类的逻辑自己看就可以了,了解大概流程。
[](
)@NestedConfigurationProperty
这个注解还是和属性相关,是嵌套类型的。使用方法[使用方法](
),解析的逻辑应该还是在 ConfigurationPropertiesBindingPostProcessorRegistrar 类中。
[](
)@ImportResource
这个类是加载配置文件的,没有 springboot 之前,使用 spring 的时候要有 spring.xml 的文件,在里面陪各种信息。这个注解就是加载 xml 配置文件的。
下面重点分析条件注解
[](
)AutoConfigureBefore、AutoConfigureAfter、AutoConfigureOrder
在自动配置的时候,会找到这三个注解,注意,这三个注解是 springboot 自动配置专用的注解,我们开发的时候是用不上的。主要功能就是区分解析的的顺序,
org.springframework.context.annotation.ConfigurationClassParser.DeferredImportSelectorGroupingHandler#processGroupImports
public void processGroupImports() {
for (DeferredImportSelectorGrouping grouping : this.groupings.values()) {
Predicate<String> exclusionFilter = grouping.getCandidateFilter();
// 得到所有的配置类,之后遍历
grouping.getImports().forEach(entry -> {
ConfigurationClass configurationClass = this.configurationClasses.get(entry.getMetadata());
try {
// 分别调用 processImports,走导入类的逻辑。
processImports(configurationClass, asSourceClass(configurationClass, exclusionFilter),
Collections.singleton(asSourceClass(entry.getImportClassName(), exclusionFilter)),
exclusionFilter, false);
}
catch (BeanDefinitionStoreException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanDefinitionStoreException(
"Failed to process import candidates for configuration class [" +
configurationClass.getMetadata().getClassName() + "]", ex);
}
});
评论