Skip to content

3.PropertySource和Value

俞正东 edited this page Jan 18, 2023 · 14 revisions

PropertySource 指定数据源

属性 说明
Path 文件路径,看下面的说明
OrderIndex 文件源排序,越大越先作为查找对象
Embedded 是否为内嵌资源
ReloadOnChange 是否监听文件有修改自动重新加载 默认true (注意:非内嵌资源才行)
Dynamic 动态数据源类型 必须继承接口:IDynamicSourceProvider <为了扩展自定义数据源用的>
Key 当上面的Dynamic动态数据源类型有多个注册的时候根据key来获取唯一<为了扩展自定义数据源用的>
    [PropertySource("appsettings.json")] //这行也可以直接去掉 因为和默认的一样
    [Component]
    public class Student9
    {
        [Value("${a9}")]
        public string Name { get; set; }
    }
    

image

image

  • PropertySource的path可以指定为json 和 xml 文件
  • PropertySource 如果不指定path 默认path为根目录的appsettions.json
  • 如果Path的值为 / 开头 则代表为相对于工程目录
  • 如果设定 Embedded = true 则代表path的值为 内嵌资源的文件名称
  • Path的值也可以为 文件的完整路径

Value装配数据源里面的值

属性 说明
value 对应的key
UseSpel 是否启用SPEL 默认true,如果false,那么根据配置的value的值直接从PropertySource里面读取
IgnoreUnresolvablePlaceholders 如果从数据源取不到要不要报错,默认取不到报错
EnvironmentVariableMode 设置是否从环境变量拿 默认是从PropertySource里面读取不到 就从环境里面去拿
  • ${xxx} 代表从配置源里面 获取属性名称为xxx的值
  • #{xxx} 代表启动SPEL表达式,xxx里面可以嵌套${yyy}
  • SPEL表达式具体用法可以查看:https://github.com/yuzd/Spring.EL

image

举例

appsettings.json文件内容如下:

{
  "a9": "aaaaaaaaa",
  "list": "1, 2, 3, 4 ",
  "dic": "#{'name': 'name1','school': 'school1'}",
  "parent": {
    "name": "yuzd"
  },
  "list2": [
    "1",
    "2"
  ],
  "ValueInjectModel1": {
    "Name": "yuzd",
    "Age": 20
  }
}
[Value("hello")]
private string normal; // 注入普通字符串 normal=“hello”

[Value("${a9}")]
private string a9; // 注入a9 =“aaaaaaaaa”

Value("${list}")]
private List<int> list; // 注入list是int的集合 [1,2,3,4]

[Value("#{${dic}}")] 
private Dictionary<string, string> dic; // 注入dic是字典 {'name': 'name1','school': 'school1'}

[Value("list2", UseSpel = false)] //注意这里UseSpel设置为false,注入list2 是string集合 ['1','2']
public List<string> list2 { get; set; }

[Value("ValueInjectModel1", UseSpel = false)] //注意这里UseSpel设置为false,注入ValueInjectModel1对象 {'Name': 'yuzd','Age': 20}
public ValueInjectModel1 ValueInjectModel1 { get; set; }

如果要监听文件有改变能获取到最新的值请使用IValue

image

在aspnetcore应用中 Value默认用的数据源可以切换成应用的Configuration

containerBuilder.RegisterModule(new AutofacAnnotationModule()
            .SetDefaultValueResource(c.Configuration) //c.Configuration是当前应用的Configuration,这样设置后,如果没有特别指定PropertySource的话value读取的数据源默认从这里获取了
    );

动态数据源