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)時間也會增長.