1. Descripción general de la configuración de la primavera
1.1. Descripción general
El contenedor de primavera lee información de configuración de frijoles de la configuración XML, la anotación Java y la anotación de primavera para formar un registro de definición de frijoles;
Defina el registro para instanciar el frijol según el frijol;
Pon instancias de frijoles en la piscina de caché de frijoles;
La aplicación usa frijoles.
1.2. Configuración basada en XML
(1) Descripción general del archivo XML
XMLNS -----------------------------------------------------------------------------------------------------------------------
XMLNS: XSI ------------ El espacio de nombres estándar, utilizado para especificar el archivo de esquema del espacio de nombres personalizado
xmlns: xxx = "aaaaaa" ------------ Espacio de nombres personalizado, xxx es un alias, y el siguiente valor aaaa es el nombre completo
XSI: Schemalocation -------- Especifique un archivo de esquema específico para cada espacio de nombres, formato: la dirección del archivo de nombre completo del espacio de nombres. . . Separado con espacios
2. Configuración básica de frijoles
2.1. Nombramiento de frijoles
(1) Tanto la identificación como el nombre pueden especificar múltiples nombres, y los nombres están separados por comas, semicolones o espacios.
<beanName = "#car, 123, $ car" class = "xxxxxxxxxx">
Los usuarios pueden usar GetBean ("#Car"), GetBean ("123"), GetBean ("$ Car") para GetBean.
(2) Si no se especifican atributos de identificación y nombre, Spring usará automáticamente el nombre completamente calificado de la clase como el nombre del bean
(3) Si hay múltiples frijoles anónimos, es decir, no hay <bean/> con ID y nombre especificado, suponiendo que el nombre completamente calificado de la clase es xxx.
Luego obtenga el primer frijol usando getBean ("xxx"), obtenga el segundo bean usando getBean ("xxx#1"), obtenga el tercer bean usando getBean ("xxx#2").
3. Inyección de dependencia
3.1. Inyección de atributo
(1) La inyección de atributos requiere que Bean proporcione un constructor predeterminado y proporcione un método Setter para los atributos que deben inyectarse. Spring llama al constructor predeterminado para instanciar el objeto Bean y luego llama al método Setter para inyectar el valor de la propiedad a través de la reflexión.
(2) La primavera solo verificará si hay un método setter correspondiente en el frijol, y no se realizarán requisitos sobre si hay una variable de atributo correspondiente en el bean.
(3) Las especificaciones especiales de Javabean para el nombre de los atributos: las primeras 2 letras de una variable son todas mayúsculas o mayúsculas.
3.2. Inyección de constructor
(1) El orden de configuración de los parámetros del constructor no afectará los resultados de la configuración. El archivo de configuración de Spring adopta una política que no está relacionada con el orden de las etiquetas de los elementos. Esta estrategia puede garantizar la certeza de la información de configuración hasta cierto punto.
(2) Parámetros de coincidencia por índice
Si el tipo de parámetro de entrada del constructor es el mismo, debe especificar el índice secuencial de los parámetros, de lo contrario, la relación correspondiente no se puede determinar. como:
<constructor-argindex = "0" valor = "xxxxxxx"> <constructor-argindex = "1" valor = "xxxxxx">
El índice comienza en 0.
(3) Problema de dependencia circular
Si la configuración del constructor de 2 frijoles depende de la otra parte, se producirá un problema de punto muerto de hilo.
La solución es cambiar la inyección del constructor a inyección de atributos.
3.3. Inyección de método de fábrica
(1) Método de fábrica no estática
Dado que el método de fábrica no es estático, primero debe crear un bean de instancia de la clase de fábrica y usar fábrica para hacer referencia a él
<beanId = "Carfactory" class = "fábrica class"/> <beanid = "car5" fábrica-bean = "carfactory" factory-metory = "createCar"/>
(2) Método de fábrica estática
<beanId = "Car5" class = "Factory Class" Factory-Method = "CreateCar"/>
3.4. Explicación detallada de los parámetros de inyección
(1) 5 caracteres especiales en XML
| Símbolos especiales | Secuencia de escape | Símbolos especiales | Secuencia de escape |
| < | < | " | |
| > | > | ' | ' |
| Y | Y |
(2) <! [Cdata []]>
El propósito de <! [Cdata []]> es dejar que el analizador XML trate la cadena en la etiqueta como texto normal.
(3) Inyectar valor nulo usando la etiqueta <null/>
(4) atributos en cascada
<beanID = "parent" class = "xxxxxxx"> <propietaria = "child.xxx" valor = "valor de propiedad del objeto de dependencia"/> </le bean>
Antes de Spring3.0, el niño del objeto de dependencia debe ser instanciado primero, de lo contrario se lanzará una excepción. Después de Spring3.0, no hay necesidad de mostrar instanciación. El contenedor de primavera instanciará automáticamente el objeto de dependencia.
(5) Fusionar la colección
<setmerge = "true"/>
Comúnmente utilizado en subclases para fusionar elementos de recolección de la clase principal
(6) Configurar los frijoles de tipo de recolección a través del espacio de nombres Util
Si desea configurar un tipo de colección en lugar de una propiedad de tipo de colección, puede configurarlo a través del espacio de nombres Util.
3.5. Ensamblaje automático
(1) El elemento <bean/> proporciona un atributo que especifica el tipo de AutoWire
3.6. Inyección de método
Si inyectamos frijoles prototipos en frijoles en modo singleton y esperamos devolver un nuevo frijol cada vez que lo llamemos, no será posible usar métodos de inyección tradicionales porque la acción de los frijoles de modo singleton que inyectan frijoles asociados solo ocurre una vez.
(1) Una solución opcional es habilitar el host Bean para implementar la interfaz BeanFactoryaSe, para que el host Bean pueda acceder a las referencias del contenedor, de modo que el método GET pueda modificarse y el contenedor
Método Factory.getBean ("Bean dependido"), puede obtener el último bean cada vez.
(2) El método anterior combina nuestro código y resorte, que es la peor manera de hacer, y podemos desacoplar a través de la inyección del método.
Solo necesitamos definir una interfaz y definir un método abstracto para obtener frijoles dependientes en la interfaz. La configuración de resorte es la siguiente:
<beanId = "Car" class = "depended bean"/> <beanid = "host" class = "interface bean"> <bearup-methodname = "getcar" bean = "car"/> </bean>
La etiqueta del elemento del método de búsqueda proporciona implementación dinámica para getcar () de los frijoles de interfaz. La implementación de la inyección del método se basa principalmente en la tecnología dinámica de bytecode de operación del paquete CGLIB.
3.7. Reemplazo de método
Use Bean2 para reemplazar el método GetCar de Bean1, siempre que Bean2 debe implementar la interfaz MethodReplacer, y la configuración es la siguiente:
<beanId = "bean1" class = "aaaaaaaaa"> <reemplazado-methodname = "getCar" reemplazar = "bean2"/> </ bean> <beanid = "bean2" class = "bbbbbbbbbb"/>>
4. La relación entre <Bean>
4.1. Herencia
La configuración del frijol principal puede ser heredado por subclases para evitar definiciones repetidas. La configuración es la siguiente:
<beanid = "parent bean" class = "aaaaaa" abstract = "true"/> <beanid = "child bean" class = "bbbbbb">
Las subclases pueden anular la configuración de la clase principal. Si no se especifica el resumen = "verdadero" de la clase principal, el bean principal será instanciado.
4.2. Dependencia
Algunos frijoles instancian dependen de otros frijoles, y otros frijoles deben instanciarse antes de que puedan instanciar el bean host. Spring proporciona el atributo dependiente y especifica que el bean de dependencia se instancia primero, como:
<beanid = "host" class = "aaaaaa" depende-on = "b1"/> <beanid = "b1" class = "bbbbbbbb"/>
Si hay múltiples frijoles antes de dependencia, puede crear el nombre del frijol por comas, espacios o semicolones.
4.3. Alcance de la frijoles
(1) El contenedor de primavera instanciará todos los frijoles cuando se inicie. Si no desea instanciar de antemano, la propiedad Lazy-Init = "True" de <bean/> puede controlar la instanciación tardía, pero si el bean se hace referencia a otros frijoles a los que debe instanciarse de antemano, la primavera también ignorará la configuración de instancia retrasada.
(2) Alcance relacionado con la aplicación web
Si el usuario usa el alcance de solicitud, sesión y globalsession, la configuración adicional debe hacerse primero en el contenedor web:
En las versiones inferiores de los contenedores web (antes del Servlet 2.3), puede usar la configuración del filtro de solicitud HTTP:
<Trime> <Strofle-Name> requestContextFilter </filter-name> <filter-class> org.springframework.web.filter.requestContextFilter </filter-class> </filter> <filter-mapping> <filter-name> requestContextFilter </filter-name> <url-pattern>/*</ url-pattern> </filtro-name>
En versiones más altas de contenedores web, puede usar el HTTP Solicitud Listener para configurar:
<Oyerer> <Oyerer-class> org.springframework.web.context.request.requestContextListener </oyequer-class> </oyente>
(3) Problema de dependencia del alcance
Al inyectar frijoles con escollar web en singleton o prototipo de frijoles, use AOP, por ejemplo:
<bean id = "web1" scope = "request"> <aop: Scoped-Proxy/> </ bean> <bean id = "singleton1"> <propiedad name = "z1" ref = "web1"/> </ bean>
4.4. Fábrica
En términos generales, Spring utiliza el atributo de clase de <bean/> para especificar el bean de instanciación de la clase de implementación a través del mecanismo de reflexión. Pero en algunos casos, el proceso de instancia de un frijol es más complicado. Si de la manera tradicional, se requiere una gran cantidad de información de configuración en el <BRAN>. La flexibilidad del método de configuración es limitada, y se puede obtener una solución simple utilizando métodos de codificación.
Spring proporciona un org.springframework.beans.factory.factorybean interfaz de clase de fábrica para esto, y los usuarios pueden personalizar la lógica de la instancia de los frijoles mediante la implementación de esta interfaz.
Cuando la clase de implementación configurada por el atributo de clase de <bean/> es fábrica y su subclase, el retorno del método FactoryBean () no devuelve la fábrica y su subclase en sí, sino el objeto devuelto por el método GetObject () de fábrica.
Si desea obtener el objeto de FactoryBean y su subclase en sí, prefije explícitamente el nombre de la frijoles con un prefijo "y", como GetBean ("& Car5") cuando el método GetBean (BeanName).
5. Configuración basada en anotaciones
5.1. Tipo de anotación
@Component ----- Anotación nativa
Anotaciones derivadas:
@Repository: Anotate Dao
@Service: Servicio de etiqueta
@Controller: controlador de anotación
5.2. Utilice la información de configuración de anotación para iniciar el contenedor Spring
(1) Después de la primavera 2.5, se introdujo el espacio de nombres de contexto, que proporciona la aplicación de anotaciones para definir los frijoles escaneando el paquete de clase:
<context: component-scan base-pakage = "xxxxxxxxxxx" recurse-pattern = "xxxxx/*. class">
El atributo de patrón de recursos se utiliza para especificar clases en paquetes específicos que deben escanear en el paquete base
(2) Hay sub-etiquetas de filtro más potentes
<context: component-scan base-package = "xxxxxxxxxxx"> <context: include-Filter type = "xxxx" expresion = "xxxxxxxxxxxxxxxxxx"/> <context: exclude-filter type = "xxxxx" expresión = "xxxxxxxxxxxxxx"/> <//context: componente-scan>
De todos los tipos, la capacidad de filtrado de SuppeJ es la más poderosa.
5.3. Ensamblaje automático de frijoles
(1) @aUtowired
@AUtowired coincides por tipo por defecto. Si no hay frijol a juego en el contenedor, se lanzará una excepción cuando comience el contenedor de resorte. Puede usar @aUtowired (requerido = falso) para anotación, y no se lanzará ninguna excepción.
Use @aUtowired para anotar directamente los parámetros del método. Si un método tiene múltiples parámetros, por defecto, Spring selecciona automáticamente los frijoles que coinciden con el tipo de parámetro para la inyección.
Usando la anotación de las variables de recolección de @autowired, puede inyectar todos los frijoles que coinciden con el tipo de elemento de la colección, que es muy potente.
Usando la propiedad del ensamblador de @autowired, no puede haber un método setter.
(2) @Qualifiler
Si hay más de un frijol a juego en el contenedor, el nombre del frijol puede ser calificado por la anotación @Qualifiler.
(3) Apoyo para el marcado y la anotación
Spring también admite @Resource definido por JSR-250 y anotaciones de @Inject definidas por JSR-330
@Resource requiere que se proporcione el atributo de nombre de un bean. Si el atributo está vacío, el nombre de la variable o el nombre del método se utilizará automáticamente como el nombre del bean.
(4) Puntos clave:
Si solo usa @aUtowired, aún necesitamos definir explícitamente el nodo <bean/> en el XML. El contenedor de primavera deshabilita el ensamblaje de anotación de forma predeterminada. La forma de habilitarlo es configurar el elemento <contexto: anotación-config/> en el XML.
Pero la primavera también proporciona otro truco. Usando el elemento <context: component-scan/>, el contenedor de resorte detectará automáticamente el bean sin definir explícitamente el nodo <bean/>.
Spring anota la clase de anotación a través de @Component, @Repository, @Service y @Controller, de modo que <context: Component-scan/> sabe qué clases deben registrarse como SpringBean.
Si usa un paquete JAR de terceros y desea inyectar clases automáticamente en el paquete JAR de terceros, incluso si el paquete JAR de terceros no las anota con anotaciones, el elemento de filtro <contexto: incluir-Filter> puede reemplazar la política de escaneo de componentes basada en anotaciones, de modo que <context: componente-escan/> registra automáticamente las clases que cumplen con las expresiones expresiones expresiones.
5.4. Método de proceso de acción y proceso de alcance de Bean
(1) @scope ("xxxx")
El rango predeterminado de frijoles configurados por anotación es Singleton.
La primavera proporciona anotación @scope. Cuando se trata de la clase, los parámetros de anotación son los mismos que el valor del atributo de alcance en XML.
(2) Comparación de métodos de proceso de vida
| <Bean> | anotación |
| método inicial | @PostConstruct |
| Método de destino | @Predestroy |
Diferencia: las anotaciones pueden definir múltiples métodos en una clase, y los métodos se ejecutan en orden
6. Configuración basada en Java
6.1. Use clases de Java para proporcionar información de definición de frijoles
(1) El POJO ordinario puede proporcionar información de definición de frijoles para contenedores de resorte siempre que la anotación @Configuration esté marcada. Cada método marcado con @Bean es equivalente a proporcionar una información de definición de frijoles.
(2) @Bean
El tipo de frijol está determinado por el tipo de valor de retorno del método anotado por @Bean
El nombre predeterminado del bean es el mismo que el nombre del método, y también puede especificarse explícitamente por @Bean (name = "xxx").
Puedes usar @scope en @Bean para indicar el alcance de uso del frijol
(3) @configuration
Dado que la clase de anotación @Configuration en sí se ha marcado con la anotación de @Component, cualquier clase marcada con @ConfigurStion se puede ensamblar automáticamente en otras clases usando @aUtowired.
6.2. Inicie el contenedor Spring utilizando la información de configuración basada en la clase Java
(1) Spring proporciona una clase AnnotationConfigApplicationContect, que puede iniciar directamente el contenedor de resorte a través de la clase anotada anotada @Configuration Annotation.
(2) Cuando hay múltiples clases de configuración
Puede registrar uno por uno a través del método de registro de AnnotationConfigApplicationContect, y luego llamar al método de actualización para actualizar el contenedor para aplicar estas clases de configuración registradas.
También puede usar la anotación de @import (xxx.class) para introducir todas las demás clases de configuración en una clase de configuración, de modo que solo necesite registrar una clase de configuración.
(3) Consulte la configuración de @Configuration a través de la clase de configuración XML
<context: component-scanbase-package = "..." recurse-pattern = "Nombre de clase de configuración">
(4) Información de configuración XML de referencia en la clase de configuración
Use @Importresource ("Classpath: ............") en @Configuration para importar el archivo de configuración XML
6.3. Comparación de 3 métodos de configuración
| Xml | anotación | Clase Java |
| La clase de implementación de Bean es el desarrollo actual del proyecto | Controle la lógica general de la inicialización de frijoles a través del código, adecuado para escenarios en los que la instancia de los frijoles es más compleja |
Resumir
Lo anterior es toda la explicación detallada de los frijoles de ensamblaje de primavera en contenedores del COI. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a este sitio:
Una explicación detallada de los tres métodos de configuración de frijoles en la primavera 3.x
Una breve discusión sobre la diferencia entre Spring Singleton Bean y Singleton Pattern
Explicación detallada del ciclo de vida del uso de la configuración de primavera
Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!