Notas de estudio de SpringBoot (tres): archivo de configuración de SpringBoot (2)

1. @PropertySource, @ImportResource y @Bean

1 、 @ PropertySource

Rol: carga el archivo de configuración especificado.

En el caso de la lección anterior, usamos @Value y @ConfigurationProperties para obtener valores del archivo de configuración global application.properties o application.yaml, y luego asignamos valores a las propiedades de la clase de entidad. Sin embargo, cuando la aplicación es relativamente grande, si todo el contenido está en el mismo archivo de configuración, estará inflado y no será fácil de entender y mantener. En este momento, un archivo se puede dividir en varios y este Los archivos de configuración que están divididos pueden usar @PropertySource para especificar el archivo de configuración que se cargará.

Siguiendo el caso de la lección anterior, extraemos la información sobre las propiedades del Profesor en application.properties, creamos un nuevo teacher.properties en el directorio de recursos y luego especificamos el archivo de configuración teacher.properties que debe cargarse a través de @PropertySource. como sigue:

propiedades.del.profesor:

teacher.name=李四yaml
teacher.age=30
teacher.birth=1991/04/12
[email protected]
teacher.professor=false
teacher.book-list=1,2,3,4,5
teacher.score-map.a=Apple
teacher.score-map.b=Bar
teacher.score-map.c=car
teacher.student.name=小王
teacher.student.address=福建

En este momento, la clase del maestro está escrita de la siguiente manera:

@PropertySource("classpath:teacher.properties")
@Component
@ConfigurationProperties(prefix = "teacher")
public class Teacher {
    private String name;
    private Integer age;
    private Date birth;
    private String email;
    private Boolean isProfessor;
    private List<String> bookList;
    private Map<Object, Object> scoreMap;
    private Student student;

    //省略get和set方法

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", birth=" + birth +
                ", email='" + email + '\'' +
                ", isProfessor=" + isProfessor +
                ", bookList=" + bookList +
                ", scoreMap=" + scoreMap +
                ", student=" + student +
                '}';
    }
}

Por el contrario, si el tipo de archivo definido es yaml, entonces @PropertySource y @Value deben usarse en combinación para iniciar la inyección del valor de la propiedad. Si no se usa @Value, el valor obtenido es nulo. Y no es que el yaml y las propiedades que se utilizan en algunos blogs sean los mismos. como sigue:

teacher.yaml:

teacher:
  name: tomyaml
  age: 36
  birth: 1981/09/21
  email: [email protected]
  professor: false
  bookList:
    - 三国演义
    - 水浒传
    - 红楼梦
    - 西游记
  scoreMap: {语文: 95, 数学: 87, 英语: 82}
  student:
    name: 刘菲
    address: 浙江

 En este momento, la clase del maestro está escrita de la siguiente manera:

package com.yht.entity;

import org.hibernate.validator.constraints.Email;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @ConfigurationProperties: 本类中的所有属性都和配置文件中的值进行绑定
 */
@PropertySource("classpath:teacher.yaml")
@Component
@ConfigurationProperties(prefix = "teacher")
public class Teacher {
    @Value("${name}")
    private String name;
    @Value("${age}")
    private Integer age;
    @Value("${birth}")
    private Date birth;
    @Value("${email}")
    private String email;
    @Value("${professor}")
    private Boolean isProfessor;
    @Value("${bookList}")
    private List<String> bookList;
    @Value("${scoreMap}")
    private Map<Object, Object> scoreMap;
    @Value("${student}")
    private Student student;

      //省略get和set方法

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", birth=" + birth +
                ", email='" + email + '\'' +
                ", isProfessor=" + isProfessor +
                ", bookList=" + bookList +
                ", scoreMap=" + scoreMap +
                ", student=" + student +
                '}';
    }
}

2 、 @ ImportResource

Función: se utiliza para importar el archivo de configuración de Spring para que el contenido del archivo de configuración sea efectivo.

No hay un archivo de configuración de Spring en SpringBoot, y para esos archivos de configuración que escribimos, no podemos reconocerlos automáticamente. Si desea que el archivo de configuración de Spring entre en vigencia en este momento, puede marcar @ImportResource en una clase de configuración para cargar el archivo de configuración de Spring en el contenedor.

(1) Cree UserSerivce en el paquete de servicio.

public class UserService {
}

(2) Cree bean.xml en el directorio de recursos e inyecte userService.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="userService" class="com.yht.service.UserService">

  </bean>
</beans>

(3) Importe bean.xml a través de @ImportResource.

