springboot2全局指定@Lazy(懶加載)

0. 問題背景

?????????Spring默認(rèn)在啟動時立即實(shí)例化配置的bean,要修改為懶加載(在實(shí)際使用的時候?qū)嵗?.

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的懶加載,可以在對應(yīng)的類上直接使用@Lazy

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

?????????那么SpringBoot中如何全局配置懶加載呢?

1. SpringBoot中的全局配置

?????????通過在stackoverflow上查找, 發(fā)現(xiàn)的答案是, 在啟動類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);
    }

}

執(zhí)行 gradle bootRun 啟動應(yīng)用, 發(fā)現(xiàn)輸出了

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);
    }

}

這種方式實(shí)現(xiàn)了懶加載,但是這跟0.2中的方式是一樣的.

1.3 方式二
spring2.2中引入了一個application.properties中的新屬性.
spring.main.lazy-initialization=true來指定整個應(yīng)用的懶加載.
這種方式不論是@Component聲明的bean,還是@Bean聲明的bean, 都可以實(shí)現(xiàn)懶加載.

2. 懶加載的優(yōu)缺點(diǎn)

雖然 懶加載可以提升應(yīng)用的啟動速度, 但是不利于盡早的發(fā)現(xiàn)錯誤, 對于HTTP請求, 首次訪問的響應(yīng)時間也會增長.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容