// 加载配置文件
<context:property-placeholder location="classpath:person.properties" />
<bean id="person" class="com.lwk.bean.Person" init-method="init" destroy-method="destroy">
<property name="age" value="18"></property>-->
<property name="name" value="liayun"></property>-->
<property name="nickName" value="${person.nickName}"></property>-->
</bean>
配置文件person.properties
person.nickName=小李四
使用@PropertySource读取外部配置文件中的key/value保存到运行的环境变量中,加载完外部的配置文件以后,使用${}取出配置文件中的值
@PropertySource(value={"classpath:/person.properties"})
@Configuration
public class MainConfigOfPropertyValues {
@Bean
public Person person() {
return new Person();
}
}
#{···}:用于执行SpEl表达式,并将内容赋值给属性
${···}:主要用于加载外部属性文件中的值, 配合配置文件@Configuration+@PropertySource(value={"classpath:/person.properties"})使用
${···}和#{···}可以混合使用,但是必须${}在里面,#{}在外面
public class Person {
@Value("张三")
private String name;
@Value("#{20-2}")
private Integer age;
@Value("${person.nickName}")
private String nickName;
}
还可以通过环境变量对象从配置文件中获取属性值
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfPropertyValues.class);
ConfigurableEnvironment environment = applicationContext.getEnvironment();
String property = environment.getProperty("person.nickName");
System.out.println(property);
applicationContext.close();
}
@Value源码中的注释
- 在字段或方法/构造函数参数级别使用的注释,用于指示注释元素的默认值表达式。通常用于基于表达式或属性的依赖注入。还支持动态解析处理程序方法参数。
- 例如在Spring MVC中,常见用例是使用#{systemProperties.myProp}样式的SpEL(Spring表达式语言)表达式注入值。或者,可以使用${my.app.myProp}样式的属性占位符注入值。
- 请注意,@Value注释的实际处理由BeanPostProcessor执行,这意味着不能在BeanPostProcessor或BeanFactoryPostProcessor类型中使用@Value。请查阅AutowiredAnnotationBeanPostProcessor类的javadoc(默认情况下会检查此注释的存在)。
@Value注解可以注入一些字段的普通属性,并且会自动进行类型转换
定义一个bean
@Component
@Data
public class ConnectionPool {
@Value("jdbc:mysql://localhost:3306/test")
private String url;
@Value("com.mysql.jdbc.Driver")
private String driveName;
@Value("root")
private String userName;
@Value("root")
private string password;
}
定义配置类,用于扫描bean
@Configuration
@ComponentScan("com.lwk.dao")
public class myConfig { }
测试
@Test
public void test01(){
ApplicationContext context = new AnnotationConfigApplicationContext(myConfig.class);
ConnectionPool connectionPool = context.getBean("connectionPool", ConnectionPool.class);
System.out.println(connectionPool.toString());
}
ConnectionPool{url='jdbc:mysql://localhost:3306/test', driveName='com.mysql.jdbc.Driver', userName='root',password=10}
可以通过@Value(“${}”)来注入配置文件中的属性
@Component
@Data
public class ConnectionPool {
@Value("jdbc:mysql://localhost:3306/test")
private String url;
@Value("com.mysql.jdbc.Driver")
private String driveName;
@Value("root")
private String userName;
@Value("${mysql.pwd}")
private String password;
}
定义配置类,用于扫描bean
@Configuration
@ComponentScan("com.lwk.dao")
@PropertySource({"classpath:db.properties"})
public class myConfig { }
db.properties配置文件放在resources目录下,使用@PropertySource注解扫描的classpath就是此路径
mysql.password=root
测试
ConnectionPool{url='jdbc:mysql://localhost:3306/test', driveName='com.mysql.jdbc.Driver', userName='root', password='root'}
- 当@Value包含一个SpEl表达式时,该值将在运行时动态计算
- SpEl(Spring Expression Language ),是Spring的表达式语言,很多框架中都有自己的El表达式,Spring中El表达式支持的功能有很多,在官方文档里面有详细的介绍和用例。
动态获得运行机器的核心数作为参数注入
@Component
@Data
public class ConnectionPool {
@Value("#{T(java.lang.Runtime).getRuntime().availableProcessors()}")
private int minCons;
@Value("#{T(java.lang.Runtime).getRuntime().availableProcessors() * 2}")
private int maxCons;
}
ConnectionPool{minCons=8, maxCons=16}