Este artículo estudia principalmente el contenido relevante de la orden de ejecución de carga de frijol de primavera, de la siguiente manera.
Fuente del problema:
Hay un frijol que es A y un frijol que es B. Cuando A está instanciado, desea asignar un nombre de propiedad a un método FunB al valor de retorno de B.
Si solo está escrito en A:
private B b;
private String name = b.funb();
Se informará un error y NullPointException se debe a que B no se ha establecido en este momento, por lo que es nulo.
La solución es el siguiente código, y al mismo tiempo, aprenda la orden de ejecución de inicializar el método de construcción de objetos y el método init en primavera.
Public Class A implementa InicializingBean {Private B b; Nombre de cadena privada; // = B.Funb (); public void setb (b b) {system.out.println ("a.setb inicializado"); this.b = b;} public a () {System.out.println ("A Inicializado");} public void init () {System.out.println ("init"); this.name = b.funb ();}@anular public String toString () {return super.ToString () + this.name;} public void AfterPropertIesset () arroja excepción {// de hecho, también es posible ponerlo aquí // this.name = b.funb (); System.out.println ("AfterPropertiesSet");}} public class B {public String funb () {System.out.println ("Funb"); return "B.Funb";} public B () {System.out.println ("B Inicializado");}}Archivo de configuración de resorte
<Beans Default-AUTOWIRE = "BYNAME"> <bean id = "a" init-method = "init"> </ bean> <bean id = "b"> </le bean> </beans>
Código de prueba:
public static void main (String [] args) {ApplicationContext contextte = new FileSystemXMLApplicationContext ("Src/TestSpring/Bean.xml"); A a = (a) context.getBean ("A"); System.out.println (a);}La salida del programa es:
Un inicial
B Inicialmente
A.setb inicialmente
Después de la propiedad
inicio
funb
[email protected]
Desde aquí, podemos ver que el atributo de nombre de A se establece correctamente en el valor de retorno del método FUNB de B cuando se carga el bean. El punto clave es usar el método init para implementarlo.
El orden de carga también se puede ver como:
Primer constructor -> luego B Establecer la inyección del método -> Inicializando el método AfterPropertIesset -> Método Init -Method
El siguiente contenido se extrae del libro, pero descubrí que incluso si lo extrae una vez, ¡mi comprensión de su contenido será más profundo!
1. El proceso de la frijol del ensamblaje de resorte
1. Instanciación;
2. Establecer el valor del atributo;
3. Si se implementa la interfaz BeanNameaware, llame a SetBeanName para establecer la ID o el nombre de Bean;
4. Si implementa la interfaz BeanFactoryaware, llame a SetBeanFactory para establecer BeanFactory;
5. Si se implementa ApplicationContextAware, llame a SetApplicationContext para establecer ApplicationContext
6. Llame al método de preinicialización del Posteador de Post Bean;
7. Llame al método AfterPropertiesSet () para inicializar el Bean;
8. Llame al método de método init personalizado;
9. Llame al método de postinicialización del Posteo de BeanPost;
Proceso de apagado del contenedor de primavera
1. Llame a DisposableBean Destro ();
2. Llame al método personalizado de destrucción del método;
1. Frijol único
carga
1. Instanciación;
2. Establecer el valor del atributo;
3. Si se implementa la interfaz BeanNameaware, llame a SetBeanName para establecer la ID o el nombre de Bean;
4. Si implementa la interfaz BeanFactoryaware, llame a SetBeanFactory para establecer BeanFactory;
5. Si se implementa ApplicationContextAware, llame a SetApplicationContext para establecer ApplicationContext
6. Llame al método de preinicialización del Posteador de Post Bean;
7. Llame al método AfterPropertiesSet () para inicializar el Bean;
8. Llame al método de método init personalizado;
9. Llame al método de postinicialización del Posteo de BeanPost;
Cerrar el contenedor de primavera
1. Llame a DisposableBean Destro ();
2. Llame al método personalizado de destrucción del método;
2. El orden de múltiples frijoles
Priorizar la carga de beanpostprocessor Implementation Bean
En orden de la definición de frijoles, el orden de carga de frijoles (incluso si hay ID sobrescribir al cargar múltiples archivos de resorte)
Cuando "establece el valor del atributo" (paso 2), al encontrar la ref, el bean correspondiente a la identificación de la ref se carga primero después de "instanciación" (paso 1).
La subclase de AbstractFactoryBean llamará al método CreateInstance después del paso 6, y luego se llamará al método GetObjectType.
La clase BeanFactoryUtils también cambiará el orden de carga de los frijoles.
Lo anterior es todo el contenido de este artículo sobre el orden de implementación de la carga de frijol de primavera, y espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!