最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring注解之@PropertySource詳解

 更新時(shí)間:2023年11月23日 08:38:41   作者:我會(huì)努力變強(qiáng)的  
這篇文章主要介紹了Spring注解之@PropertySource詳解,@PropertySource注解用于指定資源文件讀取的位置,它不僅能讀取properties文件,也能讀取xml文件,并且通過(guò)YAML解析器,配合自定義PropertySourceFactory實(shí)現(xiàn)解析YAML文件,需要的朋友可以參考下

@PropertySource注解

定義/作用

@PropertySource注解用于指定資源文件讀取的位置,它不僅能讀取properties文件,也能讀取xml文件,并且通過(guò)YAML解析器,配合自定義PropertySourceFactory實(shí)現(xiàn)解析YAML文件。

源碼

//只能作用在類上
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(PropertySources.class)
public @interface PropertySource {

	/**
	 * 指定資源名稱,如果為空,就根據(jù)基礎(chǔ)資源的描述生成。
	 */
	String name() default "";

	/**
	 * 指定資源路徑。
	 * 可以是 classpath:/xxx/xxxx
	 * 也可以是 file:/xxx/xxx/xx
	 */
	String[] value();

	/**
	 * 是否忽略資源不存在的情況,如果不忽略,當(dāng)資源不存在時(shí)就報(bào)錯(cuò)。默認(rèn)不忽略。
	 * 此屬性時(shí)spring4.0以后出現(xiàn)的。
	 */
	boolean ignoreResourceNotFound() default false;

	/**
	 * 指定資源文件的編碼格式。如果不指定就使用文件默認(rèn)的。
	 * 此注解是spring4.3以后出現(xiàn)的。
	 */
	String encoding() default "";

	/**
	 * 指定資源工廠,如果不指定,就使用默認(rèn)的資源工廠。
	 */
	Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class;

}

使用方式:

此注解在spring4.3之前與spring4.3及之后使用的方式不一樣。

錯(cuò)誤demo:

//配置類
@Configuration
@ComponentScan(basePackages = "propertysourcedemo")
public class SpringConfig {

    //通過(guò)SPEL表達(dá)式注入屬性
    @Value("${druid.driverClassName}")
    private String driverClassName;

    @Value("${druid.url}")
    private String url;

    @Value("${druid.username}")
    private String username;

    @Value("${druid.password}")
    private String password;

    //注冊(cè)Druid數(shù)據(jù)源連接池
    @Bean
    public DruidDataSource druidDataSource(){
        System.out.println("driverClassName====> " + driverClassName);
        System.out.println("url====> " + url);
        System.out.println("username====> " + username);
        System.out.println("username====> " + username);
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
}


//測(cè)試類
public class PropertySourceDemoTest {

    private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

    @Test
    public void PropertySourceDemoTest() throws SQLException {
        //從容器中獲取數(shù)據(jù)源
        DruidDataSource druidDataSource = (DruidDataSource) context.getBean("druidDataSource");
        //獲取數(shù)據(jù)庫(kù)連接
        Connection connection = druidDataSource.getConnection();
        System.out.println(druidDataSource);
        System.out.println(connection);
        connection.close();
    }
}

文件:

在這里插入圖片描述

結(jié)果:

在這里插入圖片描述

原因: 因?yàn)闆](méi)有指定資源配置文件,所以spring不知道去哪找配置 文件進(jìn)行屬性注入,找不到,然后SPEL表達(dá)式就把屬性的key直接解析成字面量。

spring4.3之前

spring4.3之前,除了使用@PropertySource注解之外,還要手動(dòng)注冊(cè)一個(gè)資源文件解析器PropertySourcesPlaceholderConfigurer到IOC容器中。并且如果使用Bean注解注冊(cè)資源文件解析器,方法要是static方法。

@Configuration
@ComponentScan(basePackages = "propertysourcedemo")
@PropertySource(value = "classpath:daoconfig/datasource-config.properties")
public class SpringConfig {

    //通過(guò)SPEL表達(dá)式注入屬性
    @Value("${druid.driverClassName}")
    private String driverClassName;

    @Value("${druid.url}")
    private String url;

    @Value("${druid.username}")
    private String username;

    @Value("${druid.password}")
    private String password;

