Red de conocimiento informático - Conocimiento del nombre de dominio - Una comprensión profunda del cableado automático y el cableado automático en Spring

Una comprensión profunda del cableado automático y el cableado automático en Spring

Cuando Spring ensambla propiedades de beans, a veces deja muy explícito que una referencia a un bean específico debe ensamblarse en una propiedad específica. Por ejemplo, si solo tenemos un bean de tipo org.mybatis.spring.SqlSessionFactoryBean en el contexto de nuestra aplicación, cualquier otro bean que dependa de SqlSessionFactoryBean requerirá ese bean; después de todo, solo hay un bean SqlSessionFactoryBean.

Para manejar este escenario de cableado explícito, Spring proporciona funcionalidad de cableado automático. En lugar de cablear explícitamente las propiedades del bean, deje que Spring identifique escenarios donde puede ocurrir el cableado automático.

Cuando se trata de dependencias de beans de cableado automático, Spring tiene varias formas de hacerlo. Por lo tanto, Spring proporciona cuatro estrategias de cableado automático.

Spring define estas estrategias en la interfaz AutowireCapableBeanFactory. Entre ellos, AUTOWIRE_AUTODETECT está marcado como un método obsoleto y ya no es compatible después de Spring 3.0.

Esto significa que otros beans con el mismo nombre que la propiedad del bean se conectarán automáticamente a la propiedad correspondiente del bean. Esto puede parecer extraño, así que veamos un ejemplo.

Primero, hay una propiedad Role myRole en el bean Usuario y luego crea un bean Role. Si su nombre es myRole, entonces puedes usar byName en Usuario para autoconectarlo.

Lo anterior es la definición de bean, luego verifique el archivo de configuración.

Como se mencionó anteriormente, puede usar byName para autoconectar beans en el usuario siempre que el nombre de la propiedad corresponda al nombre del bean. Entonces, ¿qué pasa si los nombres de los atributos no corresponden?

Sí, también puede optar por utilizar tipos para cableado automático si los nombres de las propiedades no corresponden. Esto significa que otros beans del mismo tipo que una propiedad del bean se conectarán automáticamente a la propiedad correspondiente del bean.

Aún en el ejemplo anterior, si usa byType, el ID del bean de rol se puede omitir por completo.

Esto significa que otros beans del mismo tipo que la entrada del constructor del bean se conectarán automáticamente a la entrada correspondiente en el constructor del bean. Vale la pena señalar que la frase Otro Bean con el mismo tipo indica que cuando se buscan parámetros de entrada, todavía se busca el tipo de bean.

El tipo de parámetro de entrada en el constructor es rol.

Primero intenta autoensamblarse usando el constructor, si eso falla, intenta usar byType. Sin embargo, desde Spring 3.0, se ha marcado como @Deprecated.

De forma predeterminada, el atributo default-autowire está establecido en "none" y todos los beans no utilizarán autowire a menos que el atributo autowire esté configurado en el bean.

Si necesita configurar la misma propiedad autowire para todos sus beans, hay una manera de simplificarlo.

Añade el atributo default-autowire="byType" al elemento raíz Beans.

Los beneficios del cableado automático de Spring son evidentes. Pero, de hecho, no recomendamos el cableado automático en los archivos de configuración Spring XML. En mi opinión, la mayor desventaja del cableado automático es la incertidumbre.

A menos que conozca todos los beans en toda su aplicación Spring, el cableado automático se volverá realmente malo a medida que aumente la cantidad de beans y aumente la complejidad de las relaciones.

A partir de Spring 2.5, se admiten anotaciones para ensamblar automáticamente las propiedades de Bean. Permite un cableado automático más detallado donde podemos anotar selectivamente una propiedad para aplicarle un cableado automático.

Spring admite varias anotaciones diferentes para aplicar el cableado automático.

