springBoot的Bean懒加载

前提:四种将bean加载搭到spring容器的方式

1、@Configuration +@bean

2、@component

3、@import

4、META-INF/spring.factories 中的 key = org.springframework.boot.autoconfigure.EnableAutoConfiguration、

      注:其中3、4也可以用于:a项目引入b项目的bean  这种场景

 

一、@Configuration+@Bean+@Lazy形式

@Configuration
public class BeanConfig {

    @Bean
    @Lazy(value = true)
    public People people() {
        return new People();
    }
}

 

1、@Lazy(value = true):默认为true,不执行构造方法

2、@Lazy(value = false):执行构造方法

3、@Lazy():默认为true,不执行构造方法

4、无@Lazy:不执行构造方法

 

注:无论如何context.containsBean("people")  都为true。因为bean是方法三级缓存的map集合中,key=beanName可定是有了,value=bean可能没有。

 

二、@Component+@Lazy形式

@Component
@Lazy(value = true)
public class Animal {

    public Animal() {
        System.out.println("************你************");
    }
}

1、@Lazy(value = true):默认为true,不执行构造方法

2、@Lazy(value = false):执行构造方法

3、@Lazy():默认为true,不执行构造方法

4、无@Lazy:执行构造方法

 

三、@Import+@Lazy形式

@Import(value = {God.class})

@Lazy(value=false)
public class God {
    public God() {
        System.out.println("****************他**************");
    }
}

1、@Lazy(value = true):默认为true,不执行构造方法

2、@Lazy(value = false):执行构造方法

3、@Lazy():默认为true,不执行构造方法

4、无@Lazy:执行构造方法

 

四、classpath下的META-INF/spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
config.DogConfig,\
entity.Sheep

1、@Lazy(value = true):默认为true,不执行构造方法

2、@Lazy(value = false):执行构造方法

3、@Lazy():默认为true,不执行构造方法

4、无@Lazy:执行构造方法

 

五、后处理Bean

1、可以加一个后处理Bean

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

        前方法();

        后方法();

}

2、后处理Bean的前方法、后方法伴随着构造方法执行。要执行都执行,要不执行都不执行

3、执行顺序:构造方法--->前方法--->后方法

4、执行的位置:SpringApplication.class  run()--->refreshContext()--->refresh()--->AbstractApplicationContext.class  refresh()--->finishBeanFactoryInitialization()  执行非懒加载的bean--->ConfigurableListableBeanFactory.class  preInstantiateSingletons()

你可能感兴趣的:(JAVA)