La inversión de control (IoC) y la inyección de dependencia (DI) son dos conceptos fundamentales en Spring Framework. Tradicionalmente, los objetos son responsables de crear y gestionar sus propias dependencias. Sin embargo, IoC invierte esta responsabilidad entregando el control de la creación de objetos y la gestión de dependencias a un marco como Spring.
Este turno ofrece varias ventajas:
IoC se puede implementar a través de varios mecanismos, incluidos patrones de diseño como el patrón de fábrica, el patrón de estrategia o el patrón de localización de servicios. Sin embargo, la forma más común y poderosa de lograr IoC es mediante la inyección de dependencia.
La inyección de dependencia (DI) es una técnica en la que el marco inyecta dependencias en un objeto en lugar de que el objeto cree las dependencias en sí. Hay diferentes tipos de DI en primavera:
Por ejemplo, en una clase de servicio simple, es posible que veas algo como esto:
@Service public class OrderService { private final PaymentService paymentService; @Autowired public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void processOrder(Order order) { paymentService.processPayment(order.getPaymentDetails()); } }
Aquí, PaymentService se inyecta en OrderService mediante inyección de constructor, que generalmente se prefiere por sus dependencias claras y su facilidad de prueba.
Spring proporciona un contenedor de IoC que es responsable de administrar el ciclo de vida de los beans (objetos administrados por Spring). La interfaz básica para este contenedor es BeanFactory. Sin embargo, la mayoría de las aplicaciones utilizan ApplicationContext, que amplía BeanFactory y ofrece funciones adicionales.
// Getting a bean from the ApplicationContext ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); MyBean myBean = context.getBean(MyBean.class);
En este ejemplo, ApplicationContext se utiliza para recuperar un bean. Si estuviera utilizando un BeanFactory básico, ofrecería una funcionalidad similar pero sin los beneficios adicionales de ApplicationContext.
Hay dos formas comunes de acceder al ApplicationContext actual:
Autowired: Inyecte ApplicationContext directamente en su componente.
@Autowired private ApplicationContext applicationContext;
ApplicationContextAware: implementa la interfaz ApplicationContextAware, que te permite recuperar ApplicationContext según sea necesario.
public class MyBean implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.applicationContext = context; } }
Cuando se inicia una aplicación Spring, se llevan a cabo una serie de pasos:
Procesamiento de variables y propiedades de entorno: Se crea el objeto de entorno, incorporando configuraciones de application.properties o application.yml.
Creación del ApplicationContext: Se determina y crea una instancia del tipo de ApplicationContext apropiado. Por ejemplo, una aplicación Spring Boot puede usar AnnotationConfigServletWebServerApplicationContext para configuraciones basadas en Java.
Cargando definiciones de beans: Spring carga definiciones de beans de múltiples fuentes, como clases anotadas, clases @Configuration o archivos XML. Cada definición de bean incluye información sobre el tipo, alcance, dependencias y devoluciones de llamada del ciclo de vida del bean.
Procesamiento de BeanFactoryPostProcessors: estos procesadores modifican las definiciones de los beans antes de que se creen los beans reales.
Resolución de dependencias y creación de beans: ApplicationContext resuelve las dependencias y crea los beans. Si un bean tiene dependencias de otros beans, esas dependencias se crean primero.
Spring admite varios alcances de beans, que definen el ciclo de vida y la visibilidad de un bean dentro del contenedor:
@Bean @Scope("prototype") public MyPrototypeBean myPrototypeBean() { return new MyPrototypeBean(); }
En este ejemplo, se crea una nueva instancia de MyPrototypeBean cada vez que se solicita desde el contenedor.
Considere un escenario en el que un bean con ámbito Singleton depende de un bean con ámbito Prototipo. Normalmente, el bean prototipo solo se crearía una vez durante la inicialización del singleton. Para garantizar que se proporcione una nueva instancia del bean prototipo cada vez, Spring utiliza objetos proxy.
@Component @Scope(value = "singleton") public class SingletonBean { @Autowired @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) private PrototypeBean prototypeBean; public void showMessage() { System.out.println(prototypeBean.getMessage()); } }
Aquí, ScopedProxyMode.TARGET_CLASS garantiza que se devuelva una nueva instancia de PrototypeBean cada vez que se llama a getMessage().
Spring Boot es una extensión de Spring Framework que simplifica la configuración y el desarrollo de nuevas aplicaciones Spring. Proporciona:
La configuración automática es una característica poderosa en Spring Boot que configura muchas cosas para usted en función de las dependencias en su classpath. Esto está controlado por anotaciones condicionales como:
Por ejemplo, si tiene Jackson en su classpath, Spring Boot configurará automáticamente un ObjectMapper para la serialización JSON:
@Configuration @ConditionalOnClass(ObjectMapper.class) public class JacksonAutoConfiguration { // Configuration details... }
Si ObjectMapper está presente, esta configuración se aplica automáticamente. De lo contrario, se omite.
Puedes registrar las configuraciones automáticas activas durante el inicio agregando lo siguiente a tus propiedades de aplicación:
logging.level.org.springframework.boot.autoconfigure=DEBUG
Esto generará un informe detallado que muestra qué configuraciones se aplicaron y cuáles no, lo que le ayudará a solucionar problemas o comprender la configuración de la aplicación.
La inversión de control y la inyección de dependencias son conceptos centrales que permiten la flexibilidad, modularidad y capacidad de prueba que hacen que Spring sea tan poderoso. Al comprender cómo funciona el contenedor IoC de Spring, cómo se administran los beans y cómo Spring Boot amplía estas capacidades, podrá desarrollar aplicaciones sólidas y fáciles de mantener de manera más eficiente.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3