- 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 上下文启动完成。。。。。 //没有调用,因此没有执行初始化