精华内容
下载资源
问答
  • 主要介绍了Spring Boot自定义配置属性源(PropertySource),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • PropertySource:属性资源,以name/value形式存储 protected final String name; //属性名字 protected final T source; //属性资源 配合属性解析器使用的接口: public boolean containsProperty(String name) {//...

    PropertySource:属性资源,以name/value形式存储

    protected final String name; //属性名字
    protected final T source; //属性资源
    

    配合属性解析器使用的接口:

    public boolean containsProperty(String name) {//判断该资源是否含有指定名称的key
    		return (getProperty(name) != null);
    	}
    @Nullable
    public abstract Object getProperty(String name);//从资源中获取值
    

    占位资源,用于保证自己的顺序,后续通过replace换成真实资源,例如ServeltContext等:

    public static class StubPropertySource extends PropertySource<Object> {
    		public StubPropertySource(String name) {
    			super(name, new Object());
    		}
    		@Override
    		@Nullable
    		public String getProperty(String name) {
    			return null;
    		}
    	}
    

    在springframework核心包中有一个实现,可以枚举属性名字:

    public abstract class EnumerablePropertySource<T> extends PropertySource<T> {
    
    	public EnumerablePropertySource(String name, T source) {
    		super(name, source);
    	}
    	protected EnumerablePropertySource(String name) {
    		super(name);
    	}
    	@Override
    	public boolean containsProperty(String name) {
    		return ObjectUtils.containsElement(getPropertyNames(), name);
    	}
    	//枚举所有属性名字
    	public abstract String[] getPropertyNames();
    
    }
    

    EnumerablePropertySource的直接实现:

    CompositePropertySource (org.springframework.core.env)//符合型实现,有一个set持有PropertySource
    CommandLinePropertySource (org.springframework.core.env)//命令行属性资源
    MapPropertySource (org.springframework.core.env)//map型资源
    AnnotationsPropertySource (org.springframework.boot.test.autoconfigure.properties)//通过注解注入的属性资源
    

    其中MapPropertySource是使用较广的,他的实现有:

    PropertiesPropertySource (org.springframework.core.env)//通过Properties资源构建属性资源
           ResourcePropertySource (org.springframework.core.io.support)//直接通过资源路径构建属性资源
           MockPropertySource (org.springframework.mock.env)//测试使用的属性资源
    SystemEnvironmentPropertySource (org.springframework.core.env)//对系统环境转换成属性资源
    

    命令行属性资源:

    CommandLinePropertySource (org.springframework.core.env)
    		SimpleCommandLinePropertySource (org.springframework.core.env)//能够吧命令行参数封装成属性资源
    

    通过上面的源码解析,可以看到,spring的属性资源,按照不同的场景,可以自行构建自定义属性资源,从而能解析符合自己业务需求的资源,比如从某个网络位置进行资源解析,等等.

    展开全文
  • A.Spring从3.1版本开始增加了ConfigurableEnvironment和PropertySource: ConfigurableEnvironment Spring的ApplicationContext会包含一个Environment(实现ConfigurableEnvironment接口) ...

    1.使用spring中的知识点

    A.Spring从3.1版本开始增加了ConfigurableEnvironment和PropertySource:

    • ConfigurableEnvironment
      Spring的ApplicationContext会包含一个Environment(实现ConfigurableEnvironment接口)
      ConfigurableEnvironment自身包含了很多个PropertySource
    • PropertySource
      属性源
      可以理解为很多个Key - Value的属性配置

    需要注意的是,PropertySource之间是有优先级顺序的,如果有一个Key在多个property source中都存在,那么在前面的property source优先。

    B.Spring中的BeanFactoryPostProcessor

     在标准初始化之后修改应用程序上下文的内部bean工厂。所有的bean定义都将被加载,但是没有bean被实例化。这允许覆盖或添加属性,甚至是对迫切初始化的bean。

    也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,所以在此过成中添加上自定义的PropertySource。

     

    C.Spring中的EnvironmentAware,用于获取 ConfigurableEnvironment

        此外,不得不提一下Aware接口,它其实是一个空接口,里面不包含任何方法。它表示已感知的意思,通过这类接口可以获取指定对象,比如:

    • 通过BeanFactoryAware获取BeanFactory
    • 通过ApplicationContextAware获取ApplicationContext
    • 通过BeanNameAware获取BeanName等

     

    2.主要实现代码如下:

    1.自定义类PropertySourcesProcessor,作用:实例化之前添加自定义的PropertySource

    @Component

    public class PropertySourcesProcessor implements BeanFactoryPostProcessor, EnvironmentAware {

     

     

        private ConfigurableEnvironment environment;

     

     

        @Override

        public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

            if (!this.environment.getPropertySources().contains("test")) {

                //PropertySource<T>中的 泛型具体类型,在该类中,获取外部参数

                ReadSettings readSettings = new ReadSettings();

                //实例化自定义的 PropertySource

                ConfigPropertySource propertySource  = new ConfigPropertySource("test",readSettings);

                //把PropertySource添加到spring environment中

                this.environment.getPropertySources().addFirst(propertySource);

            }

        }

     

     

        @Override

        public void setEnvironment(Environment environment) {

            this.environment = (ConfigurableEnvironment)environment;

        }

    }

    2.自定义类ConfigPropertySource,继承EnumerablePropertySource类,作用:重写getProperty方法,读取外部配置

     

    public class ConfigPropertySource extends EnumerablePropertySource<ReadSettings> {

     

     

        public ConfigPropertySource(String name, ReadSettings source) {

            super(name, source);

        }

     

        @Override

        public String[] getPropertyNames() {

            Set<String> keys = this.source.getKeys();

            return keys.toArray(new String[keys.size()]);

        }

     

     

        //重写 getProperty 方法,value值从 ReadSettings 中获取

        @Override

        public Object getProperty(String s) {

            return this.source.readValue(s);

        }

    }

    3.自定义类ReadSettings,作用:读取外部资源功能类

     

    public class ReadSettings {

     

     

       private Properties pro = new Properties();

     

     

        public String readValue(String name){

            try {

                //这里也可以通过HTTP请求远程读取配置文件

                pro = new Properties();

                InputStream in = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\222.properties"));

                pro.load(in);

                String property = pro.getProperty(name);

                return property;

            catch (IOException e) {

                e.printStackTrace();

            }

            return System.currentTimeMillis()+"";

        }

     

     

        public Set<String> getKeys(){

            Set<String> keys = new HashSet<>();

            Iterator i$ = pro.entrySet().iterator();

            while(i$.hasNext()) {

                Map.Entry<Object, Object> e = (Map.Entry)i$.next();

                keys.add(e.getKey().toString());

            }

            return keys;

        }

    }

    在使用配置文件时,直接使用@Value 注解即可。

    参考apollo配置中心,客户端启动读取远程配置文件方法

    https://ctripcorp.github.io/apollo/#/zh/design/apollo-design?id=_31-%e5%92%8cspring%e9%9b%86%e6%88%90%e7%9a%84%e5%8e%9f%e7%90%86

    展开全文
  • springboot加载自定义属性文件(@PropertySOurce) ********************** 相关注解 @PropertySource @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable...

    springboot 加载自定义properties文件(@PropertySOurce)

     

     

    **********************

    相关注解

     

    @PropertySource

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Repeatable(PropertySources.class)
    public @interface PropertySource {
    
        String[] value();    //加载文件位置
    
        String name() default "";
        boolean ignoreResourceNotFound() default false;
        String encoding() default "";
    
        Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class;
                            //自定义factory,默认不能加载yml文件,可自定义factory
    }
    

     

     

    **********************

    示例

     

    ****************

    属性文件

     

                                  

     

    person.properties

    person.name=瓜田李下
    person.age=20
    

     

    ****************

    pojo 层

     

    Person

    @Data
    @Component
    @ConfigurationProperties(prefix = "person")
    @PropertySource(value = {"classpath:properties/person.properties"})
    public class Person {
    
        private String name;
        private Integer age;
    }
    

     

    ****************

    controller 层

     

    HelloController

    @RestController
    public class HelloController {
    
        @Resource
        private Person person;
    
        @RequestMapping("/hello")
        public String hello(){
            System.out.println(person);
    
            return "success";
        }
    }
    

     

                               

    **********************

    使用测试

     

    localhost:8080/hello

    2020-07-09 20:35:22.908  INFO 6488 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
    2020-07-09 20:35:22.952  INFO 6488 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 43 ms
    Person(name=瓜田李下, age=20)
    

     

     

    展开全文
  • 今天遇到一个很诡异的问题 我想把mysql_durid.yml中的配置信息注入到DruidDataSource中 发现根本不起作用 调试源代码发现 mysql_druid.yml中的 spring.database.druid 都...可以重写 PropertySource的 factory 具体.

    在这里插入图片描述

    今天遇到一个很诡异的问题
    我想把mysql_durid.yml中的配置信息注入到DruidDataSource中
    发现根本不起作用
    调试源代码发现
    在这里插入图片描述

    mysql_druid.yml中的 spring.database.druid 都没了。
    里面的key不是spring.database.druid.url 等等 二直接是url password之类的

    在这里插入图片描述

    搞了半天 是我用错了。
    在网上搜了一下别人怎么用的
    在这里插入图片描述
    大概是这样吧。

    如果想解决这一问题

    可以重写 PropertySource的 factory
    在这里插入图片描述

    具体代码如下

    /**
     * @author coffee
     * @create 2021-01-18 21:55
     **/
    public class DruidPropertySourceFactory implements PropertySourceFactory {
    
        @Override
        public PropertySource<?> createPropertySource(String sourceName, EncodedResource resource) throws IOException {
            Properties propertiesFromYaml = loadYaml(resource);
            if (StringUtils.isBlank(sourceName)) {
                sourceName = resource.getResource().getFilename();
            }
            return new PropertiesPropertySource(sourceName, propertiesFromYaml);
        }
    
        private Properties loadYaml(EncodedResource resource) throws FileNotFoundException {
            try {
                YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
                factory.setResources(resource.getResource());
                factory.afterPropertiesSet();
                return factory.getObject();
            } catch (IllegalStateException e) {
                Throwable cause = e.getCause();
                if (cause instanceof FileNotFoundException) {
                    throw (FileNotFoundException) e.getCause();
                }
                throw e;
            }
        }
    
    }
    

    在这里插入图片描述
    另外一种实现方式
    参考这里
    https://cloud.tencent.com/developer/article/1481440

    展开全文
  • 通过自定义PropertySource,实现加载classpath目录下面的application.json, application.properties,application.yml等配置文件,让ssm项目也有springboot的配置功能
  • 首先定义一个YamlPropertySourceFactory,参考https://mdeinum.github.io/2018-07-04-PropertySource-with-yaml-files/ import java.io.FileNotFoundException; import java.io.IOException; import java.util....
  • springboot加载自定义yml文件(@PropertySource
  • @PropertySource 注解 使用 @PropertySource 注解,可以 PropertySourceFactory 接口 默认使用 @PropertySource 可以指定解析 properties 和 xml 配置文件,却不可以解析 yaml 配置文件,因为 spring 默认没有 yaml ...
  • 在项目中,习惯用YAML来写配置文件,但读取自定义配置文件时,遇到了问题: 编写两个配置文件: 1. temp.yml prefix: what: x list: - name: tech item: 123 - name: skill item: 987 2. temp.properties...
  • 使用@PropertySource默认加载的是.xml或者 .properties文件,因为在注解源码默认使用的是DefaultPropertySourceFactory实现处理文件内容,spring 使用ResourcePropertySource从Resource构建Properties传给Spring。 ...
  • 上一篇文章介绍了SpringBoot的EnableAutoConfiguration,并通过自定义注解来实现相同的功能。 这里再介绍一下SpringBoot的配置文件的加载机制,SpringBoot会默认加载ClassPath下的application.properties的文件,...
  • Spring Boot 自定义PropertySourceLoader

    万次阅读 2017-05-04 09:22:11
    org.springframework.core.env.PropertySource; import org.springframework.core.io.Resource; /** * JSON格式配置文件加载器 * * @author 单红宇(CSDN CATOOP) * @create 2017年4月20日 */ ...
  • 因为spring中PropertySource的默认实现是properties类型文件的解析。 可以实现一个解析yaml文件的工具类,实现PropertySourceFactory接口。 第一步:实现工具类 public class YamlPropertySourceFactory ...
  • 由于SpringCloud 配置中心自定义存储方式中提到PropertySourceLoader,故再学习一下自定义属性源 自定义属性源有两种比较简单的方式: 1、实现EnvironmentPostProcessor接口 2、实现PropertySourceLoader接口 ...
  • SpringBoot系列之@PropertySource支持yaml文件读取 最近在做实验,想通过@PropertySource注解读取配置文件的属性,进行映射,习惯上用properties都是测试没问题的,偶然换成yaml文件,发现都读取不到属性值 因为yaml...
  • Flink自定义kafkaSource 和Sink

    千次阅读 2020-04-01 17:22:04
    <activation> <property> <name>idea.version</name> </property> </activation> <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> ${flink.version}...
  • 而spring只提供了类似application-* 的这中匹配方式,并不支持我们自定义的配置文件名称,例如:customize-dev.properties,但是spring提供了一个注解可以方便加载我们的自定义配置文件,它就是@PropertySource。...
  • 1、自定义配置文件common-as-dev.properties stu.name=zhangsan stu.age=18 stu.sex=man 2、pom里配置环境 <profile> <id>as-dev</id> <properties> <port>8081</...
  • @PropertySource 获取自定义配置文件。 使用该标签要配合@ConfigurationProperties和@Compent一起使用,否则直接使用在配置文件中写的配置内容将不能获取。 设置内容为person.name=‘123789456’
  • 若想要快速知道结论,你也可以直接阅读: 【小家Spring】一篇文章彻底搞懂Spring Boot配置文件的加载顺序(项目内部配置和外部配置) PropertySource 此处指的是org.springframework.core.env.PropertySource,而...
  • @PropertySource 注解的使用

    千次阅读 2020-03-27 18:42:50
    如下图所示,它可以实现 person.properties 文件中的配置信息与自定义的 Person 类完成注入操作: 2.@PropertySource读取.yml配置文件 Spring Boot 默认不支持@PropertySource读取yaml 文件。   Spring 4.3 通过...
  • 文章目录概述自定义配置文件读取内容 概述 众所周知,我们可以将程序的配置写在默认的application.properties文件中,但是有时我们为了便于管理,存在将某些配置写在单独的文件中的需求,SpringBoot如何实现呢?今天...
  • @PropertySource配置的用法

    万次阅读 多人点赞 2020-08-26 12:45:06
    @PropertySource 和 @Value 组合使用,可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。 @PropertySource 和 @ConfigurationProperties 组合使用,可以将属性文件与一个Java类绑定,...
  • 出于某些原因,需要往Spring项目的Environment里手动设置Property,但是又由于某些原因,不能使用@PropertySource注解引入。所以必须通过某些方法,手动设置。 怎么做 1.首先实现ApplicationContextInitializer&...
  • @PropertySource注解用于指定资源文件读取的位置,它不仅能读取properties文件,也能读取xml文件,并且通过YAML解析器,配合自定义PropertySourceFactory实现解析YAML文件。 源码: //只能作用在类上 @Target...
  • 摘要:Springboot中PropertySource注解的使用一文中,详细讲解了PropertySource注解的使用,通过PropertySource注解去加载指定的资源文件、然后将加载的属性注入到指定的配置类,@value以及@ConfigurationProperties...
  • Flink之自定义Source

    2019-12-19 09:39:50
    主函数 有4中读取数据方式 1.从集合中读取数据env.fromCollection(List(…)...3.从kafka中读取数据 env.addSource(new FlinkKafkaConsumer[String](“sensor”, new SimpleStringSchema(), properties)) 4. 第四种就...
  • 目录 1. 说明 2. 注解使用 ...@PropertySources({ @PropertySource("classpath:/a.properties"), @PropertySource("classpath:b.properties") }) public class MainConfigForValue { }  
  • 之前文章简单的介绍了一下@Value和@...一分钟学会spring注解之@PropertySource注解 今天这篇文章将给大家详细的介绍一下@PropertySource注解实现原理 首先让我们一起看下@PropertySource的源码如下: @T...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,716
精华内容 26,686
关键字:

自定义propertysource