图片大多来源于Spring Boot 2.x从青铜到王者之白银篇
点开@SpringBootApplication
可以发现这其实是一个复合注解。最为主要的便是以下三个注解。也可以使用这三个注解代替。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
这个注解来源于@Configuration,作用是将当前类标注为配置类并且将类中标记为@Bean的方法的实例注入到spring容器中,实例名为方法名。
作用是启动自动配置,帮助SpringBoot将复合条件的@Configuration配置加载到IoC容器中。在ClassPath下扫描所有的META-INF/spring.factories配置文件,并将spring.factories文件中的EnableAutoConfiguration对应的配置类注入IoC容器中。
通过basePackages属性来更细粒度的控制该注解的自动范围扫描。
名字有点意思2333,套娃名字
它强调了自己不是一个标记语言,给我的感觉有点像json,语法很简单,键:空格值,如果为复杂结构的数据(比如含有嵌套),就使用缩进来判别,格式严格,不过正因为此,看起来清晰明了。
还可使用一些占位符调用方法为某些属性赋值。
比如:这是一个描述一个家庭的yml文件,同一缩进级别的就是同一层次的值,-是数组格式的描述,{}则是类字典格式的描述。
family:
family-name: "happy family"
father:
name: ydl
age: 22
mother:
alias:
- aaa
- bbb
child:
# 使用占位符,如果不存在前面那个值则使用ydl为其赋值
name: ${family.father.name:ydl}
# 随机数的占位符
age: ${random.int}
friends:
- hobby: football
sex: male
- hobby: game
sex: male
- {hobby: football,sex: male}
- {hobby: Game,sex: famale}
# 含有转义字符需要专义使用"",不需要使用''
# family-name = familyName = family_name ,这三种命名方式是等价的
可使用以下注解在代码中获取yml中的配置。
使用@Value可给模型类的每一个属性分别进行配置。
使用@ConfigurationProerties进行是对给定的属性逐个进行赋值。
不过如果不是将这些配置写到默认配置文件中的话,就需要注释使用的是哪一个配置文件,可使用@PropertySource
注解来注明使用的配置文件。
比如上文的那个配置文件,文件名为famliy.yml,调用方式就可如以下代码所示:
@Data
// 标注一个类为Spring容器的Bean
@Component
//为了使下面的验证生效
@Validated
//给该类下的全体属性进行配置
@ConfigurationProperties(prefix = "family")
//在classpath去加载配置文件,但是是默认加载properties文件的,需要新建一个配置类将yaml转换为properties文件
@PropertySource(value = "classpath:famliy.yml",factory = MixPropertySourceFactory.class)
public class Family {
// //在应用启动时自动将配置中的值绑定到属性上
// @Value("${family.family-name}")
// private String familyName;
private String familyName;
//这些类按照配置文件的格式来建
private Father father;
private Mother mother;
private Child child;
}
其中yml文件解析为properties文件,需要使用一个工具类进行转换。
public class MixPropertySourceFactory extends DefaultPropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
// return (name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource));
String sourceName = name!=null?name:resource.getResource().getFilename();
if(sourceName!=null&&(sourceName.endsWith(".yml")||sourceName.endsWith(".yaml"))){
Properties propertiesFromYaml = loadYml(resource);
return new PropertiesPropertySource(sourceName,propertiesFromYaml);
}else {
return super.createPropertySource(name,resource);
}
}
private Properties loadYml(EncodedResource resource) {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
}
}
可使用这些对应的注解对配置值或者说之后前端传进来的参数进行限定。
这就可以指定配置的xml文件了,通过这种方式来注入类,如果需要兼容老项目的话,可以采用这种方式。
//扫描指定xml配置文件,标记到启动类上
@ImportResource(locations = {"classpath:beans.xml"})
测试代码:
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class ImportResourceTest {
//管理配置的上下文环境
@Resource
private ConfigurableApplicationContext ioc;
@Test
public void testImport(){
boolean isImport = ioc.containsBean("testBeanService");
System.out.println(isImport);
}
}
可在注解中指定使用哪个值。可在@Value、xml配置文件,或者Expression中使用,详情可参考spEL
@Data
@Configuration
@PropertySource(value = "classpath:employee.properties",encoding = "utf-8")
public class Employee {
@Value("#{'${employee.names}'.split('\\|')}")
private List<String> employeeName;
@Value("#{'${employee.names}'.split('\\|')[0]}")
private String firstEmployeeNames;
@Value("#{${employee.age}}")
private Map<String,Integer> employeeAge;
@Value("#{${employee.age}['two']}")
private String employeeAgeTow;
@Value("#{${employee.age}['five']?:31}")
private Integer ageWithDefaultValue;
@Value("#{systemProperties['java.home']}")
private String javaHome;
@Value("#{systemProperties['user.dir']}")
private String userDir;
}
在不同的环境下需要使用不同的配置文件,选定配置文件也有多种方式。
1.在主配置文件中设置
spring:
profiles:
active: prod
默认配置优先级如图所示。
、
顺序如下所示,大概就是指定的大于默认的,外部的大于内部的。
如果配置文件中存在敏感信息,将其直接传入代码仓库是不合理的,这可能会导致铭感信息泄露,引发安全隐患,所以需要加密。可使用jasypt工具进行处理。
导入两个包
com.github.ulisesbocchio
jasypt-spring-boot-starter
1.18
org.jasypt
jasypt
1.9.3
然后再使用如下配置来指定加密的方式以及盐值以及需要加密的格式。
可写成.bat脚本或者.sh脚本…俺不会写shell…之后学了再补吧。
然后再实际运行时需要解密,将盐值通过配置参数传入,进行自动解密即可。 使用ENC(密文)的形式写需要加密的内容于配置文件中。然后可以将密钥(盐值)的配置参数为
jasypt:
encryptor:
password: xxxx