欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring注解之@PropertySource詳解

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

@PropertySource注解

定義/作用

@PropertySource注解用于指定資源文件讀取的位置,它不僅能讀取properties文件,也能讀取xml文件,并且通過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 {

    //通過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é)果:

在這里插入圖片描述

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

spring4.3之前

spring4.3之前,除了使用@PropertySource注解之外,還要手動(dòng)注冊一個(gè)資源文件解析器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之后,就可以直接使用,因?yàn)閟pring會使用默認(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)資源不存在時(shí),是否忽略,默認(rèn)不忽略,也就是會報(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對象
        Properties properties = factory.getObject();
        //返回。此時(shí)不能像默認(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)文章

最新評論