Maison  >  Article  >  Java  >  Quelles sont les méthodes permettant à SpringBoot de lire les fichiers de configuration Yml ?

Quelles sont les méthodes permettant à SpringBoot de lire les fichiers de configuration Yml ?

WBOY
WBOYavant
2023-06-02 22:20:061835parcourir

1. Utilisation de base, utilisez l'annotation @Autowired pour injecter la classe Environment

Cette méthode est plus courante, tout comme l'injection de service ou de dao, déclarez une variable de classe Environment et ajoutez le @Autowire annotation. Comme suit :

import org.springframework.core.env.Environment;
 
@Autowired
private Environment environment;

La méthode d'utilisation consiste à lire les informations dans le fichier de configuration via la méthode getProperty(key) Le code est le suivant :

1). Configuration dans Yml

heycloud:
  jobInfo: http://www.baidu.com

2). Obtenir la configuration

//获取url(注意:key一定要写完整,有几层就写几层,每层的名字用点分隔。)
String resultUrl = environment.getProperty("heycloud.jobInfo");

Remarque : Cette méthode de lecture des informations de configuration présente certaines limites, notamment les suivantes :

Limitation 1 : #🎜🎜 #

Si vous souhaitez lire les informations de configuration dans une méthode statique, vous ne pouvez pas simplement définir Environment comme statique. En raison du mécanisme d'injection, l'injection d'un bean statique ne donnera qu'un bean vide, c'est-à-dire. Autrement dit, la valeur de la variable est null , une fois l'objet bean utilisé, une exception de pointeur null sera signalée.

Manière d'écriture incorrecte :

@Autowired
    private static Environment environment;//这是错误写法,environment只会是null
    public void test(){
        //获取url
        String resultUrl = environment.getProperty("heycloud.jobInfo");//一旦使用environment变量就会报空指针异常    
    }

Manière d'écriture correcte :

1. Définir l'environnement comme statique ; 2. Ajoutez Go à la méthode getter/setter de l'environnement

3 Ajoutez l'annotation @Autowire à la méthode set.

De cette façon, il peut être injecté efficacement. Il convient de noter que seule la méthode get doit être statique, et la méthode set n'a pas besoin d'être statique, sinon l'environnement obtenu le sera toujours. nul.

Le code correct est le suivant :

    private static Environment environment;
 
    @Autowired
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }
 
    public static Environment getEnvironment() {
        return environment;
    }

Limitation 2 :

L'environnement ne peut pas lire directement le fichier de configuration Yml personnalisé, vous devez ajouter un classe de configuration, exposez le fichier Yml personnalisé à l'environnement Spring.

Solution :

Définissez une classe de configuration pour charger le contenu du fichier Yml personnalisé dans l'environnement Le code est le suivant :

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
 
/**
 * 配置类
 * @Description 读取自定义Yml格式配置文件
 * @Date 2021/3/15 10:40
 * @Created by LSH
 */
@Component
public class SqlConfig {
    @Bean
    public PropertySourcesPlaceholderConfigurer getSqlConfigurer() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean sqlConfigBean = new YamlPropertiesFactoryBean();
        sqlConfigBean.setResources(new ClassPathResource("sql-properties.yml"));
        configurer.setProperties(sqlConfigBean.getObject());
        return configurer;
    }
}

Une fois défini If. vous disposez d'une bonne classe de configuration, vous pouvez utiliser l'annotation @Autowired pour injecter la classe Environment afin d'obtenir des informations de configuration personnalisées. Bref, si vous rencontrez le problème de la limitation 2, il vous suffit d'écrire une classe de configuration supplémentaire.

Limitation 3 :

En raison de l'ordre de chargement, la méthode d'utilisation des annotations n'est pas adaptée à la lecture de configurations dans des blocs de code statiques (static{}), même si des limitations sont La solution 1 utilisée ne fonctionne pas non plus. Je n'ai pas encore trouvé de solution. J'apprécie les conseils d'experts de passage.

En fait, vous pouvez également charger manuellement la classe dans le bloc statique et charger la configuration en lisant le chemin du fichier Yml, mais ce n'est pas assez concis si plusieurs classes ont cette exigence, chacune. la classe doit en écrire une. Les classes sont chargées sur le tas, donc je ne suis pas entré dans les détails. Cependant, il existe plusieurs façons de lire le fichier de configuration et il n'est pas nécessaire d'identifier une arborescence spécifique.

2. Utilisation de base, utilisez l'annotation @Value pour injecter directement les informations de configuration

La méthode d'utilisation est très simple, déclarez les attributs des membres de la classe et utilisez l'annotation @Value pour mettre directement informations de configuration dans le membre. Dans l'attribut, le format est : @Value("${xxx.xxx.xxx}").

Le code est le suivant :

    @Value("${sql.newrest.CAS_GRID}")
    private String CAS_GRID;

Remarque :

1 Identique à la première méthode, la clé doit être écrite complètement. autant de calques qu'il y a de calques, chacun séparé par des points.

2. Cette méthode présente les mêmes limitations que la première méthode.

3. Méthode avancée

Définissez une classe d'outils, annotez-la avec @Component pour devenir une classe de configuration, puis héritez d'ApplicationRunner, réécrivez run(), puis injectez l'environnement classe pour obtenir la configuration. Les informations de configuration peuvent être obtenues n’importe où et à tout moment.

Le code est le suivant :

1). Définissez la classe de configuration et déclarez quelques propriétés statiques pour recevoir les informations de configuration

@Slf4j
@Component
public class BaseConfig implements ApplicationRunner {
    @Autowired
    private Environment environment;
    
    public static String pro1;
    public static String pro2;
    public static String pro3;
  
    @Override
    public void run(ApplicationArguments args){
        pro1=environment.getProperty("pro1");
        pro2=environment.getProperty("pro2");
        pro3=environment.getProperty("pro3");
    }
}

2). Méthode d'utilisation

Les informations de configuration peuvent être obtenues directement en appelant les propriétés statiques de la classe de configuration. Elles ne se limitent pas aux méthodes conventionnelles, aux méthodes statiques et aux blocs de code statiques. une classe de configuration pour obtenir indirectement les informations de configuration.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer