更新时间:2021-07-30 20:48:48
@Target(ElementType.Type)
ElementType取值的类型:
RetentionPolicy的取值类型有三种:
作用: 指明修饰的注解,可以被例如javadoc此类的工具文档化
@Inherited需要和@AliasFor一起使用: 在子注解对应的属性使用@AliasFor
@ComponentScan中的参数类型:
excludeFilters: 按照过滤条件进行排除
includeFilters: 按照过滤条件进行包含
@Filter中的参数类型:
@interface用来声明一个注解:
public @interface 注解名 {定义体}
注解参数支持的数据类型:
Annotation类型中参数设定规则:
注解元素的默认值:
这个约束使得处理器很难表现一个元素的存在或缺失的状态:
在同一个注解内,对两个不同的属性一起使用,互为别名:
public @interface RequestMapping {
@AliasFor("path") // 此时path和value值必须是一样的,否则会报错
String[] value() default {};
@AliasFor("value") // 此时path和value值必须是一样的,否则会报错
String[] path() default {};
}
显式的覆盖元注解中的属性:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AopConfig.class)
public class AopUtilsTest {}
要想替换 @ContextConfiguration(classes = AopConfig.class) 注解,可以这样定义一个标签:
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration
public @interface Context {
@AliasFor(value = "classes", annotation = ContextConfiguration.class)
Class<?>[] cs() default {};
}
cs属性等同于 @ContextConfiguration属性中的classes属性.使用了 @AliasFor标签,分别设置:
使用Context标签的可以达到同样效果:
@RunWith(SpringJUnit4ClassRunner.class)
@STC(cs = AopConfig.class)
public class AopUtilsTest {}
@ContextConfiguration
public @interface MyTestConfig {
@AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
String[] value() default {};
@AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
String[] groovyScripts() default {};
@AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
String[] xmlFiles() default {};
}
这就是在统一注解中隐式声明别名:
别名的传递:
@AliasFor注解是允许别名之间的传递的:
@MyTestConfig
public @interface GroovyOrXmlTestConfig {
@AliasFor(annotation = MyTestConfig.class, attribute = "groovyScripts")
String[] groovy() default {};
@AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
String[] xml() default {};
}
@Alias中的属性:
@Import使用场景:
包含:
@ConfigurationProperties的使用: 要为每个捕获的外部属性提供一个带有字段的类
根据SpringBoot宽松的绑定规则,类属性的名称必须与外部属性名称匹配
激活@ConfigurationProperties:
@Component
@ConfigurationProperties(prefix = "spring.logger")
class LogProperties {
...
}
@Configuration
class PropertiesConfig {
@Bean
public LogModuleProperties logModuleProperties() {
return new logModuleProperties();
}
}
@Configuration
@EnableConfigurationProperties(LogModuleProperties.class)
class PropertiesConfig {
}
激活一个 @ConfigurationProperties类时***模块化应用程序,并让每个模块提供自己的 @ConfigurationProperties类,只提供模块需要的属性.这样可以使得在不影响其他模块的情况下重构一个模块中的属性变得更加方便.因此不建议在程序类本身上使用 @EnableConfigurationProperties, 应该在特定模块的 @Configuration类上使用 @EnableConfigurationProperties, 该类也可以利用包私有的可见性对特定应用程序其余部分隐藏属性
@ConfigurationProerties中无法转换的属性:
@ConfigurationProperties(prefix = "spring.logger", ignoreInvalidFields = true)
public class LogModuleProperties {
private Boolean enabled = Boolean.True;
}
SpringBoot将会设置enable字段为设定好的默认值. 如果没有设定默认值 ,enabled的值将为null, 因为这里定义的是boolean的包装类Boolean
@ConfigurationProperties中未知的属性:
@ConfigurationProperties(prefix = "spring.logger", ignoreUnknownFields = false)
class LogModuleProperties {
private Boolean enabled = Boolean.TRUE;
private String defaultSubject;
}
对于ignoreUnkownFields, 在SpringBoot中可能有两个带有@ConfigurationProperties的类,同时绑定到了同一个命名空间 (namespace) 上,其中一个类可能知道某个属性,另一个类却不知道某个属性,这样会导致启动失败.所以这个属性不再使用
启动时校验@ConfigurationProperties:
@ConfigurationProperties(prefix = "spring.logger")
@Validated
@Data
class LogModuleProperties {
@NotNull private Boolean enabled;
@NotEmty private String defaultSubject;
}
如果这些默认的验证注解不能满足验证要求的,可以自定义注解. 如果验证逻辑很特殊,可以实现一个方法,并用 @PostConstruct标记,如果验证失败,方法抛出异常即可
复杂属性类型:
List和Set:
有两种方式让SpringBoot自动填充List属性:
spring.logger.smtpServers[0]=server1
spring.logger.smtpServers[1]=server1
spring:
mail:
smtpServers:
- server1
- server2
Duration:
@Data
@ConfigurationProperties(prefix = "spring.logger")
class loggerModuleProperties {
private Duration pauseBetweenLogs;
}
spring.logger.pause-between-logs=5s
@Data
@ConfigurationProperties(prefix = "spring.logger")
class loggerModuleProperties {
@DurationUnit(ChronoUnit.SECONDS)
private Duration pauseBetweenLogs;
}
常用单位如下:
DataSize:
@Data
@ConfigurationProperties(prefix = "spring.logger")
class loggerMailModuleProperties {
@DataSizeUnit(DataUnit.MEGABYTES)
private DataSize maxAttachmentSize = DataSize.ofMegebytes(2);
}
spring.logger.max-attachment-size=1MB
输出的结果都是以B(bytes) 为单位显示的
常见单位如下:
自定义类型:
spring.logger.max-attachment-weight=5kg
@Data
@ConfigurationProperties(prefix = "spring.logger")
class MailModuleProperties {
private Weight maxAttachmentWeight;
}
class WeightConverter implements Convert<String, Object> {
@Override
public Weight convert(String source) {
// 根据String类型的source创建并返回一个Weight类型的对象
}
}
@Configuration
class PropertiesConfig {
@Bean
@ConfigurationPropertiesBinding
public WeightConverter weightConverter() {
return new WeightConverter();
}
}
@ConfigurationPropertiesBinding注解是让SpringBoot使用该转换器做数据绑定
@DeprecatedConfigurationProperty(reason = "change name", replacement = "none")
public String getDefaultSubject() {
return defaultSubject;
}
可以通过添加 @DeprecatedConfigurationProperty注解到字段的getter方法上,来标示该字段为deprecated
包含:
用于定义 @ExceptionHandler, @InitBinder, @ModelAttribute, 并且应用到所有 @RequestMapping中
表示该方法的返回结果直接被写入http response body中
比如:
属性:
@RequestMapping有六个属性:
public String getByMacAddress(@PathVariable("macAddress") String macAddress) {}
参数与大括号里的名字相同的话,注解后括号里的内容可以不填
@Exceptionhandler(Exception.class)
微服务注解集合,包含: