Saltar a contenido

135. Introducción a Spring boot

Framework para el desarrollo de aplicaciones en Java , back-end y front-end. Spring Boot ofrece una forma rápida de configurar un proyecto con una estructura predefinida, gestionando automáticamente las dependencias y permitiendo la incorporación de múltiples módulos y tecnologías a través de su sistema de starters. Está diseñado para acelerar el ciclo de desarrollo, reduciendo la cantidad de código de configuración necesario y facilitando el despliegue de la aplicación.

Características * Creación de apicaciones stand-alone * No se necesitan WAR files al tener incluido Tomcat, Jetty o Undertow * Provide opinionated 'starter' dependencies to simplify your build configuration

  • Automatically configure Spring and 3rd party libraries whenever possible

  • Provide production-ready features such as metrics, health checks, and externalized configuration

  • Absolutely no code generation and no requirement for XML configuration

135.1 Instalación

Como extensión de Eclipse (en tienda) o bien usando un eclipse adaptado: "Spring Boot Suite tools 4"

135.2 Contenedor de IoC

En el core. El contenedor de IoC se basa en dos paquetes: * org.springfrawork.beans * org.springfrawork.context

135.2.1 org.springframework.beans

135.2.1.1 Clases Principales

  • BeanWrapper
    Proporciona operaciones para manipular propiedades de un objeto Java Bean.

  • PropertyEditorRegistry
    Define métodos para registrar PropertyEditors.

  • BeansException
    Excepción raíz para todas las excepciones relacionadas con el manejo de beans en Spring.

135.2.1.2 Interfaces

  • BeanFactory
    Fábrica de beans principal que permite la creación y recuperación de beans.

  • InitializingBean
    Interface para beans que requieren inicialización después de la configuración de propiedades.

  • DisposableBean
    Interface para beans que requieren acciones de limpieza al cerrar el contexto.

  • FactoryBean
    Permite la creación de beans complejos que son el resultado de la lógica personalizada.

135.2.1.3 Excepciones

  • BeanCreationException
    Lanzada cuando un bean no puede ser creado.

  • BeanInitializationException
    Lanzada cuando un bean se inicializa de manera incorrecta.

  • NoSuchBeanDefinitionException
    Lanzada cuando no se encuentra un bean solicitado.

135.2.2 org.springframework.context

135.2.2.1 Clases Principales

  • ApplicationContext
    Extiende BeanFactory y provee funcionalidades adicionales como internacionalización y eventos.

  • ApplicationEvent
    Clase base para los eventos de aplicación en un contexto de Spring.

  • MessageSource
    Interfaz para resolver mensajes en aplicaciones, con soporte para internacionalización.

135.2.2.2 Interfaces

  • ApplicationListener
    Interface para recibir eventos de aplicación.

  • ApplicationContextAware
    Interface para objetos que requieren acceso al ApplicationContext.

  • ApplicationEventPublisher
    Interface para publicar eventos de aplicación.

  • Lifecycle
    Interface para componentes que tienen un ciclo de vida con métodos start y stop.

135.2.2.3 Excepciones

  • ApplicationContextException
    Excepción lanzada para problemas relacionados con el ApplicationContext.

  • ApplicationEventMulticaster
    Interface para multicasters de eventos de aplicación.

135.2.2.4 Anotaciones

  • @ComponentScan
    Configura la búsqueda de componentes de Spring en paquetes específicos.

  • @Scope
    Define el ámbito de un bean dentro del contexto.

135.3 Interfaz BeanFactory

classDiagram class BeanFactory { <> +Object getBean(String name) +Object getBean(String name, Class requiredType) +boolean containsBean(String name) +boolean isSingleton(String name) +boolean isPrototype(String name) } class ApplicationContext { <> +String getId() +String getApplicationName() +String getDisplayName() +long getStartupDate() } class ConfigurableApplicationContext { <> +void refresh() +void close() } class WebApplicationContext { <> +String getNamespace() +ServletContext getServletContext() } ApplicationContext --|> BeanFactory ConfigurableApplicationContext --|> ApplicationContext WebApplicationContext --|> ConfigurableApplicationContext

135.4 Beans

Cualquier objeto gestionado por el contenedor de IoC y declarado mediante metadatos

136. Uso del contenedor de IoC

  • Usamos la clase org.springframeword.ApplicationContext
  • Configurado con
  • XML
  • Anotaciones
  • Java

Con el código:

public class MiAplicacion {

     public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // Uso de beans definidos en applicationContext.xml

        MiBean miBean = context.getBean("miBean", MiBean.class);
        miBean.hacerAlgo();

        context.close()
    }

}

136.1 Spring JDBC

Uso directo del módulo Spring JDBC

Este tutorial

Las clase se organizan en cuatro paquetes:
* core * datasource * object * support

136.1.1 Configuración

Usando mysql

@Configuration
@ComponentScan("com.baeldung.jdbc") <<-----
public class SpringJdbcConfig {
    @Bean
    public DataSource mysqlDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc");
        dataSource.setUsername("guest_user");
        dataSource.setPassword("guest_password");

        return dataSource;
    }
}

136.1.2 JdbcTemplate para ejecutar queries

Cone esta clase podemos:
* Crear y cerrar conexiones * Ejecutar sentencias y guardar procedure calls * Iterar sobre ResultSet y devolver resultados

Ejemplo de insert

public int addEmplyee(int id) {
    return jdbcTemplate.update(
      "INSERT INTO EMPLOYEE VALUES (?, ?, ?, ?)", id, "Bill", "Gates", "USA");
}

136.1.3 Queries con parámetros nombrados

136.1.4 Mapeo de resultados de queries a objetos

Para ello implementamos el interfaz RowMapper*

public class EmployeeRowMapper implements RowMapper<Employee> {
    @Override
    public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
        Employee employee = new Employee();

        employee.setId(rs.getInt("ID"));
        employee.setFirstName(rs.getString("FIRST_NAME"));
        employee.setLastName(rs.getString("LAST_NAME"));
        employee.setAddress(rs.getString("ADDRESS"));

        return employee;
    }
}
Seguidamente podemos pasar el row mapper al query api:

String query = "SELECT * FROM EMPLOYEE WHERE ID = ?";
Employee employee = jdbcTemplate.queryForObject(
  query, new Object[] { id }, new EmployeeRowMapper());

136.2 Guía rápida

  1. Iniciar proyecto con eclipse (tipo Spring Boot ) o usando la web online start.spring.io
  2. Añadir un código básico:

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {
    public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
    }
    @GetMapping("/hello")
    public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
      return String.format("Hello %s!", name);
    }
}
3. ejecutar. Desde eclipse como aplicación Spring boot. o con Maven

136.3 Tutorial: Primera aplicación

https://spring.io/guides/gs/spring-boot/

136.4 Tutorial: Aplicación Restfull Web Service

https://spring.io/guides/gs/rest-service/

136.5 Tutorial full-stack de freecodecap

En esta página local

136.6 Arquitectura de Spring. Ecosistema Spring

esquema

136.7 Proyectos en el Ecosistema de Spring

  • Core Container
  • Spring Framework: El núcleo de toda la tecnología Spring, proporciona el contenedor de IoC (Inversión de Control).

  • Desarrollo Web

  • Spring MVC: Proporciona el modelo-vista-controlador (MVC) para aplicaciones web.
  • Spring WebFlux: Alternativa reactiva a Spring MVC para manejar flujos asincrónicos de datos.

  • Acceso a Datos

  • Spring Data: Simplifica el acceso a datos y proporciona soporte para diferentes fuentes de datos como JPA, MongoDB, Elasticsearch, etc.
  • Spring Data REST: Expone los repositorios de Spring Data como servicios REST.
  • Spring JDBC: Proporciona un acceso más sencillo y menos propenso a errores a las bases de datos a través de JDBC.

  • Seguridad

  • Spring Security: Proporciona funcionalidades de autenticación y autorización.

  • Microservicios

  • Spring Boot: Facilita la creación de aplicaciones autoconfigurables y listas para producción.
  • Spring Cloud: Proporciona herramientas para desarrollar aplicaciones de microservicios.

  • Integración y Batch

  • Spring Integration: Proporciona capacidades de integración de sistemas, siguiendo los patrones de integración empresarial (EIP).
  • Spring Batch: Permite la implementación de aplicaciones por lotes de gran volumen y alta eficiencia.

  • Mensajería

  • Spring Messaging: Proporciona características para trabajar con sistemas de mensajería, como JMS y RabbitMQ.
  • Spring AMQP: Provee soporte para trabajar con el protocolo de mensajería AMQP.

  • Otras Utilidades

  • Spring Security OAuth: Proporciona soporte para el uso de OAuth2.
  • Spring Mobile: Facilita el desarrollo de aplicaciones móviles.
  • Spring Social: Proporciona conexiones con servicios sociales como Facebook, Twitter, etc.

136.8 Beans Importantes en Spring Boot

  1. DataSource: Configura la conexión a la base de datos.

  2. EntityManagerFactory: Para JPA (Java Persistence API), facilita la creación del EntityManager que gestiona las entidades.

  3. JdbcTemplate: Facilita la interacción con bases de datos en aplicaciones que utilizan JDBC.

  4. ResourceServerConfigurerAdapter y WebSecurityConfigurerAdapter: Se utilizan para la configuración de seguridad en aplicaciones Spring Boot.

  5. RestTemplate: Facilita la comunicación con servicios web RESTful.

  6. DispatcherServlet: Controlador frontal para manejar todas las solicitudes entrantes en aplicaciones web MVC.

  7. TomcatEmbeddedServletContainerFactory o equivalentes para otros servidores: Configura el contenedor de servlet embebido.

  8. TaskExecutor: Se utiliza para la ejecución de tareas en segundo plano.

  9. CommandLineRunner y ApplicationRunner: Beans que permiten ejecutar código específico justo después de que la aplicación haya arrancado.

  10. LocalSessionFactoryBean: En aplicaciones que utilizan Hibernate, este bean configura la SessionFactory.

  11. RabbitTemplate, JmsTemplate: Para aplicaciones que usan mensajería, estos beans facilitan la interacción con sistemas de mensajería como RabbitMQ o JMS.

COMO SE RELACIONAN ENTRE SI ESTOS BEANS

graph LR SpringBoot[Spring Boot] DataSource[DataSource] --- EntityManagerFactory[EntityManagerFactory] DataSource --- JdbcTemplate[JdbcTemplate] DataSource --- LocalSessionFactoryBean[LocalSessionFactoryBean] Security[Security] --- ResourceServerConfigurerAdapter[ResourceServerConfigurerAdapter] Security --- WebSecurityConfigurerAdapter[WebSecurityConfigurerAdapter] Security -.-> RestTemplate[RestTemplate] Security -.-> DispatcherServlet[DispatcherServlet] Security -.-> RabbitTemplate[RabbitTemplate] Security -.-> JmsTemplate[JmsTemplate] RestTemplate --- SpringBoot DispatcherServlet --- ServletContainer[Servlet Container] ServletContainer --- Tomcat[TomcatEmbeddedServletContainerFactory] TaskExecutor[TaskExecutor] -.-> JdbcTemplate TaskExecutor -.-> EntityManagerFactory ApplicationRunner[ApplicationRunner] -.-> DataSource ApplicationRunner -.-> EntityManagerFactory ApplicationRunner -.-> JdbcTemplate ApplicationRunner -.-> Security ApplicationRunner -.-> RestTemplate ApplicationRunner -.-> DispatcherServlet ApplicationRunner -.-> TaskExecutor ApplicationRunner -.-> LocalSessionFactoryBean ApplicationRunner -.-> RabbitTemplate ApplicationRunner -.-> JmsTemplate Hibernate[Hibernate] --- LocalSessionFactoryBean Messaging[Messaging] --- RabbitTemplate[RabbitTemplate] Messaging --- JmsTemplate[JmsTemplate] SpringBoot -.-> DataSource SpringBoot -.-> EntityManagerFactory SpringBoot -.-> JdbcTemplate SpringBoot -.-> Security SpringBoot -.-> RestTemplate SpringBoot -.-> DispatcherServlet SpringBoot -.-> TaskExecutor SpringBoot -.-> ApplicationRunner SpringBoot -.-> Hibernate SpringBoot -.-> Messaging