延迟初始化Spring Bean的几种方式

  • XML 配置:<bean lazy-init=”true” ... />
  • Java 注解:@Lazy(true)

Spring 中默认是非延迟加载Bean的,也就是提早把Bean初始化好,用的时候直接用. 优势是运行的时候比较快(提早初始化了,直接用). 缺点是启动慢和占用内存,由于要初始化不少Bean.html

延迟加载是须要的时候再去初始化Bean. 优势是解约内存,启动快(不须要提早初始化Bean). 缺点是运行的时候比较慢(用的时候先要初始化才能用).java

@Lazy开启Bean延迟加载

DemoApplication.javagit

package com.rumenz;
public class DemoApplication {
    public static  void main(String[] args) {
        AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
        ac.register(DemoApplication.class);
        ac.refresh();
        System.out.println("Spring 上下文启动完成。。。。。");
        //开启了延迟加载,调用的时候才会初始化
        final DefaultRumenzFactory bean = ac.getBean(DefaultRumenzFactory.class);
        ac.close();
    }
    @Bean(initMethod = "initMethod")
    @Lazy //开启延迟加载
    public static  DefaultRumenzFactory defaultRumenzFactory(){
        return new DefaultRumenzFactory();
    }
}

DefaultRumenzFactory.javagithub

package com.rumenz;
public class DefaultRumenzFactory implements  InitializingBean {

    public DefaultRumenzFactory() {
        System.out.println("无参构造方法执行....");
    }

    @PostConstruct
    public void init(){
        System.out.println("PostConstruct init.......");
    }
    public void initMethod(){
        System.out.println("init method.......");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet.....");
    }
}

调用ac.getBean(DefaultRumenzFactory.class) 输出ide

Spring 上下文启动完成。。。。。
xxx.DefaultListableBeanFactory - Creating shared instance of singleton bean 'defaultRumenzFactory'
无参构造方法执行....
PostConstruct init.......
afterPropertiesSet.....
init method.......

不调用ac.getBean(DefaultRumenzFactory.class) 输出code

Spring 上下文启动完成。。。。。  //没有调用,因此没有执行初始化

源码:https://github.com/mifunc/Spring-Lazy-Beanhtm

原文: https://rumenz.com/rumenbiji/Spring-Lazy-Bean.html内存

相关文章
相关标签/搜索