SpringBoot入门(2)自动装载简介,YAML语法等

图片大多来源于Spring Boot 2.x从青铜到王者之白银篇

自动装载

在这里插入图片描述
点开@SpringBootApplication 可以发现这其实是一个复合注解。最为主要的便是以下三个注解。也可以使用这三个注解代替。

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

@SpringBootConfiguration

这个注解来源于@Configuration,作用是将当前类标注为配置类并且将类中标记为@Bean的方法的实例注入到spring容器中,实例名为方法名。

@EnableAutoConfiguration

作用是启动自动配置,帮助SpringBoot将复合条件的@Configuration配置加载到IoC容器中。在ClassPath下扫描所有的META-INF/spring.factories配置文件,并将spring.factories文件中的EnableAutoConfiguration对应的配置类注入IoC容器中。

@ComponentScan

通过basePackages属性来更细粒度的控制该注解的自动范围扫描。

Bean加载条件

点进一个自动装配的配置类
在这里插入图片描述
这些就是它自动装配的条件
在这里插入图片描述

YAML(YAML Ain’t Markup Language)

名字有点意思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();
    }
}

在这里插入图片描述

validation

可使用这些对应的注解对配置值或者说之后前端传进来的参数进行限定。
在这里插入图片描述

使用YAML配置文件和使用xml配置文件

这就可以指定配置的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);
    }
}

SpEL表达式

可在注解中指定使用哪个值。可在@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;
}

profile不同环境不同配置

在不同的环境下需要使用不同的配置文件,选定配置文件也有多种方式。
1.在主配置文件中设置

spring:
  profiles:
    active: prod

也可采用下图所示方式
在这里插入图片描述在这里插入图片描述

配置文件的加载优先级

默认配置优先级如图所示。
在这里插入图片描述
在这里插入图片描述
顺序如下所示,大概就是指定的大于默认的,外部的大于内部的。
在这里插入图片描述

配置文件敏感信息加密

如果配置文件中存在敏感信息,将其直接传入代码仓库是不合理的,这可能会导致铭感信息泄露,引发安全隐患,所以需要加密。可使用jasypt工具进行处理。

导入两个包

  <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>1.18</version>
        </dependency>
        <dependency>
            <groupId>org.jasypt</groupId>
            <artifactId>jasypt</artifactId>
            <version>1.9.3</version>
        </dependency>

然后再使用如下配置来指定加密的方式以及盐值以及需要加密的格式。
在这里插入图片描述可写成.bat脚本或者.sh脚本…俺不会写shell…之后学了再补吧。
在这里插入图片描述然后再实际运行时需要解密,将盐值通过配置参数传入,进行自动解密即可。 使用ENC(密文)的形式写需要加密的内容于配置文件中。然后可以将密钥(盐值)的配置参数为

jasypt:
  encryptor:
    password: xxxx

当然这应该与配置文件分开存放,可通过命令行进场传入。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值