Introducción de inyección de dependencia
Primero revisemos el concepto de inyección de dependencia:
La inyección de dependencia e inversión de control, que a menudo mencionamos son el mismo concepto. El significado específico es: cuando un rol (tal vez una instancia de Java, la persona que llama) necesita la ayuda de otro rol (otra instancia de Java, persona que llama), en el proceso de programación tradicional, la persona que llama generalmente es creada por la persona que llama. Pero en la primavera, el trabajo de crear el Callee ya no lo realiza la persona que llama, por lo que se llama inversión de control; El trabajo de crear la instancia de Callee generalmente lo realiza el contenedor de resorte y luego se inyecta en la persona que llama, por lo que también se llama inyección de dependencia.
De hecho, en pocas palabras, el papel de la inyección de dependencia es desacoplar las dependencias entre los objetos del código original, y agregar el procesamiento del marco de Spring para permitirnos administrar de manera flexible y centralmente las dependencias.
Marco de inyección de dependencia
El marco de inyección de dependencia no es misterioso, en realidad es algo muy simple. No mire el código fuente de inyección de dependencia de Spring, porque mientras vaya, significa que nunca volverá a escribir y no se atreverá a comenzar por usted mismo. Su función es demasiado potente, por lo que el diseño es demasiado complicado. Los programadores comunes solo pueden suspirar al verlo.
No leí el código fuente de primavera con cuidado. Aun así, solo tardó medio día en aplicar un pequeño marco Iockids que básicamente cumple con el estándar de inyección de dependencia estándar "JSR-330". Este pequeño marco tiene solo un inyector de clase principal, con aproximadamente 200 líneas de código, y tiene las siguientes funciones.
Veamos un ejemplo de uso un poco más complicado
import javax.inject.inject; import javax.inject.named; import javax.inject.singleton; import iockids.injector; @singletonclass root {@inject @named ("a") nodo a; @Inject @named ("b") nodo B; @Override public String toString () {return string.format ("root ( %s, %s)", a.name (), b.name ()); }} Interface Node {String name ();}@singleton@llamado ("a") clase nodea implementa nodo {@Inject Leaf Leaf; @Inject @named ("b") nodo B; @Override public String name () {if (b == null) return string.format ("nodea (%s)", hoja); else return string.format ("nodeawithb (%s)", hoja); }}@Singleton@llamado ("b") class nodeB implementa nodo {hoja de hoja; @Inject @named ("A") nodo A; @Inject Public NodeB (Leaf Leaf) {this.leaf = Leaf; } @Override public String name () {if (a == null) return string.format ("nodeb (%s)", hoja); else return string.format ("nodebwitha (%s)", hoja); }} Class Leaf {@Inject Root Root; Índice int; secuencia intst static; Public Leaf () {index = secuence ++; } public String toString () {if (root == null) return "hoja" + índice; el más devolver "Leafwithroot" + índice; }} public class Demo {public static void main (string [] args) {var inyector = new injector (); inyector.RegistereCalifiedClass (node.class, nodea.class); inyector.RegistereCalifiedClass (node.class, nodeb.class); var root = inyector.getInstance (root.class); System.out.println (raíz); }}El código anterior usa todas las funciones proporcionadas por IOCKIDS.
Para facilitar la comprensión del código anterior, dibujé un diagrama de dependencia
La salida del código anterior es la siguiente
Root (nodeawithb (hojawithroot0), Nodebwitha (hojawithroot1)))
A partir de esta salida, también podemos imaginar aproximadamente la estructura de dependencia.
IOCKIDS proporciona informes de excepción de error de inyección rica para evitar errores de configuración de inyección del usuario.
Por ejemplo, si configuramos los nombres de Nodea y NodeB arriba a la misma A, la pila de errores a continuación estará expuesta.
iockids.injectException: javax.inject calificado duplicado. iockids.demo.demo.main (demo.java:106)
Si agregamos un parámetro al constructor de NodeB AT
@Inject Public NodeB (Leaf Leaf, Int K) {this.leaf = Leaf; }El siguiente error se lanzará cuando se ejecute
iockids.injectException: no hay constructor accesible para la clase de inyección int en iockids.injector.createnew (inyector.java:120) en iockids.injector.createnew (inyector.java:94) en iockids.injector.createfromparameter (inyector.java:167) At iockids.injector.createfromConstructor (inyector.java:145) en iockids.injector.createNew (inyector.java:123) en iockids.injector.createFromQualified (inyector.Java:216) en iOckids.injector.createfromfield (inyector.Java:173) iockids.injector.injectMembers (inyector.java:233) en iockids.injector.createNew (inyector.java:136) en iockids.inector.createfromQualified (inyector.java:216) en iockids.injector.createfromield (inyector.Java:173) iockids.injector.injectMembers (inyector.java:233) en iockids.injector.createnew (inyector.java:136) en iockids.injector.createnew (inyector.java:94) en iockids.injector.getInstance (inyector.Java:245) iockids.demo.demo.main (demo.java:107)
Dirección de código abierto del proyecto: https://github.com/pyloque/iockids (descarga local)
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.