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请求, 首次访问的响应时间也会增长.
网友评论