在Spring注解中对属性赋值有3种方法:
- 基本数值,可以是基本数据类型,字符串等;
@Value("feiyue")
- SpEL表达式,使用#{}进行表达式运算
@Value("#{30 - 5}")
- 使用 ${}获取.properties配置文件中的key对应的value值,配置文件中的值默认都加载到运行时环境Environment中,所有也可以通过
environment.getProperty("prop.city");
方式获取。
PropertyValue类
package com.liangpengju.entity;
import org.springframework.beans.factory.annotation.Value;
/**
*属性赋值有几种方法
* 1.基本数值 @Value("feiyue")
* 2.SpEL表达式 @Value("#{30 - 5}")
* 3.使用 ${}获取属性文件中的值,配置文件中的值默认都加载到运行时env环境中
*/
public class PropertyValue {
@Value("feiyue")
private String name;
@Value("#{30 - 5}")
private int age;
@Value("${prop.city}")
private String city;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "PropertyValue{" +
"name='" + name + '\'' +
", age=" + age +
", city='" + city + '\'' +
'}';
}
}
PropertyConfig配置文件,加载属性文件和创建Bean
@PropertySource(value = {"classpath:config.properties"})
或
@PropertySources({ @PropertySource(value = {"classpath:config.properties"}) })
package com.liangpengju.config;
import com.liangpengju.entity.PropertyValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* 1.使用@PropertySource注解可以加载多个配置文件,value是数组
* 2.也可以通过PropertySources加载多个PropertySource,@PropertySource是一个可重复注解
*/
@PropertySource(value = {"classpath:config.properties"})
@Configuration
public class PropertyConfig {
@Bean("propertyValue")
public PropertyValue propertyValue(){
return new PropertyValue();
}
}
测试类
package com.liangpengju.annotation;
import com.liangpengju.config.PropertyConfig;
import com.liangpengju.entity.PropertyValue;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.Environment;
public class PropertyValueTest {
@Test
public void testPropertyValue(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PropertyConfig.class);
printBeans(context);
PropertyValue propertyValue = (PropertyValue) context.getBean("propertyValue");
System.out.println(propertyValue);//PropertyValue{name='feiyue', age=25, city='Beijing'}
//使用
Environment environment = context.getEnvironment();
String property = environment.getProperty("prop.city");
System.out.println("prop.city="+property);//Beijing
context.close();
}
private void printBeans(AnnotationConfigApplicationContext context){
//根据类型获取bean的id
System.out.println("IOC容器所有的bean...");
String[] definitionNames = context.getBeanDefinitionNames();
for (String name : definitionNames){
System.out.println(name);
}
}
}
@PropertySources注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PropertySources {
PropertySource[] value();
}
@PropertySource注解
是一个可重复配置的注解,可以重复配置到@PropertySources注解中
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(PropertySources.class)
public @interface PropertySource {
/**
*/
String name() default "";
/**
* 指定资源文件路径,可以指定多个,使用逗号分隔
* {"classpath:/com/myco/app.properties"}
* or {@code "file:/path/to/file.xml"}.
*/
String[] value();
/**
* 指定没有加载到的资源将会被忽略
*/
boolean ignoreResourceNotFound() default false;
/**
* 给定的资源文件指定编码格式, e.g. "UTF-8".
*/
String encoding() default "";
/**
* 指定一个自定义的factory
*/
Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class;
}