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

Spring注解之@PropertySource詳解

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

@PropertySource注解

定義/作用

@PropertySource注解用于指定資源文件讀取的位置,它不僅能讀取properties文件,也能讀取xml文件,并且通過YAML解析器,配合自定義PropertySourceFactory實現(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)資源不存在時就報錯。默認(rèn)不忽略。
	 * 此屬性時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及之后使用的方式不一樣。

錯誤demo:

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

    //通過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;

    //注冊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;
    }
}


//測試類
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ù)庫連接
        Connection connection = druidDataSource.getConnection();
        System.out.println(druidDataSource);
        System.out.println(connection);
        connection.close();
    }
}

文件:

在這里插入圖片描述

結(jié)果:

在這里插入圖片描述

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

spring4.3之前

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

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

    //通過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之前必須要的,不要就無法解析。
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){
        return new PropertySourcesPlaceholderConfigurer();
    }

    //注冊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é)果:

在這里插入圖片描述

如果把資源解析器去掉:

在這里插入圖片描述

沒有效果。

spring4.3及之后

4.3之后,就可以直接使用,因為spring會使用默認(rèn)的DefaultPropertySourceFactory解析。

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

    //通過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;



    //注冊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)資源不存在時,是否忽略,默認(rèn)不忽略,也就是會報錯。

設(shè)置為false時:

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忽略時:

在這里插入圖片描述

與不配置該注解時一個樣。因為找不到指定資源文件后,spring也不知道去哪找資源文件了。

自定義PropertySourceFactory解析YAML文件:

PropertySourceFactory的默認(rèn)實現(xiàn)DefaultPropertySourceFactory是解析不了yaml文件的,如果要解析,就要自定義實現(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)建一個YAML解析工廠。
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        //設(shè)置資源。
        factory.setResources(encodedResource.getResource());

        //獲取解析后的Properties對象
        Properties properties = factory.getObject();
        //返回。此時不能像默認(rèn)工廠那樣返回ResourcePropertySource對象 ,要返回他的父類PropertiesPropertySource對象。
        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 {

    //通過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;



    //注冊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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 分割字符串詳解及實例代碼

    Java 分割字符串詳解及實例代碼

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    JAVA提高第十篇 ArrayList深入分析

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

最新評論

娱乐| 元阳县| 铁岭县| 中卫市| 泰顺县| 康平县| 舒城县| 固始县| 许昌市| 和林格尔县| 中卫市| 梓潼县| 海丰县| 五大连池市| 沐川县| 临朐县| 营口市| 昭平县| 安陆市| 那坡县| 华容县| 新绛县| 福海县| 高唐县| 高雄市| 诸暨市| 麻江县| 遵化市| 广昌县| 隆子县| 广东省| 股票| 芦溪县| 元谋县| 延寿县| 江油市| 青龙| 淮北市| 灵宝市| 汉寿县| 钟山县|