【Spring注解驱动开发】使用@Lazy注解实现懒加载

Spring在启动时,默认会将单实例bean进行实例化,并加载Spring容器中。也就是说,单实例bean默认在Spring容器启动的时候创建对象,并将对象加载到Spring容器中。如果我们需要对某个bean进行延迟加载,我们该如何处理呢?此时,就需要使用到@Lazy注解了。

项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation

懒加载

懒加载就是Spring容器启动的时候,先不创建对象,在第一次使用(获取)bean的时候,创建并使用对象,大家是不是想到了在【设计模式】专题中的单例模式呢?对单例模式不太了解的同学可以猛戳《》,也可以查看《》来系统学习每种设计模式。

非懒加载模式

此时,我们将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对象时,直接返回创建好的对象。

总结

懒加载,也称延时加载。仅对单例bean生效。单例bean是在Spring容器启动的时候加载的,添加@Lazy注解后就会延迟加载,在Spring容器启动的时候并不会加载,而是在第一次使用此bean的时候才会加载,但当你多次获取bean的时候不会重复加载,只是在第一次获取的时候会加载,这不是延迟加载的特性,而是单例Bean的特性。

好了,咱们今天就聊到这儿吧!别忘了给个在看和转发,让更多的人看到,一起学习一起进步!!

项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Spring注解驱动开发。公众号回复“spring注解”关键字,领取Spring注解驱动开发核心知识图,让Spring注解驱动开发不再迷茫。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxzxg.html