Spring Bean 的生命周期大致分为:Bean定义,Bean初始化,Bean的生存期,Bean的销毁四个部分。
-
资源定位:
Spring 通过我们的配置 如@ComponentScan 定义扫描路径去找带有@Component的类,
这个过程就是一个资源定位的过程。 -
Bean定义:
一旦找到了资源,他就开始解析,并将信息保存起来。注意此时还没有初始化Bean,也就没有Bean实例,它 有的仅仅是Bean的定义。然后将Bean定义发送到IOC容器中。
此时依然只有定义。 -
初始化:
经过上述步骤,spring 会继续完成Bean 实例化和依赖注入。
如果不想让spring继续初始化,可在@ComponentScan中设置lazyInit =true(默认为false) -
初始化实例
spring 在完成依赖注入后,提供了一系列接口和配置完成Bean初始化过程
演示代码如下:
@Component
public class Person implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {
private String name=null;
public void changeName(String name) {
this.name = name;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("【" + this.getClass().getSimpleName() + "】 BeanFactoryAware 的setBeanFactory方法");
}
@Override
public void setBeanName(String s) {
System.out.println("【" + this.getClass().getSimpleName() + "】 调用 beanFactoryAware 的 setBeanName ");
}
@Override
public void destroy() throws Exception {
System.out.println("【" + this.getClass().getSimpleName() + "】 DisposableBean的destroy 方法");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("【" + this.getClass().getSimpleName() + "】 调用 initializingBean的 afterPropertiesSet 方法");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("【" + this.getClass().getSimpleName() + "】 调用ApplicationContextAware 的setApplicationContext");
}
@PostConstruct
public void init() {
System.out.println("【" + this.getClass().getSimpleName() + "】 注解PostConstruct定义的自定义初始化方法");
}
@PreDestroy
public void destory1() {
System.out.println("【" + this.getClass().getSimpleName() + "】注解@PreDestroy定义的自定义销毁方法");
}
}
@Component
public class BeanPostProcessorExample implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String s) throws BeansException {
log.info("BeanPostProcessor 调用 " + " postProcessBeforeinitialization 方法,参数 【" + bean.getClass ().getSimpleName()+"|"+ s);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String s) throws BeansException {
log.info("BeanPostProcessor 调用 " + " postProcessAfterinitialization 方法,参数 【" + bean.getClass ().getSimpleName()+"|"+ s);
return bean;
}
}
@SpringBootApplication
public class LearnApplication {
/*public static void main(String[] args) {
SpringApplication.run(LearnApplication.class, args);
}*/
public static void main (String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
Person person = ctx.getBean(Person.class);
person.changeName("Jack");
ctx.close();
}
}
@Configuration
@ComponentScan(value = "com.caril.*",lazyInit = true)
public class AppConfig {
}
下面Spring的Bean初始化的调用的流程
image.png image.png image.png image.png 20200907004258.png image.png image.png
网友评论