method ioc injection dependency beans bean annotation java spring spring-bean

java - ioc - Pedido automático de primavera y @PostConstruct



spring ioc (2)

A continuación debe ser posible la secuencia

  1. beanb comienza a autowired
  2. Durante la inicialización de clase de Beanb , beana comienza a autowired
  3. Una vez que se haya creado beana, se invoca @PostConstruct es decir, init() de beana
  4. Dentro de init() , System.out.println("bean a is called"); se llama
  5. Entonces b.printMe(); se llama "causando System.out.println("print me is called in Bean B"); ejecutar
  6. Después de beana completado el beanb se llama @PostConstruct es decir, init() de beanb
  7. 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");