Este artículo resume principalmente algunos métodos de devolución de llamada y puntos extensibles proporcionados por Spring Container antes y después de inicializar la instancia. Usando estos métodos y puntos de extensión, se puede realizar un procesamiento lógico especial antes y después de las instancias de inicialización de la primavera.
Lo siguiente se introduce principalmente:
Método de devolución de devolución de llamada del ciclo de vida a nivel de clase Configuración del método inicial, Inicializando la interfaz de BeBean y la anotación posterior a la construcción
Interfaz de procesador de beanpostPost de extensión a nivel de contenedor e interfaz beanFactoryPostProcessor
1. devolución de llamada del ciclo de vida de nivel de clase
Método de 1.1initos
Referencia: SpringBeanxSdinit Method
Init-Method es un elemento de configuración al declarar un bean en el archivo de configuración de resorte. El valor del elemento de configuración del método init es un método sin parámetros en la clase, pero se puede lanzar una excepción. Este método se llamará después de que el contenedor de primavera instancie el objeto y establece el valor de la propiedad.
Las funciones que se pueden implementar mediante el método init son consistentes con la interfaz inicializadora y la anotación posterior a la construcción
Los archivos de configuración de Spring y las clases de prueba son los siguientes:
<bean id = "initMethodBeanService" init-Method = "init"> <Property name = "f2" value = "2"/> </bean>
La clase de prueba es la siguiente:
clase pública InitMethodBeanService {private static entero F1; privado entero f2; static {f1 = 1; system.out.println ("initMethodBeanService static block execute ...");} public initMethodBeAnservice () {System.Println ("InitMethodBeAnservice Construct Method Methode init () {System.out.println ("InitMethodBeanService Init Method Execute ...");} public Integer getF2 () {return f2;} public void setf2 (Integer f2) {this.f2 = f2; system.out.println ("InitMethodbeanService Setf2 Method Execute ...");}}}}}}}Los resultados de la ejecución se imprimen de la siguiente manera:
InitMethodBeanService Bloque estático Ejecute ... InitMethodBeanService Construct Method Ejecut ... InitMethodBeanService Setf2 Método Ejecutar ... InitMethodBeanService Init Method Execute ... Método de prueba Ejecutar ...
1.2 Interfaz de InicializingBean
Referencia: Documento oficial de primavera Beans-Factory-Lifecycle-InicializingBean
Una interfaz inicializadora declara un método AfterPropertIesset, que se llama después de que el contenedor de resorte instancia el objeto y establece el valor de la propiedad. Es consistente con la funcionalidad implementada anteriormente, el método init, por lo que Spring no recomienda usar la interfaz InitializingBean.
El ejemplo es relativamente simple, no en la lista
1.3 anotación de posteConstrucción
Traducción: Documento oficial de primavera Beans-Postconstruct-and-Predestroy-Annotations
@PostConstruct Annotation es un método de devolución de llamada del ciclo de vida que es consistente con la implementación del método init e inicializando las interfaces de Bean.
@PostConstructPublic Void Postconstruct () {System.out.println ("PostConstructService Postconstruct Method Ejecutar ...");}Resumir los tres métodos de devolución de llamada del ciclo de vida anterior, Interface Inicializando la Interfaz de Beque, @PostConstruct Annotation
1. Todos están instanciados y procesados postales para clases individuales
2. El tiempo de ejecución se llama después de la instancia de clase y se inyectan variables de miembros.
3. Para el método init, también puede configurar el método de inicialización predeterminado en el elemento Beans del archivo de configuración de Spring, y el elemento de configuración es el método de inicio predeterminado
4. Si los métodos de inicialización configurados en los tres métodos anteriores son diferentes, el orden de ejecución es: @PostConstruct Annotation Method> Inicializando el método AfterPropertIesset> Init-Method; Si los métodos configurados en los tres métodos son los mismos, el método se ejecutará solo una vez (consulte: Spring Document Document Beans-Factory-Lifecycle-Combined-Effect)
5. Hay un método inicial de devolución de llamada, y también hay un método de devolución de llamada destruido. @PostConstruct Annotation Method> Inicializando el AfterPropertIesset AfterPropertIesset> Los métodos init-métodos corresponden al método de anotación de @Predestroy> Método Destroy de Destroy de DisposableBean>
2. Extensión de nivel de contenedor
Traducción: Documento oficial de Spring 3.8ContainerExtensionPoints
En términos generales, los desarrolladores no necesitan personalizar una subclase de ApplicationContext para extender los contenedores SpringIOC. Los contenedores SpringioC pueden lograr la extensión de los contenedores SpringIOC a través de algunas interfaces expuestas.
2.1BeanPostProcessor Interfaz
Inicialización de instancia de 2.1.1.1Bean de la cadena postprocesador y postprocesador
La interfaz BeanPostProcessor define dos métodos de devolución de llamada a nivel de contenedor después del proceso de presentación y posprocesación posterior, que se utilizan para algún procesamiento lógico después de inicializar la instancia y se procesarán para todas las instancias en el contenedor. La clase que implementa la interfaz BeanPostProcessor se llama Postprocesador de inicialización de la instancia de Bean.
Si los posprocesadores de inicialización de instancias múltiples se integran en contenedores SpringIOC, el conjunto de estos postprocesadores se llama cadena de inicialización de la instancia de frijoles.
El método de posprocessbeforinitialización se ejecuta después de la instancia de clase y se completa la inyección de la variable de miembros, y antes del método de inicialización (como inicializando el método AfterPropertIesset de Inicialización de BeBean)
El método de posprocesación de autorización se ejecuta después de la instancia de clase y se completa la inyección de la variable miembro, y el método de inicialización (como inicializar el método AfterPropertIesset de inicialización de BeSBean) se ejecuta después de
Resumir:
1. El postprocesador de inicialización de la instancia se usa principalmente para algunas operaciones proxy en la instancia. Algunas características que usan AOP en Spring también se implementan a través de postprocesadores.
2. La cadena de postprocesador de inicialización de la instancia es múltiples postprocesadores, y habrá problemas con la orden de ejecución. Puede implementar la interfaz ordenada para especificar la orden de ejecución del postprocesamiento. La interfaz ordenada declara el método GetOrder. Cuanto menor sea el valor de retorno del método, mayor será la prioridad del postprocesamiento y la ejecución anterior.
3. Al inicializar el postprocesador implementando la interfaz BeanPostProcessor, se recomienda implementar la interfaz ordenada y especificar la prioridad.
4. El alcance de estos postprocesadores es el contenedor SpringioC actual, es decir, el contenedor SpringioC que se declara el postprocesador. Para los contenedores SpringIOC con estructuras jerárquicas, la inicialización de la cadena del procesador después de la instancia no actúa en la instancia inicializada por otros contenedores, incluso si los dos contenedores están en la misma jerarquía.
5. La clase de implementación del postprocesador de inicialización de instancia solo debe declararse igual que los frijoles administrados por resorte ordinarios. El contenedor SpringIOC lo detectará automáticamente y lo agregará a la cadena de postprocesador de inicialización de la instancia.
6. En comparación con la detección automática, también podemos llamar al método AddBeanPostProcessor de configurableBeanFactory para agregar programáticamente un posprocesador de inicialización de instancia a la cadena de posprocesador de inicialización de instancias. Esto es más práctico en escenarios en los que se deben determinar las condiciones de agregar. Este enfoque de programación ignora el orden especificado por la interfaz ordenada implementada, pero actuará en todas las instancias que se detectan automáticamente antes de la inicialización del postprocesador.
2.1.2 Postprocesador de inicialización de la instancia de frijol y AOP
BeanPostProcessor es una interfaz especial, y la clase que implementa esta interfaz se utilizará como postprocesador para instancias de frijoles administrados por resorte. Por lo tanto, en una etapa especial del inicio del contexto de la aplicación Spring, todas las instancias que implementan la interfaz BeanPostProcessor se inicializarán directamente, y las clases a la que se hace referencia la instancia también se instanciarán. Luego como postprocesador para aplicar a otras instancias normales.
Dado que el proxy automático de AOP se implementa en forma de instanciación de postprocesadores, ni la instancia de Bean inicializa la instancia de la cadena posterior al procesador o su instancia de referencia se puede proxy automáticamente. Por lo tanto, no teje en la cara en estos ejemplos. (Para estas instancias, se generará un mensaje de registro: "La clase FOO no puede ser procesada por todas las cadenas de postprocesador instanciadas, es decir, no se puede proxy automáticamente").
Nota: Cuando el postprocesador de instancia se refiere a otros frijoles en forma de Autowiring o @Resource, el contenedor de resorte puede inyectar frijoles no especificados cuando se inyecte con la dependencia de la coincidencia de tipo (por ejemplo, la clase de implementación de la instancia postprocesador depende de los frijoles en el formulario de recurso. inyectado en forma de coincidencia de tipo, y se puede inyectar un frijol no especificado en este momento). Esto también puede causar la representación automática u otros métodos de procesamiento de posprocesador de instanciación.
2.1.3 Ejemplo de posprocesador de inicialización de la instancia de bean
La clase pública BeanPostProcessorService implementa BeanPostProcessor {@Override Public Object PostProcessAfterInitialization (Object O, String S) lanza BeanSexception {System.out.Println ("BeanPostProcessSorSorService PostProcessAfterInitialization Method Extute ..."); regreso o;}@OBJETIVO PUBLES POSTRIDE OBJETIZACIÓN OBJETIZATIVE (TOMA STIRSETS (STILS STILSTSE (STILS STILS SHILS SHILSTSE STIL Beansexception {System.out.println ("BeanPostProcessorService PostProcessBeForeinitialization Method ejecutar ..."); return o;}}2.2BeanFactoryPostProcessor Interfaz
2.2.1 Postprocesador de beanfactory
Al implementar la interfaz BeanFactoryPostProcessor, puede leer los metadatos de configuración de los frijoles administrados por el contenedor y realizar cambios antes de que se instanciara el bean. Estos frijoles se denominan postprocesadores de beanfactory.
Similitudes y diferencias entre beanFactoryPostProcessors e interfaces de procesador de beanpost:
Similitudes:
Todos son postprocesadores a nivel de contenedor
Todos se pueden configurar con múltiples postprocesadores, y el orden de ejecución se especifica implementando la interfaz ordenada.
Se procesan para frijoles administrados en contenedores declarados por interfaces. En contenedores con estructuras jerárquicas, los frijoles en otros contenedores no se pueden procesar, incluso si los dos contenedores están en el mismo nivel.
Todos ellos solo necesitan ser declarados en el contenedor como frijoles ordinarios. El contenedor detectará y se registrará automáticamente como postprocesador.
Retrasar la configuración de la propiedad de inicialización se ignorará
Diferencias:
La interfaz BeanFactoryPostProcessors procesa los metadatos de configuración de los frijoles antes de la instancia de frijoles, y la interfaz del procesador de beanpost procesa la instancia del bean después de la instancia de frijoles **
La interfaz BeanFactoryPostProcessors también puede obtener una instancia de un Bean a través del método BeanFactory.getBean (), que hará que el Bean se instancie. Dado que el postprocesador de beanFactoryPostProcessors se ejecuta antes de que todos los frijoles se estén instanciados, el método BeanFactory.getBean () hará que el Bean se instanciará de antemano, rompiendo así el ciclo de vida del estándar del contenedor, lo que puede causar algunos impactos negativos (por ejemplo, el Bean de antemano ignorará el procesamiento del postpobre de Bean).
2.2.2 Postprocesador de Factory BeanFactory integrado y personalizado
Spring tiene postprocesadores de factores de bean incorporados (por ejemplo: PropertyPlaceHolderConfigurer y PropertyOverrideconfigurer). También admite la implementación de la interfaz BeanFactoryPostProcessor y personaliza el postprocesador de BeanFactory. Hablemos sobre los postprocesadores incorporados de Spring y postprocesadores personalizados.
PropertyPlaceHolderConfigurer
Para evitar los riesgos causados por la modificación del archivo de definición XML principal, Spring proporciona separación de configuración y puede configurar algunas variables que se pueden cambiar en el archivo de configuración de la propiedad y hacer referencia a él en el archivo de definición XML como marcador de posición. De esta manera, modificar la configuración solo requiere modificar el archivo de configuración del atributo. PropertyPlaceHolderConfigurer se utiliza para detectar a los marcadores de posición y reemplazar a los marcadores de posición con los valores de la propiedad de configuración. Los ejemplos son los siguientes:
PropertyPlaceHolderConfigurer utiliza el archivo de configuración de propiedades JDBC.Properties para reemplazar el marcador de posición de la propiedad por información relacionada con la base de datos en el bean de plato de datos con el valor de configuración correspondiente en tiempo de ejecución.
La configuración XML es la siguiente:
<Bean> <Property Name = "Locations" value = "classpath: com/foo/jdbc.properties"/> </bean> <bean id = "dataSource" destruye-method = "cerrar"> <propiedad name = "controladorclassname" valor = "$ {jdbc.driverClassNameName}"/> <name de propiedad = "url" Value = "$ {jdbc. name = "username" value = "$ {jdbc.username}"/> <propiedad name = "contraseña" valor = "$ {jdbc.password}"/>El archivo de configuración de atributos JDBC.Properties es el siguiente:
jdbc.driverClassName = org.hsqldb.jdbcdriverjdbc.url = jdbc: hsqldb: hsql: // producción: 9002jdbc.username = sajdbc.password = root
PropertyPlaceHolderConfigurer no solo admite la lectura de los archivos de configuración de la propiedad, sino que también admite la lectura de propiedades del sistema. La prioridad de lectura se puede configurar a través del valor de la propiedad SystemPropertiesMode. Los diversos valores se describen de la siguiente manera:
0: No lea las propiedades del sistema
1: Si la configuración para el marcador de posición correspondiente no se recupera en el archivo de configuración del atributo referenciado, se lee el atributo del sistema. El valor predeterminado es 1
2: Lea primero los atributos del sistema y luego lea el archivo de configuración del atributo referenciado. Esta configuración puede hacer que las propiedades del sistema sobrescriban el archivo de configuración.
ProperteroOverrideconfigurer
La clase PropertyOverRidEconfigurer puede asignar valores directamente a los frijoles en el contenedor refiriéndose al archivo de configuración de propiedades. Cuando la propiedad de un bean es asignada por múltiples instancias de clase PropertyOverRidEconfigurer, el último valor anula el anterior.
Asignación del bean de datos de datos anterior como ejemplo:
La clase PropertyOverRidEconfigurer utiliza una nueva forma de hacer referencia al archivo de configuración de la propiedad, de la siguiente manera:
<contexto: propiedad-override ubicación = "classpath: override.properties"/>
Las reglas de denominación de propiedades de anulación. El archivo de configuración de la propiedad de las propiedades es diferente de las anteriores (en el ejemplo anterior, es necesario asegurarse de que el nombre de la propiedad y el marcador de posición sean consistentes), y las reglas de nombres son BeanName.Property
dataSource.DrivClassName = com.mysql.jdbc.driverdatasource.url = jdbc: mysql: mydbdatasource.username = sadataSource.password = root
Admite la asignación de atributos compuestos, pero asegura que el objeto que hace referencia al atributo asignado no esté vacío, por ejemplo: foo.fred.bob.sammy = 123
Postprocesador de fábrica de frijoles personalizados
El postprocesador de fábrica de frijoles personalizado implementa la interfaz BeanFactoryPostProcessor para completar la modificación de los metadatos de configuración del BeA administrado por Spring Container. Por ejemplo: modificar el valor inyectado por los atributos de clase, el ejemplo es el siguiente:
Definir una clase de usuario userbean
Public Class UserBean {private String UserName; public String getUsername () {return username;} public void setUsername (string username) {this.Username = username;}}El archivo de configuración de Spring XML configura la clase de usuario e inyecta el valor jaja al nombre de usuario del atributo de nombre de usuario
<bean/> <bean id = "user"> <propiedad name = "username" value = "jaja"/> </bean>
A continuación se muestra un postprocesador de fábrica de bean personalizado, modifique el valor del nombre de usuario de la propiedad a Heihei
La clase pública BeanFactoryPostProcessorService implementa BeanFactoryPostProcessor {@Override public void PostProcessBeanFactory (configuraciónBeanBeanFactory BeanFactory) lanza BeanSexception {System.out.println ("BeanFactoryPosTprocessorSorService PostProcessBeanFactory Method Methode ejecutte ...");; Beandefinition bd = beanFactory.getBeanDefinition ("usuario"); MutablePropertyValues pv = bd.getPropertyValues (); if (pv.contains ("nombre de usuario")) {pv.addpropertyvalue ("nombre de usuario", "heihei"); }}}Resumir
Lo anterior es toda la explicación detallada de las devoluciones de llamada del ciclo de vida de resorte y las extensiones de contenedores en este artículo. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a este sitio:
Una breve discusión sobre la aplicación de anotaciones personalizadas en primavera
Análisis del código del COI de primavera
SpringMVC Interceptor Handlerinterceptor Code de uso de código de uso
Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!