Introducción al marco Spring 5.0.0_Versión china_3.9
La configuración basada en anotaciones proporciona una alternativa a la configuración XML, confiando en metadatos de código de bytes para cablear componentes en lugar de declararlos entre corchetes angulares. En lugar de utilizar XML para describir conexiones de beans, los desarrolladores mueven la configuración dentro de la propia clase de componente mediante el uso de anotaciones en las declaraciones de clase, método o campo relevantes. Como se menciona en la sección "Ejemplo: RequiredAnnotationBeanPostProcessor", usar un BeanPostProcessor con anotaciones es una forma común de extender el contenedor Spring IoC. Por ejemplo, Spring 2.0 introdujo la posibilidad de hacer cumplir las propiedades requeridas usando la anotación @Required, mientras que Spring 2.5 implementó la inyección de dependencia de Spring de la misma manera. Básicamente, @Autowired proporciona la misma funcionalidad que se describe en la Sección 3.4.5. "Spring 2.5 también agrega soporte para anotaciones JSR-250 como @PostConstruct y @PreDestroy
. Spring 3.0 agrega soporte para anotaciones JSR-330 contenidas en el paquete javax.inject (inyección de dependencia de Java) Admite anotaciones como como @Inject y @Named. Consulte las secciones relevantes para obtener detalles sobre estas anotaciones.
Como antes, puede registrarlas como definiciones de Bean separadas, pero también puede usar Las siguientes etiquetas están incluidas en XML Spring. configuración para registrarlos implícitamente (la inyección incluye el espacio de nombres de contexto):
(Los postprocesadores registrados implícitamente incluyen AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor y el RequiredAnnotationBeanPostProcessor mencionado anteriormente
La anotación @Required). se aplica al método de establecimiento de una propiedad de Bean, como se muestra a continuación:
Esta anotación simplemente significa que en el momento de la configuración, se debe configurar mediante una definición de bean explícita o un cableado automático. Las propiedades del bean afectadas no se completan, el contenedor generará una excepción, lo que permitirá una falla temprana y explícita para evitar NullPointerException o excepciones similares más adelante. Aún recomendamos que agregue aserciones en la clase de bean, como durante la inicialización del método. los valores se aplican incluso si usa la clase fuera del contenedor.
Puede aplicar la anotación @Autowired al constructor.
También puede aplicar la anotación @Autowired. anotación a métodos de establecimiento "tradicionales":
También puede aplicar la anotación a métodos con cualquier nombre y/o cualquier número de parámetros:
También puede aplicar @Autowired a los campos.
También puedes agregar la anotación @Autowired a un campo o método con una matriz para proporcionar un conjunto de beans de un tipo específico desde ApplicationContext:
La misma anotación también puede ser aplicado para colecciones del mismo tipo:
Los mapas de tipos se pueden conectar automáticamente siempre que las claves esperadas sean cadenas, los valores mapeados contendrán todos los beans del tipo esperado y las claves contendrán los nombres de los mismos; beans correspondientes:
De forma predeterminada, el cableado automático fallará cuando no haya beans candidatos disponibles. El comportamiento predeterminado es tratar los métodos, constructores y campos anotados como si representaran las dependencias requeridas:
De forma predeterminada. , el cableado automático falla cuando no hay beans candidatos disponibles; el comportamiento predeterminado es tratar los métodos, constructores y campos anotados como si representaran las dependencias requeridas. Este comportamiento también se puede cambiar de la siguiente manera.
También puede utilizar @Autowired con interfaces que se sabe que tienen dependencias resolubles: BeanFactory, ApplicationContext, Environment, ResourceLoader, ApplicationEventPublisher y MessageSource. Estas interfaces y sus extensiones (como ConfigurableApplicationContext o ResourcePatternResolver) se resuelven automáticamente sin una configuración especial.
Debido a que el cableado automático basado en tipos puede producir múltiples objetivos candidatos, a menudo se requiere más control sobre el proceso de selección. Una forma es a través de la anotación @Primary de Spring. Cuando hay varios beans candidatos para ensamblar en una dependencia de un solo valor, @Primary indica que el bean especificado debe tener mayor prioridad. Si se determina que un bean "principal" está entre los candidatos, entonces se convierte en el valor cableado automáticamente.
Supongamos que tenemos la siguiente configuración, defina firstMovieCatalog como el MovieCatalog principal.
Con esta configuración, el siguiente MovieRecommender coincidirá automáticamente con firstMovieCatalog.
El Bean correspondiente se define de la siguiente manera:
@Primary es una forma eficaz de realizar automáticamente la conexión por tipo cuando es necesario determinar varias instancias como candidatas principales. Cuando necesite más control sobre el proceso de selección, puede utilizar la anotación @Qualifier de Spring. Para asignar un bean específico a cada selección, puede reducir el conjunto de coincidencias de tipos asociando el valor del calificador con un parámetro específico. En el caso más simple, este es un valor puramente descriptivo:
La anotación @Qualifier también se puede usar para especificar un único parámetro de constructor o parámetro de método:
El Bean correspondiente se define como sigue. Los beans con un valor calificador de "principal" se conectarán a los parámetros del constructor con el mismo valor.
Para la coincidencia alternativa, el nombre del bean se trata como el valor calificador predeterminado. Por lo tanto, puede definir un Bean con id main en lugar del elemento calificador incrustado y obtener los mismos resultados coincidentes. Sin embargo, si bien puede usar esta convención para referirse a un bean específico por su nombre, @Autowired es fundamentalmente una inyección basada en tipos que utiliza calificadores semánticos opcionales. Esto significa que los valores calificadores, incluso cuando se devuelven a un nombre de bean, siempre limitan el alcance de la coincidencia de tipos semánticos; no expresan semánticamente la referencia como un ID de bean único;
Un buen valor para el calificador es "main" (principal) o "EMEA" (Europa, Medio Oriente y África) o "persistent" (persistente), que expresa la naturaleza de un componente específico independiente del Bean ID, aunque el anterior Este no es el caso de los beans del ejemplo.
Como se mencionó anteriormente, los calificadores también se pueden aplicar a combinaciones de tipos, como Setlt;MovieCataloggt;. En este ejemplo, todos los beans que coinciden con el calificador declarado se inyectan como una colección. Esto significa que los calificadores no tienen que ser únicos, simplemente forman los criterios de filtro. Por ejemplo, puede definir varios MovieCatalogs con el mismo valor de calificador "acción", todos los cuales se inyectarán en un Setlt;MovieCatalogt; con la anotación @Qualifier("acción").
Puedes crear tus propias anotaciones de calificador personalizadas. Simplemente defina una anotación, proporcionando la anotación @Qualifier en su propia definición:
Luego puede proporcionar calificadores personalizados en los campos y parámetros ensamblados automáticamente:
Continuar A continuación, proporcione información sobre el Definición de frijol candidato. Puede agregar la etiqueta qualifier/gt; como elemento secundario de la etiqueta bean/gt; y luego especificar el tipo y valor que coincida con la anotación del calificador personalizado. El tipo se utiliza para coincidir con el nombre de clase completo de la anotación. Alternativamente, si no hay riesgo de conflictos de nombres, se pueden utilizar nombres de clase abreviados por conveniencia. Los siguientes ejemplos demuestran estos métodos.
En la Sección 3.10, "Componentes de administración y escaneo de Classpath", verá otro enfoque basado en anotaciones para proporcionar metadatos de calificadores en XML. Consulte especialmente la Sección 3.10.8, "Proporcionar metadatos de calificador mediante anotaciones".
En algunos casos, utilizar una anotación sin valor es suficiente. Esto resulta útil cuando las anotaciones se utilizan con un propósito general y se pueden aplicar a muchos tipos diferentes de dependencias. Por ejemplo, puede proporcionar un directorio sin conexión en el que se pueda buscar cuando la red no esté disponible. Comience definiendo una anotación simple:
Luego agregue la anotación al campo o propiedad que desea autocablear:
Ahora, la definición del bean solo requiere un tipo de calificador:
También puede definir una anotación de calificador personalizado que reciba una propiedad con nombre además de una propiedad de valor simple. Si un campo o parámetro a inyectar especifica más de un valor de propiedad, la definición del bean debe coincidir con todos los valores de propiedad para ser considerado un candidato para el cableado automático. Por ejemplo, considere la siguiente definición de anotación:
En este caso, el formato es de tipo enumeración:
Los campos que se conectarán automáticamente están anotados con un calificador personalizado y contienen dos valores de atributo. : género y formato.
Finalmente, la definición del bean debe contener valores calificadores coincidentes. Este ejemplo también confirma que los metaatributos de bean se pueden usar en lugar de elementos secundarios
Además de la anotación @Qualifier, también puedes utilizar genéricos de Java para implicar calificadores.
Por ejemplo, suponga que tiene la siguiente configuración:
Suponga que el Bean anterior implementa una interfaz genérica, por ejemplo, Storelt; Stringgt; y Storelt;, puede @Autowire la interfaz Store y el tipo genérico; se utilizarán como calificadores:
Al conectar automáticamente listas, mapas y matrices, también se aplicarán calificadores comunes:
CustomAutowireConfigurer es un BeanFactoryPostProcessor que le permite registrarse para el tipo de anotaciones de calificadores personalizados de BeanFactoryPostProcessor, incluso si estos tipos no están anotados con la anotación @Qualifier de Spring.
AutowireCandidateResolver determina los candidatos de autowire de la siguiente manera:
Cuando varios beans califican como candidatos de autowire, el bean "primario" se determina de la siguiente manera: Si el candidato es Si la función principal de el Bean determinado se establece en verdadero, el Bean se establecerá en verdadero y se seleccionará como el Bean de destino. Este es un patrón común en Java EE 5 y 6, como en los beans administrados JSF 1.2 o los puntos finales JAX-WS 2.0.
@Resource usa el atributo de nombre. De forma predeterminada, Spring trata el valor del nombre como el nombre del bean que se va a inyectar. En otras palabras, sigue la semántica del nombre, como lo demuestra el siguiente ejemplo:
Si un nombre no se especifica explícitamente, el nombre predeterminado se toma del nombre del campo o del método de establecimiento. En el caso de un campo, el nombre predeterminado se toma del nombre del campo; en el caso de un método de establecimiento, el nombre predeterminado se toma del nombre de la propiedad del bean. Por lo tanto, el siguiente ejemplo inyecta un bean llamado movieFinder en su método de establecimiento:
En el caso específico de @Resource, si no se especifica ningún nombre explícito, como @Autowired, @Resource tendrá en su lugar el nombre especificado. bean realiza coincidencias de tipos primarios y resuelve en analizadores conocidos. Dependencias: interfaces BeanFactory, ApplicationContext, ResourceLoader, ApplicationEventPublisher y MessageSource.
Entonces, en el siguiente ejemplo, el campo customerPreferenceDao primero busca un bean llamado customerPreferenceDao y luego regresa al tipo principal que coincide con el campo ".context" del tipo CustomerPreferenceDao para inyectar el ApplicationContext basado en un tipo de dependencia resoluble conocido. .
CommonAnnotationBeanPostProcessor no solo reconoce las anotaciones @Resource, sino también las anotaciones del ciclo de vida JSR-250. Spring 2.5 introdujo soporte para estas anotaciones, que también brindan alternativas a las anotaciones descritas en Devoluciones de llamada de inicialización y Devoluciones de llamada de destrucción. Suponiendo que CommonAnnotationBeanPostProcessor se haya registrado en el ApplicationContext de Spring, los métodos que ejecutan estas anotaciones se llaman en el mismo momento del ciclo de vida que los métodos de interfaz del ciclo de vida de Spring correspondientes o los métodos de devolución de llamada declarados explícitamente.
En el siguiente ejemplo, la caché se ubica previamente antes de la inicialización y se borra antes de la destrucción.