springboot2全局指定@Lazy(懒加载)

0. 问题背景

         Spring默认在启动时立即实例化配置的bean,要修改为懒加载(在实际使用的时候实例化).

0.1 在xml配置中:

<beans ... default-lazy-init="true"> //全局配置
<bean ...  lazy-init="true" /> //指定bean配置

0.2 在JavaConfig配置中:

//全局配置
@Configuration
@Lazy
public class AppConfig {}

//指定bean配置
@Configuration
public class AppConfig{
    @Bean
    @Lazy
    public LazyBean lazyBean(){
        return new LazyBean();
    }
}

0.3 SpringBoot中指定bean的懒加载,可以在对应的类上直接使用@Lazy

@Component
@Lazy
public class LazyBean {
    public LazyBean() {
        System.out.println("LazyBean should be lazzzzyyyyyy!!!");
    }
    public void doSomething() {}
}

         那么SpringBoot中如何全局配置懒加载呢?

1. SpringBoot中的全局配置

         通过在stackoverflow上查找, 发现的答案是, 在启动类SpringbootApplication上加上@Lazy注解即可. 原来注解@SpringBootApplication是@Configuration, @EnableAutoConfiguration和@ComponentScan注解的合体.
而这个SpringbootApplication本身就是个配置类, 所以在上面加@Lazy注解理论上是可以的.果然是直观的东西不方便, 方便的东西不直观.
1.1 错误方式一:

//spring boot中声明bean
@Component
public class LazyBean {
    public LazyBean() {
        System.out.println("LazyBean should be lazzzzyyyyyy!!!");
    }
    public void doSomething() {}
}


//配置类上加注解
@SpringBootApplication
@Lazy
public class SpringbootApplication {
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(SpringbootApplication.class, args);
    }

}

执行 gradle bootRun 启动应用, 发现输出了

LazyBean should be lazzzzyyyyyy!!!

也就是说配置并没有生效. 但是so上的回答一般不会是错的. 那会是哪里出了问题呢?
1.2 方式一修正
不使用@Component, 而是在配置文件中声明bean:

//@Component
public class LazyBean {
    public LazyBean() {
        System.out.println("LazyBean should be lazzzzyyyyyy!!!");
    }
    public void doSomething() {}
}

//配置类
@SpringBootApplication
@Lazy
public class SpringbootApplication {

   //在配置类中声明bean
    @Bean
    public LazyBean lazyBean() {
        return new LazyBean();
    }
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(SpringbootApplication.class, args);
    }

}

这种方式实现了懒加载,但是这跟0.2中的方式是一样的.

1.3 方式二
spring2.2中引入了一个application.properties中的新属性.
spring.main.lazy-initialization=true来指定整个应用的懒加载.
这种方式不论是@Component声明的bean,还是@Bean声明的bean, 都可以实现懒加载.

2. 懒加载的优缺点

虽然 懒加载可以提升应用的启动速度, 但是不利于尽早的发现错误, 对于HTTP请求, 首次访问的响应时间也会增长.