Spring源码解析之属性赋值

在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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值