91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用@PropertySource讀取配置文件

發布時間:2022-03-25 13:43:39 來源:億速云 閱讀:869 作者:iii 欄目:開發技術

本篇內容主要講解“如何使用@PropertySource讀取配置文件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何使用@PropertySource讀取配置文件”吧!

    @PropertySource讀取配置文件通過@Value參數注入

    有參數文件如下test.properties

    project.author=wpfc
    project.create_time=2018/3/29

    在系統中讀取對應的數據,并注入到屬性中

    @Configuration
    @ComponentScan("cn.edu.ntu")
    @PropertySource("classpath:test.properties")
    public class ElConfig {
     
        @Value("#{systemProperties['os.name']}")
        private String osName;
        
        //要想使用@Value 用${}占位符注入屬性,這個bean是必須的(PropertySourcesPlaceholderConfigurer),
        //這個就是占位bean,
        //另一種方式是不用value直接用Envirment變量直接getProperty('key')  
        @Value("${project.author}")
        public String author;
        
        @Autowired
        private Environment environment;
        
        //You need this if you use @PropertySource + @Value
        @Bean
        public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
           return new PropertySourcesPlaceholderConfigurer();
        }
        
        public void printProperties(){
            System.out.println("os name : " + osName);
            System.out.println("author  : " + author);
            System.out.println("env     : " + environment.getProperty("project.create_time"));
        }    
    }

    測試方法:

    public class MainApplication {
        public static void main(String[] args){
            AnnotationConfigApplicationContext context = null;
            context = new AnnotationConfigApplicationContext(ElConfig.class);
            ElConfig bean = context.getBean(ElConfig.class);
            bean.printProperties();
        }    
    }

    測試結果:

    os name : Windows 7author  : wpfcenv     : 2018/3/29

    • @Import引入javaConfig配置的配置類

    • @ImportResource引入xml對應的配置文件

    Spring讀取配置@Value、@PropertySource、@ConfigurationProperties使用

    Spring (Boot)獲取參數的方式有很多,其中最被我們熟知的為@Value了,它不可謂不強大。

    今天就針對我們平時最長使用的@Value,以及可能很少人使用的@PropertySource、@ConfigurationProperties等相關注解進行一個詳細的掃盲,希望能夠幫助到到家,使用起來更加順暢

    @Value

    @Value注解的注入非常強大,可以借助配置文件的注入、也可以直接注入

    注入普通字符串

        @Value("normal")
        private String normal; // normal (顯然這種注入的意義不大)

    注入操作系統屬性

    @Value("#{systemProperties['os.name']}")
        private String systemPropertiesName; 
    //效果等同于  是因為spring模版把系統變量否放進了Enviroment
    @Value("${os.name}")
        private String systemPropertiesName;

    注入表達式結果

    @Value("#{ T(java.lang.Math).random() * 100.0 }")
        private double randomNumber; //41.29185128620939

    注入其它Bean的屬性:Person類的name屬性

        @Bean
        public Person person() {
            Person person = new Person();
            person.setName("fangshixiang");
            return person;
        }
     
    //注入屬性
        @Value("#{person.name}")
        private String personName;
     
        @Test
        public void contextLoads() {
            System.out.println(personName); //fangshixiang
        }

    注入文件資源

    在resources下放置一個jdbc.properties配置文件。然后可以直接注入

        @Value("classpath:jdbc.properties")
        private Resource resourceFile; // 注入文件資源
     
        @Test
        public void contextLoads() throws IOException {
            System.out.println(resourceFile); //class path resource [jdbc.properties]
            String s = FileUtils.readFileToString(resourceFile.getFile(), StandardCharsets.UTF_8);
            System.out.println(s);
            //輸出:
            //db.username=fangshixiang
            //db.password=fang
            //db.url=jdbc:mysql://localhost:3306/mytest
            //db.driver-class-name=com.mysql.jdbc.Driver
        }

    注入Url資源

        @Value("http://www.baidu.com")
        private Resource testUrl; // 注入URL資源 
     
        @Test
        public void contextLoads() {
            System.out.println(testUrl); //URL [http://www.baidu.com]
        }
    @Value中$和#的區別

    語法:

    ${ properties }和#{ SpEL }的語法區別

    ${ property : default_value }

    #{ obj.property? : default_value } 表示SpEl表達式通常用來獲取bean的屬性,或者調用bean的某個方法。當然還有可以表示常量

    正常使用的情況,這里不做過多的介紹了,現在介紹一些異常情況

    ${ properties }`:這種比較簡單,如果key找不到,啟動會失敗。如果找不到的時候也希望正常啟動,可以采用冒號+默認值的方式

    #{ obj.property? : default_value }

        @Value("#{person}")
        private Person value;
     
        @Test
        public void contextLoads() {
            System.out.println(value); //Person(name=fangshixiang, age=null, addr=null, hobby=null)
        }

    我們發現這個很強大,可以直接把容器的里的一個對象直接注入進來。只是我們可能一般不這么做。

    如果改成person1,在容器里找不到這個bean,也是會啟動報錯的。@Value("#{person1?:null}")這樣也是不行的,因為person1找不到就會報錯  

        @Value("#{person.name}")
        private String personName;
     
        @Value("#{person.age}")
        private String perAge;
     
        //注入默認值
        @Value("#{person.age?:20}")
        private String perAgeDefault;
     
        //如果age22這個key根本就不存在,啟動肯定會報錯的
        //@Value("#{person.age22?:20}")
        //private String perAgeDefault22;
     
        @Test
        public void contextLoads() {
            System.out.println(personName); //fangshixiang
            System.out.println(perAge); //null
            System.out.println(perAgeDefault); //20
        }

    獲取級聯屬性,下面兩種方法都是ok的:

     
        @Value("#{person.parent.name}")
        private String parentName1;
     
        @Value("#{person['parent.name']}")
        private String parentName2;
     
        @Test
        public void contextLoads() {
            System.out.println(parentName1); //fangshixiang
            System.out.println(parentName2); //fangshixiang
        }

    二者結合使用:#{ ‘${}’ }

    注意結合使用的語法和單引號,不能倒過來。

    兩者結合使用,可以利用SpEL的特性,寫出一些較為復雜的表達式,如:

        @Value("#{'${os.name}' + '_' +  person.name}")
        private String age; 
     
        @Test
        public void contextLoads() {
            System.out.println(age); //Windows 10_fangshixiang
        }

    @PropertySource:加載配置屬性源

    此注解也是非常非常的強大,用好了,可以很好的實現配置文件的分離關注,大大提高開發的效率,實現集中化管理

    最簡單的應用,結合@Value注入屬性值(也是最常見的應用)

    通過@PropertySource把配置文件加載進來,然后使用@Value獲取

    @Configuration
    @PropertySource("classpath:jdbc.properties")
    public class PropertySourceConfig {
     
        @Value("${db.url}")
        private String dbUrl;
     
        @PostConstruct
        public void postConstruct() {
            System.out.println(dbUrl); //jdbc:mysql://localhost:3306/mytest
        }
    }

    @PropertySource各屬性介紹

    • value:數組。指定配置文件的位置。支持classpath:和file:等前綴 Spring發現是classpath開頭的,因此最終使用的是Resource的子類ClassPathResource。如果是file開頭的,則最終使用的類是FileSystemResource

    • ignoreResourceNotFound:默認值false。表示如果沒有找到文件就報錯,若改為true就不報錯。建議保留false

    • encoding:加載進來的編碼。一般不用設置,可以設置為UTF-8等等

    • factory:默認的值為DefaultPropertySourceFactory.class。

    	@Override
    	public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
    		return (name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource));
    	}

    源碼其實也沒什么特別的。其重難點在于:

    1、DefaultPropertySourceFactory什么時候被Spring加載呢?

    2、name和resource都是什么時候被賦值進來的?

    本文拋出這兩個問題,具體原因會在后續分析源碼的相關文章中有所體現。

    需要注意的是PropertySourceFactory的加載時機早于Spring Beans容器,因此實現上不能依賴于Spring的IOC。

    @PropertySource多環境配置以及表達式使用(spring.profiles.active)

    方法一:可以這么配置

    @PropertySource(“classpath:jdbc-${spring.profiles.active}.properties”)

    程序員在開發時不需要關心生產環境數據庫的地址、賬號等信息,一次構建即可在不同環境中運行

    @ConfigurationProperties

    注意:上面其實都是Spring Framwork提供的功能。而@ConfigurationProperties是Spring Boot提供的。包括@EnableConfigurationProperties也是Spring Boot才有的。它在自動化配置中起到了非常關鍵的作用

    ConfigurationPropertiesBindingPostProcessor會對標注@ConfigurationProperties注解的Bean進行屬性值的配置。

    有時候有這樣子的情景,我們想把配置文件的信息,讀取并自動封裝成實體類,這樣子,我們在代碼里面使用就輕松方便多了,這時候,我們就可以使用@ConfigurationProperties,它可以把同類的配置信息自動封裝成實體類

    該注解在Spring Boot的自動化配置中得到了大量的使用

    如SpringMVC的自動化配置:

    @ConfigurationProperties(prefix = "spring.mvc")
    public class WebMvcProperties {}
     
    //加載方式
    	@Configuration
    	@Conditional(DefaultDispatcherServletCondition.class)
    	@ConditionalOnClass(ServletRegistration.class)
    	// 此處采用這個注解,可議把WebMvcProperties這個Bean加載到容器里面去~~~
    	// WebMvcProperties里面使用了`@ConfigurationProperties(prefix = "spring.mvc")`
    	@EnableConfigurationProperties(WebMvcProperties.class) //加載MVC的配置文件
    	protected static class DispatcherServletConfiguration {}

    似乎我們能看出來一些該注解的使用方式。

    說明:這里說的兩種,只是說的最常用的。其實只要能往容器注入Bean,都是一種方式,比如上面的@EnableConfigurationProperties方式也是ok的

    關于@EnableConfigurationProperties的解釋,在注解驅動的Spring相關博文里會有體現

    加在類上,需要和@Component注解,結合使用.代碼如下

    com.example.demo.name=${aaa:hi}
    com.example.demo.age=11
    com.example.demo.address[0]=北京  # 注意數組 List的表示方式 Map/Obj的方式各位可以自行嘗試
    com.example.demo.address[1]=上海
    com.example.demo.address[2]=廣州
    com.example.demo.phone.number=1111111

    java代碼:

    @Component
    @ConfigurationProperties(prefix = "com.example.demo")
    public class People {
     
        private String name;
        private Integer age;
        private List<String> address;
        private Phone phone;
    }

    通過@Bean的方式進行聲明,這里我們加在啟動類即可,代碼如下

       @Bean
        @ConfigurationProperties(prefix = "com.example.demo")
        public People people() {
            return new People();
        }

    此些方式并不需要使用@EnableConfigurationProperties去開啟它。

    細節:Bean的字段必須有get/set方法,請注意~~~

    另外還有一種結合@PropertySource使用的方式,可謂完美搭配

    @Component
    @PropertySource("classpath:config/object.properties")
    @ConfigurationProperties(prefix = "obj")
    public class ObjectProperties {}

    其余屬性見名之意,這里一筆帶過:

    • ignoreInvalidFields

    • ignoreNestedProperties

    • ignoreUnknownFields

    如何使用@PropertySource讀取配置文件

    簡單理解:

    • @ConfigurationProperties 是將application配置文件的某類名下所有的屬性值,自動封裝到實體類中。

    • @Value 是將application配置文件中,所需要的某個屬性值,封裝到java代碼中以供使用。

    應用場景不同:

    如果只是某個業務中需要獲取配置文件中的某項值或者設置具體值,可以使用@Value;

    如果一個JavaBean中大量屬性值要和配置文件進行映射,可以使用@ConfigurationProperties;

    到此,相信大家對“如何使用@PropertySource讀取配置文件”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    定日县| 台安县| 舟山市| 天气| 裕民县| 拜城县| 黄梅县| 南康市| 赤城县| 勐海县| 六安市| 高邑县| 翁源县| 黎城县| 万山特区| 定远县| 井研县| 石家庄市| 梁山县| 莎车县| 建平县| 安阳市| 遵义县| 礼泉县| 昌江| 伊宁市| 融水| 金川县| 和田市| 开江县| 宿州市| 灵寿县| 苍溪县| 南召县| 富蕴县| 华容县| 迁西县| 修武县| 昭苏县| 闵行区| 马山县|