@Value
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {
String value();
}
我们来看一下,从注解本身的定义,该注解可以使用在以下方面
- 字段上
- set方法上
- 方法入参上
- 当作元注解
功能
1.可以注入普通的字符串
@Value("normal")
private String normal;
2.可以使用SpEl表达式
a. 获取系统属性
@Value("#{systemProperties['java.version']}")
private String systemPropertiesName; // 注入操作系统属性
b.调用方法
@Value("#{T(java.lang.Math).random()*80}")//获取随机数
private double randomNumber; //注入表达式结果
c.计算
@Value("#{1+2}")
private double sum; //注入表达式结果 1+2的求和
3.注入Resource
@Value("classpath:os.yaml")
private Resource resourceFile; // 注入文件资源
4.注入URL资源
@Value("http://www.baidu.com")
private Resource testUrl; // 注入URL资源
5.获取配置文件属性
@Value("${app.name}")
private String appName; // 这里的值来自application.properties,spring boot启动时默认加载此文件
{}与${}
1. #{}
通常用来获取bean的属性,或者调用bean的某个方法。当然还有可以表示常量
2. ${}
一般用于读取配置文件中的内容
如果内容找不到,启动会失败。
如果说希望配置文件没有配置的情况下也能正常启动,需要在里面加上默认值
@Value("${app.name:测试}")
private String name;
3.混合使用
那么#{}与${}是否可以混合着使用呢,答案是可以<br />a. #{}在外 ${}在内
// SpEL: 传入一个字符串,根据","切分后插入列表中, #{}和${}配置使用
@Value("#{'${server.name}'.split(',')}")
private List<String> servers;
这时会先读取配置文件中的server.name的属性,然后通过SpEl表达式去执行split方法将逗号分隔的字符串转换为字符串的列表
b.${}在外,#{}在内
@Value("${server.#{1+2}")
private List<String> servers2;
这样写去获取配置文件中server.3的值可行吗,不可以
因为在spring的加载机制中是先执行${}然后再去执行#{}
所以这样写就会去配置文件中找server.#{1+2}这个属性的值,因为配置文件中没有,启动就会报错
4.总结
#{} 用于执行SpEl表达式,并将内容赋值给属性
${} 主要用于加载外部属性文件中的值
#{} 在外,${}在里
@ConfigurationProperties
@ConfigurationProperties是Spring Boot提供的。包括@EnableConfigurationProperties也是Spring Boot才有的。它在自动化配置中起到了非常关键的作用
ConfigurationPropertiesBindingPostProcessor会对标注@ConfigurationProperties注解的Bean进行属性值的配置。
我们在配置文件中增加一下列
com.example.demo.age=11
com.example.demo.address[0]=北京
com.example.demo.name=test
读取方式
a.
@Component
@ConfigurationProperties(prefix = "com.example.demo")
public class People {
private String name;
private Integer age;
private List<String> address;
}
b.在方法上使用bean和ConfigurationProperties注解
@Bean
@ConfigurationProperties(prefix = "com.example.demo")
public People people() {
return new People();
}
@ImportResource
@ImportResource注解用于导入Spring的配置文件,让配置文件里面的内容生效;(就是以前写的springmvc.xml、applicationContext.xml)
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,需要使用@ImportResource加载进来
@ImportResource(locations = {"classpath:beans.xml"})
@Configuration
指明当前类是一个配置类;就是来替代之前的Spring一些繁琐的配置文件
- 配置类@Configuration作用于类上,相当于一个xml配置文件
- 使用@Bean给容器中添加组件,作用于方法上
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
}
这样写实质上就相当于在xml中进行bean的配置
<bean id="helloService" class="com.self.springboot.service.HelloService"></bean>
如果有很多bean需要注入,又不想这么麻烦去做,就使用扫描的方式实现
//通过该注解来表明该类是一个Spring的配置,相当于一个传统的ApplicationContext.xml
@Configuration
//相当于配置文件里面的<context:component-scan/>标签,扫描这些包下面的类的注解
@ComponentScan(basePackages="com.self.dao,com.hanpang.service")
public class SpringConfig {
// 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
//bean的id值默认是方法名userDao
/*
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...");
return new HelloService();
}
*/
}