    //創(chuàng)建資源文件解析器,spring4.3之前必須要的,不要就無(wú)法解析。
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){
        return new PropertySourcesPlaceholderConfigurer();
    }

    //注冊(cè)Druid數(shù)據(jù)源連接池
    @Bean
    public DruidDataSource druidDataSource(){
        System.out.println("driverClassName====> " + driverClassName);
        System.out.println("url====> " + url);
        System.out.println("username====> " + username);
        System.out.println("username====> " + username);
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
}

//測(cè)試類不變

結(jié)果:

在這里插入圖片描述

如果把資源解析器去掉:

在這里插入圖片描述

沒(méi)有效果。

spring4.3及之后

4.3之后,就可以直接使用,因?yàn)閟pring會(huì)使用默認(rèn)的DefaultPropertySourceFactory解析。

@Configuration
@ComponentScan(basePackages = "propertysourcedemo")
//這次使用file協(xié)議的url路徑來(lái)解析
@PropertySource(value = "file:///D:/spring-high-level-study/src/main/resources/daoconfig/datasource-config.properties")
public class SpringConfig {

    //通過(guò)SPEL表達(dá)式注入屬性
    @Value("${druid.driverClassName}")
    private String driverClassName;

    @Value("${druid.url}")
    private String url;

    @Value("${druid.username}")
    private String username;

    @Value("${druid.password}")
    private String password;



    //注冊(cè)Druid數(shù)據(jù)源連接池
    @Bean
    public DruidDataSource druidDataSource(){
        System.out.println("driverClassName====> " + driverClassName);
        System.out.println("url====> " + url);
        System.out.println("username====> " + username);
        System.out.println("username====> " + username);
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
}


結(jié)果:

在這里插入圖片描述

讀取XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <entry key="druid.driverClassName">com.mysql.jdbc.Driver</entry>
    <entry key="druid.url">jdbc:mysql://127.0.0.1/db1?useUnicode=true&amp;characterEncoding=UTF-8</entry>
    <entry key="druid.username">root</entry>
    <entry key="druid.password">5201314..a</entry>

</properties>

把配置類的@PropertySource注解路徑修改成xml文件,也可以解析。

在這里插入圖片描述

boolean ignoreResourceNotFound() default false;

當(dāng)資源不存在時(shí),是否忽略,默認(rèn)不忽略,也就是會(huì)報(bào)錯(cuò)。

設(shè)置為false時(shí):

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [propertysourcedemo.config.SpringConfig]; nested exception is java.io.FileNotFoundException: D:\spring-high-level-study\src\main\resources\daoconfig\datasource-config1.xml (系統(tǒng)找不到指定的文件。)

設(shè)置為true忽略時(shí):

在這里插入圖片描述

與不配置該注解時(shí)一個(gè)樣。因?yàn)檎也坏街付ㄙY源文件后,spring也不知道去哪找資源文件了。

自定義PropertySourceFactory解析YAML文件:

PropertySourceFactory的默認(rèn)實(shí)現(xiàn)DefaultPropertySourceFactory是解析不了yaml文件的,如果要解析,就要自定義實(shí)現(xiàn)。

我們就不自己解析Yaml,直接引用第三方j(luò)ar包進(jìn)行解析。

 <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.23</version>
        </dependency>

代碼:

/**
 * @author YeHaocong
 * @decription 自定義Yaml解析工廠
 */

public class YAMLPropertySourceFactory implements PropertySourceFactory {
    @Override
    public org.springframework.core.env.PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) throws IOException {
        //創(chuàng)建一個(gè)YAML解析工廠。
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        //設(shè)置資源。
        factory.setResources(encodedResource.getResource());

        //獲取解析后的Properties對(duì)象
        Properties properties = factory.getObject();
        //返回。此時(shí)不能像默認(rèn)工廠那樣返回ResourcePropertySource對(duì)象 ,要返回他的父類PropertiesPropertySource對(duì)象。
        return name != null ? new PropertiesPropertySource(name, properties) :
                new PropertiesPropertySource(encodedResource.getResource().getFilename(),properties);
    }
}

//配置類:

@Configuration
@ComponentScan(basePackages = "propertysourcedemo")
//使用自定義工廠。
@PropertySource(value = "classpath:daoconfig/datasource-config.yaml",factory = YAMLPropertySourceFactory.class)
public class SpringConfig {

    //通過(guò)SPEL表達(dá)式注入屬性
    @Value("${druid.driverClassName}")
    private String driverClassName;

    @Value("${druid.url}")
    private String url;

    @Value("${druid.username}")
    private String username;

