java - ioc - Pedido automático de primavera y @PostConstruct
spring ioc (2)
A continuación debe ser posible la secuencia
-
beanbcomienza a autowired - Durante la inicialización de clase de
Beanb, beana comienza a autowired - Una vez que se haya creado beana, se invoca
@PostConstructes decir,init()de beana - Dentro de
init(),System.out.println("bean a is called");se llama - Entonces
b.printMe();se llama "causandoSystem.out.println("print me is called in Bean B");ejecutar - Después de
beanacompletado elbeanbse llama@PostConstructes decir,init()debeanb - Entonces
System.out.println("beanb is called");se llama
Idealmente, lo mismo puede ser observado mejor por un depurador en eclipse.
El manual de referencia de Spring explica cómo se resuelven las dependencias circulares. Los granos se instancian primero, luego se inyectan unos en otros.
Tengo una pregunta sobre el orden de cableado automático y la lógica @PostConstruct en Spring. Por ejemplo, después del código de demostración, tengo una clase principal de Spring Boot:
@SpringBootApplication
public class Demo1Application {
@Autowired
BeanB beanb;
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}
y 2 Definiciones de Servicio:
@Service
public class BeanB {
@Autowired
private BeanA beana ;
@PostConstruct
public void init(){
System.out.println("beanb is called");
}
public void printMe(){
System.out.println("print me is called in Bean B");
}
}
@Service
public class BeanA {
@Autowired
private BeanB b;
@PostConstruct
public void init(){
System.out.println("bean a is called");
b.printMe();
}
}
y tengo la siguiente salida:
frijol a se llama
Imprímeme se llama en Bean B
beanb se llama
Mi pregunta es ¿cómo se realiza el cableado automático paso a paso como un escenario anterior?
¿Y cómo se printMe() método printMe() de beanb sin llamar primero a @PostConstruct ?
Su respuesta es correcta como se muestra en su pregunta.
Ahora obteniendo el concepto de Notación @Autowired . Todos los objetos @Autowired se inicializan y se cargan en la memoria justo después de que se realiza la carga de la clase.
Ahora aquí está tu SpringBootApplication
@SpringBootApplication
public class Demo1Application {
@Autowired
BeanB beanb; // You are trying to autowire a Bean class Named BeanB.
Aquí, en la Aplicación de consola anterior que ha escrito, intente autowire e inyecte un objeto de tipo BeanB .
Ahora aquí está tu definición de BeanB
@Service
public class BeanB {
@Autowired
private BeanA beana ;
En la clase BeanB está intentando inyectar el objeto de Class BeanA que también se define en el proyecto de su consola.
Por lo tanto, en su Demo1Application para inyectar un Objeto de la Clase BeanB debe necesitar inyectar un Objeto de la clase BeanA . Ahora se crea primero el objeto BeanA Class.
Ahora si ves la definición de tu clase BeanA
@Service
public class BeanA {
@Autowired
private BeanB b;
@PostConstruct // after Creating bean init() will be execute.
public void init(){
System.out.println("bean a is called");
b.printMe();
}
}
Por lo tanto, después de inyectar el método Object BeanA , se unirá el enlace con la anotación @PostContruct .
Entonces, el flujo de ejecución será ..
System.out.println("bean a is called");
System.out.println("print me is called in Bean B");
System.out.println("beanb is called");