Hoy solo nos centraremos en las anotaciones de Autowired. Para conocer su proceso de análisis e inyección, consulte la serie de códigos fuente Spring del autor. Análisis del código fuente de Spring (II) Creación de instancias de Bean e inyección de dependencia de IOC

Usar @Autowired es muy simple, simplemente agregue anotaciones a las propiedades que deben inyectarse.

Sin embargo, hay algunas cosas a tener en cuenta al usarlo.

Por defecto, tiene naturaleza de contrato obligatorio y sus propiedades anotadas deben estar cableadas. Si no se puede conectar ningún bean a la propiedad o parámetro marcado como Autowired, verá el mensaje NoSuchBeanDefinitionException.

Al ver el código fuente anterior, podemos recibir el mensaje de que si la colección de beans está vacía, entonces no importa si la clave es la condición requerida no se cumple, por lo que si no estamos seguros de si la propiedad puede ensamblarse, podemos usar Autowired de esta manera.

Recuerdo una pregunta que me hicieron en una entrevista: ¿Cuál es la estrategia para el montaje automático de Autowired? ¿Cuál es la estrategia de autowiring que sigue Autowired?

No se puede generalizar sobre esto, ni simplemente por tipo o nombre. Sin duda, está cableado automáticamente por tipo de forma predeterminada, es decir, por tipo.

El punto clave es el método findAutowireCandidates.

Puedes ver que devuelve una lista, lo que indica que la coincidencia por tipo puede encontrar múltiples instancias. ¿Qué instancia se debe montar? Leí en un libro que puedes resolver este problema agregando anotaciones. Por ejemplo, @qulifier, @Primary, etc. En realidad, existe una forma sencilla de resolver este problema.

Por ejemplo, la interfaz UserService se ensambla a través de su clase de implementación, que tiene múltiples clases de implementación: UserServiceImpl, UserServiceImpl2. Luego podemos definir el nombre de la propiedad como el nombre de la clase de implementación del bean al inyectar.

En este caso, Spring conectará por nombre. Primero, Spring ya tomó una decisión si se encuentran múltiples instancias del tipo.

Como puede ver, si se marcan varias instancias, el método determineAutowireCandidate es clave. Decide devolver un Bean apropiado. Parte de esto es hacer coincidir el nombre del frijol.

Finalmente, volviendo a la pregunta, la respuesta es que @Autowired usa byType de forma predeterminada para conectar propiedades y luego usa byName para determinar el Bean si coinciden varias instancias de ese tipo.

Arriba, hemos visto que se pueden encontrar múltiples instancias de un bean a través de byType, y luego el bean apropiado se determina a través de byName. ¿Qué pasa si tampoco puedes identificarlo por su nombre?

O utilice el método determineAutowireCandidate, que tiene otros dos métodos de determinación.

Su función es comprobar si el bean contiene la anotación @Primary y devolverla si la contiene. Por supuesto, no puede configurar varios beans como @Primary; de lo contrario, recibirá una excepción NoUniqueBeanDefinitionException.

También puedes configurar la anotación @Priority en un Bean, que tiene un valor de atributo de tipo int para configurar el tamaño de prioridad. Cuanto menor sea el número, mayor será la coincidencia de prioridad. Del mismo modo, no puede configurar la prioridad de varios beans con el mismo valor de tamaño; de lo contrario, recibirá NoUniqueBeanDefinitionException como de costumbre.

Finalmente, tenga en cuenta: la prioridad está empaquetada en javax.annotation.Priority; si desea utilizarla, debe introducir una coordenada.

Esta sección se centrará en varias estrategias para el ensamblaje automático en Spring y analizará el uso de anotaciones Autowired a través del código fuente.

Después de Spring 3.0, las estrategias de cableado automático válidas se dividen en byType, byName y constructor. Anotaciones Autowired usa byType para el cableado automático de forma predeterminada. Si hay varias instancias del tipo, intenta hacer coincidir byName. Si no se puede determinar byName, se puede determinar usando las anotaciones Primaria y Prioritaria.