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

写在前面

Spring在启动时,默认会将单实例bean举行实例化,并加载到Spring容器中。也就是说,单实例bean默认在Spring容器启动的时刻建立工具,并将工具加载到Spring容器中。若是我们需要对某个bean举行延迟加载,我们该若何处置呢?此时,就需要使用到@Lazy注解了。

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

懒加载

懒加载就是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()方式,输出的效果信息如下所示。

Zookeeper实现服务注册/发现

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注解驱动开发不再渺茫。

原创文章,作者:28x29新闻网,如若转载,请注明出处:https://www.28x29.com/archives/14531.html