java - ioc - Pedido automático de primavera y @PostConstruct
spring ioc (2)
A continuación debe ser posible la secuencia
-
beanb
comienza a autowired - Durante la inicialización de clase de
Beanb
, beana comienza a autowired - Una vez que se haya creado beana, se invoca
@PostConstruct
es 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
beana
completado elbeanb
se llama@PostConstruct
es 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");