    @Value("${druid.password}")
    private String password;



    //注冊(cè)Druid數(shù)據(jù)源連接池
    @Bean
    public DruidDataSource druidDataSource(){
        System.out.println("driverClassName====> " + driverClassName);
        System.out.println("url====> " + url);
        System.out.println("username====> " + username);
        System.out.println("password====> " + password);
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
}

結(jié)果:

在這里插入圖片描述

到此這篇關(guān)于Spring注解之@PropertySource詳解的文章就介紹到這了,更多相關(guān)@PropertySource詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 分割字符串詳解及實(shí)例代碼

    Java 分割字符串詳解及實(shí)例代碼

    這篇文章主要介紹了 Java 分割字符串詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Java中Queue的poll()和remove()區(qū)別詳解

    Java中Queue的poll()和remove()區(qū)別詳解

    這篇文章主要介紹了Java中Queue的poll()和remove()區(qū)別詳解,Queue接口提供了許多方法,其中poll()和remove()是兩個(gè)常用的方法,它們的區(qū)別在于,當(dāng)隊(duì)列為空時(shí),poll()方法返回null,而remove()方法會(huì)拋出,需要的朋友可以參考下
    2023-07-07
  • java日期操作工具類(獲取指定日期、日期轉(zhuǎn)換、相隔天數(shù))

    java日期操作工具類(獲取指定日期、日期轉(zhuǎn)換、相隔天數(shù))

    這篇文章主要為大家詳細(xì)介紹了java日期操作工具類,包括獲取指定日期、日期轉(zhuǎn)換、相隔天數(shù)等操作,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java項(xiàng)目實(shí)現(xiàn)五子棋小游戲

    Java項(xiàng)目實(shí)現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了Java項(xiàng)目實(shí)現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Mybatis-plus配置分頁(yè)插件返回統(tǒng)一結(jié)果集

    Mybatis-plus配置分頁(yè)插件返回統(tǒng)一結(jié)果集

    本文主要介紹了Mybatis-plus配置分頁(yè)插件返回統(tǒng)一結(jié)果集,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java實(shí)現(xiàn)經(jīng)典游戲超級(jí)瑪麗的示例代碼

    Java實(shí)現(xiàn)經(jīng)典游戲超級(jí)瑪麗的示例代碼

    在你的童年記憶里,是否有一個(gè)蹦跳、頂蘑菇的小人?本文將用java語(yǔ)言實(shí)現(xiàn)經(jīng)典游戲《超級(jí)瑪麗》,文中采用了swing技術(shù)進(jìn)行了界面化處理,需要的可以參考一下
    2022-02-02
  • 高內(nèi)聚低耦合法則實(shí)例解析

    高內(nèi)聚低耦合法則實(shí)例解析

    這篇文章主要介紹了高內(nèi)聚低耦合法則實(shí)例代碼解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 淺談java定時(shí)器的發(fā)展歷程

    淺談java定時(shí)器的發(fā)展歷程

    這篇文章主要介紹了淺談java定時(shí)器的發(fā)展歷程,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • maven打包失敗踩坑的解決方式詳解

    maven打包失敗踩坑的解決方式詳解

    最近因?yàn)樾马?xiàng)目有很多自定義的jar包,而且占內(nèi)存很多,就直接拷貝過(guò)來(lái),新開(kāi)了一個(gè)maven倉(cāng)庫(kù),用的時(shí)候沒(méi)有問(wèn)題,但是打包一直編譯不通過(guò),下面這篇文章主要給大家介紹了關(guān)于maven打包失敗踩坑的解決方式,需要的朋友可以參考下
    2023-05-05
  • JAVA提高第十篇 ArrayList深入分析

    JAVA提高第十篇 ArrayList深入分析

    這篇文章主要深入分析了JAVA提高第十篇ArrayList的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論

衡水市| 江津市| 内黄县| 喀什市| 遵义县| 大荔县| 西乡县| 马鞍山市| 三穗县| 广州市| 利津县| 玉树县| 博罗县| 玉树县| 乡城县| 横山县| 两当县| 永城市| 土默特左旗| 平定县| 乐昌市| 平利县| 得荣县| 高密市| 深圳市| 德清县| 兖州市| 光山县| 枣阳市| 临潭县| 天柱县| 英德市| 漳平市| 长宁区| 陈巴尔虎旗| 改则县| 图木舒克市| 南部县| 赣榆县| 墨竹工卡县| 上高县|