Ciclo de vida do feijão no springboot
Hoje, compartilho principalmente o processo do ciclo de vida do Bean no Springboot.
Processo do ciclo de vida do feijão
O ciclo de vida do feijão geralmente possui os quatro estágios a seguir:
-
Definição de bean
-
Inicialização do Bean
-
Vida útil do feijão
-
Destruição do feijão
Processo de definição de bean:
-
A primeira etapa, o posicionamento dos recursos, é que o Spring encontra a classe correspondente de acordo com nossa anotação definida (@Component).
-
Quando o recurso é encontrado, ele começa a analisar e salvar as informações definidas.Neste momento, o bean não é inicializado, o que precisa de atenção.
-
Em seguida, publique a definição do bean no contêiner SpringIoc.No momento, não há geração de bean no contêiner SpringIoc. Apenas informações definidas.
Inicialização do Bean
Após a definição e inicialização do Bean, o SPring continuará a concluir a injeção de instanciação e dependência do Bean, para que uma Bean concluída com injeção de dependência possa ser obtida no contêiner de IoC. O diagrama a seguir é um exemplo de um diagrama de inicialização:
Ciclo de vida do feijão
Teste o ciclo de vida do Bean através do código
Entre na interface do ciclo de vida
BeanNameAware,BeanFactoryAware,ApplicationContextAware,INitiali
zingBean,DisposableBean这几个接口, 并实现里面的方法
Implementação de código
Ambiente: jdk 1.8 springboot2.2 idea
Por meio da classe personalizada Children, para implementar a interface a ser chamada pela inicialização do Bean, tenha um entendimento mais profundo do processo do ciclo de vida do Bean.
-
Definir a interface Person class e Furit class
package chen.beanprocessor.model; public interface Person { void service(); // 设置水果类型 void eatFruit(Fruit fruit); } /** * @Author Chen * @Date 2020/4/18 17:04 **/ public interface Fruit { void use(); }
-
Defina as classes de implementação Person e Fruit Children e Apple, e injete a classe Apple no Children e adicione a interface de implementação do ciclo de vida ao Children:
/** * @Author Chen * @Date 2020/4/18 17:07 * 水果实现类Apple **/ @Component public class Apple implements Fruit { @Override public void use() { System.out.println(this.getClass().getSimpleName()+"这个苹果很甜"); } } @Component public class Children implements Person, BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean { Fruit fruit = null; // 注入水果类 public Children(@Autowired Fruit fruit){ this.fruit = fruit; } @Override public void service() { fruit.use(); } @Override public void eatFruit(Fruit fruit) { this.fruit = fruit; } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("this"+this.getClass().getSimpleName()+"调用BeanFactory的setBeanFactory方法"); } @Override public void setBeanName(String name) { System.out.println("this"+this.getClass().getSimpleName()+"调用setBeanName的方法"); } @Override public void destroy() throws Exception { System.out.println("this"+this.getClass().getSimpleName()+"调用DisposableBean的方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("this"+this.getClass().getSimpleName()+"调用Initializing的afterPropertiesSet()的方法"); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("this"+this.getClass().getSimpleName()+"调用Application的setApplicationContext的方法"); } @PostConstruct public void init(){ System.out.println(this.getClass().getSimpleName()+"注解@PostConstruct的自定义的初始化方法"); } @PreDestroy public void destory1(){ System.out.println(this.getClass().getSimpleName()+"调用@dPrDestory的自定义销毁的方法"); } }
3. Defina a classe de teste
@SpringBootApplication
public class BeanprocessorApplication {
public static void main(String[] args) {
SpringApplication.run(BeanprocessorApplication.class, args);
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
Person person = applicationContext.getBean(Children.class);
System.out.println("===========初始化完成==========");
person.service();
applicationContext.close();
}
}
Resultado do teste
thisChildren调用setBeanName的方法
thisChildren调用BeanFactory的setBeanFactory方法
thisChildren调用Application的setApplicationContext的方法
Children注解@PostConstruct的自定义的初始化方法
thisChildren调用Initializing的afterPropertiesSet()的方法
2020-04-18 17:28:38.902 INFO 9784 --- [ main] c.b.BeanprocessorApplication : Started BeanprocessorApplication in 0.682 seconds (JVM running for 1.29)
thisChildren调用setBeanName的方法
thisChildren调用BeanFactory的setBeanFactory方法
thisChildren调用Application的setApplicationContext的方法
Children注解@PostConstruct的自定义的初始化方法
thisChildren调用Initializing的afterPropertiesSet()的方法
===========初始化完成==========
Apple这个苹果很甜
Children调用@dPrDestory的自定义销毁的方法
thisChildren调用DisposableBean的方法
Children调用@dPrDestory的自定义销毁的方法
thisChildren调用DisposableBean的方法
Os resultados do teste podem ver claramente o ciclo de vida do feijão. A partir dos resultados do teste, o Bean é inicializado duas vezes, porque quando a classe Children é inicializada, a classe Apple injetada também é inicializada.
A palavra-código não é fácil, por favor, goste
A palavra-código não é fácil, por favor, goste
A palavra-código não é fácil, por favor, goste
Somente depois de rastrear a fonte podemos avançar
Materiais de referência:
"Introdução aprofundada ao SpringBoot" Yang Kaizhen