懒加载
懒加载就是Spring容器启动的时候,先不创建对象,在第一次使用(获取)bean的时候,创建并使用对象,大家是不是想到了在【设计模式】专题中的单例模式呢?对单例模式不太了解的同学可以猛戳《浅谈JAVA设计模式之——单例模式(Singleton)》,也可以查看《设计模式汇总——你需要掌握的23种设计模式都在这儿了!》来系统学习每种设计模式。
非懒加载模式
此时,我们将PersonConfig2类的配置修改成单实例bean,如下所示。
package io.mykit.spring.plugins.register.config; import io.mykit.spring.bean.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author binghe * @version 1.0.0 * @description 测试@Scope注解设置的作用域 */ @Configuration public class PersonConfig2 { @Bean("person") public Person person(){ System.out.println("给容器中添加Person...."); return new Person("binghe002", 18); } }
接下来,在SpringBeanTest类中创建testAnnotationConfig5()方法,如下所示。
@Test public void testAnnotationConfig5(){ ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class); System.out.println("IOC容器创建完成"); }
运行SpringBeanTest类中的testAnnotationConfig5()方法,输出的结果信息如下所示。
给容器中添加Person.... IOC容器创建完成
可以看到,单实例bean在Spring容器启动的时候就会被创建,并加载到Spring容器中。
懒加载模式
我们在PersonConfig2的person()方法上加上@Lazy注解将Person对象设置为懒加载,如下所示。
package io.mykit.spring.plugins.register.config; import io.mykit.spring.bean.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; /** * @author binghe * @version 1.0.0 * @description 测试@Scope注解设置的作用域 */ @Configuration public class PersonConfig2 { @Lazy @Bean("person") public Person person(){ System.out.println("给容器中添加Person...."); return new Person("binghe002", 18); } }
此时,我们再次运行SpringBeanTest类中的testAnnotationConfig5()方法,输出的结果信息如下所示。
IOC容器创建完成
可以看到,此时,只是打印出了“IOC容器创建完成”,说明此时,只创建了IOC容器,并没有创建bean对象。
那么,加上@Lazy注解后,bean是何时创建的呢?我们在SpringBeanTest类中的testAnnotationConfig5()方法中获取下person对象,如下所示。
@Test public void testAnnotationConfig5(){ ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class); System.out.println("IOC容器创建完成"); Person person = (Person) context.getBean("person"); }
此时,我们再次运行SpringBeanTest类中的testAnnotationConfig5()方法,输出的结果信息如下所示。
IOC容器创建完成 给容器中添加Person....
说明,我们在获取bean的时候,创建了bean对象并加载到Spring容器中。
那么,问题又来了,只是第一次获取bean的时候创建bean对象吗?多次获取会不会创建多个bean对象呢?我们再来完善下测试用例,在在SpringBeanTest类中的testAnnotationConfig5()方法中,再次获取person对象,并比较两次获取的person对象是否相等,如下所示。
IOC容器创建完成 给容器中添加Person.... true
从输出结果中,可以看出使用@Lazy注解标注后,单实例bean对象只是在第一次从Spring容器中获取对象时创建,以后每次获取bean对象时,直接返回创建好的对象。