@ImportResource(locations = {"classpath:bean.xml"})
@SpringBootApplication
public class HelloApplication {
    public static void main( String[] args ) {
        SpringApplication.run(HelloApplication.class);
    }
}

(4) Realice la prueba y obtenga el resultado: verdadero.

@SpringBootTest(classes = HelloApplication.class)
@RunWith(SpringRunner.class)
public class PropertiesTest {
    @Autowired
    ApplicationContext ioc;

    @Test
    public void testUserService(){
        System.out.println(ioc.containsBean("userService"));
    }
}

 Nota: El paquete de la guía ApplicationCotenxt debe ser correcto (import org.springframework.context.ApplicationContext).

3 、 @ frijol

Rol: agregar componentes al contenedor para agregar componentes al contenedor

El método anterior ciertamente puede introducir bean.xml, pero SpringBoot recomienda el método de anotación completo, aquí debe configurar la anotación de clase y @Bean juntos.

(1) Agregue la anotación @Service a la clase UserService.

@Service
public class UserService {
}

(2) Cree una clase de configuración.

@Configuration
public class MyConfig {

    //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
    @Bean
    public UserService getInstance(){
        return new UserService();
    }
}

(3) Realice la prueba y obtenga el resultado: verdadero.

Dos, el marcador de posición del archivo de configuración

1. Número aleatorio

${random.value},${random.int},${random.long},${random.int(10)},${random.int(1024,65536)}

2. Obtenga el valor configurado / especifique el valor predeterminado

teacher.name=tom
teacher.student.name=${person.name: jerry}_dog

3. Caso

(1) archivo application.properties

#num为随机数
person.num=${random.int(10)}
#name1为tom,name2未指定
person.name1=tom
#student1是tom的学生
person.student1.name=${person.name1}_student
#student2是name2的学生,如果name2的值未指定,则默认值为jerry
person.student2.name=${person.name2: Jerry}_student

(2) Cree clases de entidad Persona y Estudiante.

Persona:

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private Integer num;
    private String name1;
    private String name2;
    private Student student1;
    private Student student2;
    //省略get和set以及toString

}

Estudiante:

public class Student {
    private String name;
    private String address;
//省略get和set以及toString
    
}

(3) Prueba.

@SpringBootTest(classes = HelloApplication.class)
@RunWith(SpringRunner.class)
public class PersonTest {
    Person person;
    @Test
    public void testPerson(){
        System.out.println(person);
    }
   
}

Tres, múltiples archivos de perfil de SpringBoot

Generalmente, todo el proyecto debe probarse en diferentes situaciones, desde el desarrollo y las pruebas hasta el lanzamiento, lo que requiere múltiples modificaciones del archivo de configuración. Por ejemplo, la IP de la base de datos conectada al entorno de desarrollo es diferente del entorno de prueba y producción; la versión de la aplicación desarrollada por el entorno de desarrollo es diferente de la información de la versión de la aplicación en la línea de prueba y producción. En la introducción anterior, aunque application.properties (o yml) se usa como el archivo de configuración global de todo el proyecto en springboot, los entornos de producción y prueba suelen ser algo diferentes de la configuración del entorno de desarrollo. En este momento, necesita para usar el perfil, y puede extraer la información de configuración en application.yml a otros archivos. Cuando nuestro proyecto es cada vez más grande, hay demasiada información de configuración del proyecto y el archivo de configuración application.yml será más grande. En este momento, podemos extraer cierta información de configuración de application.yml en un archivo separado definiendo un perfil . Por ejemplo, cree el siguiente archivo:
    application-devFtp.yml Solo almacena la información de configuración relacionada con el entorno de desarrollo ftp
    application-devRedis.yml Solo almacena la información de configuración relacionada con el entorno de desarrollo redis
    application-testFtp.yml Solo almacena la configuración información relacionada con el entorno de prueba ftp
    application-testRedis .yml solo almacena la información de configuración relacionada con el entorno de prueba redis.
Luego, en application.yml, cambie el entorno de desarrollo y configure spring.profiles.active = dev, devFtp, devRedis para introducir el configuración de dev, devFtp y devRedis. Para cambiar el entorno de prueba, solo necesita introducir la configuración de test, testFtp y testRedis configurando spring.profiles.active = test, testFtp, testRedis.

Además, yml admite varios bloques de documentos para crear varios entornos. Utiliza --- (tres-) para representar un bloque de documentos. Si no especifica que se inicie otro bloque de documentos, el primer bloque de documentos se inicia de forma predeterminada, que puede pasar a través de spring.profiles .actice = dev para especificar que se inicien otros bloques de documentos , de la siguiente manera:

server:
  port: 8081
spring:
  profiles:
    active: dev
---
server:
  port: 8082
spring:
  profiles: dev

---
server:
  port: 8083
spring:
  profiles: produce

---
server:
  port: 8084
spring:
  profiles: test

El diagrama es el siguiente: 

Además de especificar el entorno de inicio a través de active en el archivo yaml, hay varias otras formas:

(1) Especifique los parámetros en las configuraciones de ejecución de la idea del editor y eclipse --spring.profiles.active = dev

(2) Línea de comando:

Java -jar spring-boot.jar --spring.profiles.active = test; // El comando que se ejecutará en la línea de comando cmd después del proyecto empaquetado se puede configurar directamente durante la prueba, y los parámetros de la línea de comando entrante pueden ser configurado

(3) Uso de parámetros de máquina virtual:

   -Dspring.profiles.active = dev Nota: -D es una redacción fija

Cuarto, la ubicación de carga del archivo de configuración de SpringBoot

El inicio de Spring Boot escaneará el archivo application.properties o application.yml en la siguiente ubicación como el archivo de configuración predeterminado para Spring Boot

  •   –Archivo: ./ config /
  •   -expediente:./
  •   –Classpath: / config /
  •   –Classpath: /

Lo anterior está en el orden de prioridad de mayor a menor, los archivos en todas las ubicaciones se cargarán y el contenido de configuración de alta prioridad sobrescribirá el contenido de configuración de baja prioridad.

como sigue:

SpringBoot cargará el archivo de configuración principal desde estas cuatro ubicaciones.Si las propiedades del archivo de configuración de alta prioridad y el archivo de configuración de baja prioridad no entran en conflicto, coexistirán: configuración complementaria. Por ejemplo: agregamos la configuración (ruta de acceso del proyecto) en application.properties en el directorio de recursos de la siguiente manera:

server.context-path = / springboot

En este punto, iniciamos el programa e ingresamos http: // localhost: 8084 / springboot / hello en la barra de direcciones del navegador para obtener el resultado de retorno de la página de la siguiente manera:

Aunque no hay una ruta de acceso al proyecto de configuración en el archivo application.properties en la carpeta de configuración del proyecto, todavía se forma una configuración complementaria. 

Además, también podemos cambiar la ubicación del archivo de configuración predeterminado a través de spring.config.location. Cuando el proyecto busca un buen paquete, se puede utilizar en forma de parámetros de línea de comandos al iniciar un proyecto para especificar la nueva ubicación del archivo de configuración, que especifica el archivo de configuración predeterminado y reconoce que estos archivos de configuración cargados trabajan juntos para formar un configuración complementaria. Por ejemplo: cree un archivo application.properties en el directorio de la unidad D y defina el puerto como 8085. El funcionamiento es el siguiente:

(1) Empaquete el proyecto e inicie la línea de comando: java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --spring.config.location = D: /application.properties.

(2) Ingrese http: // localhost: 8085 / springboot / hello en la barra de direcciones del navegador, y el resultado de retorno de la página es el siguiente:

Cinco, secuencia de carga de configuración externa

SpringBoot también puede cargar la configuración desde las siguientes ubicaciones: prioridad de alta a baja; la configuración de alta prioridad anula la configuración de baja prioridad, y todas las configuraciones formarán configuraciones complementarias.

1. Parámetros de la línea de comandos

  • Todas las configuraciones se pueden especificar en la línea de comando;
  • Las configuraciones múltiples están separadas por espacios; -elemento de configuración = valor

  java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port = 8087 --server.context-path = / abc

2. Atributos JNDI de java: comp / env 

3. Propiedades del sistema Java (System.getProperties ()) 

4. Variables de entorno del sistema operativo 

5. Valor de propiedad aleatorio. * Configurado por RandomValuePropertySource

6. Archivo de configuración de Application- {profile} .properties o application.yml (con spring.profile) fuera del paquete jar

7. Archivo de configuración Application- {profile} .properties o application.yml (con spring.profile) dentro del paquete jar

8. Archivo de configuración Application.properties o application.yml (sin spring.profile) fuera del paquete jar

9. Archivo de configuración Application.properties o application.yml (sin spring.profile) dentro del paquete jar

10. @PropertySource en la clase de anotación @Configuration 

11. Las propiedades predeterminadas especificadas por SpringApplication.setDefaultProperties

 Para obtener más información, consulte este sitio web: https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config

Supongo que te gusta

Origin blog.csdn.net/weixin_47382783/article/details/114107809
Recomendado
Clasificación