- 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 上下文啓動完成。。。。。 //沒有調用,因此沒有執行初始化