延遲初始化Spring Bean的幾種方式


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

Spring 中默認是非延遲加載Bean的,也就是提前把Bean初始化好,用的時候直接用. 優點是運行的時候比較快(提前初始化了,直接用). 缺點是啟動慢和占用內存,因為要初始化很多Bean.

延遲加載是需要的時候再去初始化Bean. 優點是解約內存,啟動快(不需要提前初始化Bean). 缺點是運行的時候比較慢(用的時候先要初始化才能用).

@Lazy開啟Bean延遲加載

DemoApplication.java

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.java

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) 輸出

Spring 上下文啟動完成。。。。。
xxx.DefaultListableBeanFactory - Creating shared instance of singleton bean 'defaultRumenzFactory'
無參構造方法執行....
PostConstruct init.......
afterPropertiesSet.....
init method.......


不調用ac.getBean(DefaultRumenzFactory.class) 輸出

Spring 上下文啟動完成。。。。。  //沒有調用,所以沒有執行初始化

源碼:https://github.com/mifunc/Spring-Lazy-Bean

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM