类加载与Spring框架@Lazy延迟加载

类加载

什么是类加载

类加载就是指--将类读入到了JVM的内存中,就是类加载到了内存中,可以进行使用.

class Point{}
public class TestClassLoader01 {
    public static void main(String[] args) {
        Point p1;
    }
}

那么上面这段代码中,"Point p1;"声明语句有将Point类加载到内存中吗?通过什么方式能证明它被加载到内存中了呢?

如何验证?
可以基于JVM的参数配置:
在类中右键->Run As->Run Configurations->Arguments->VM arguments中输入:-XX:+TraceClassLoading

运行后显示:
类加载与Spring框架@Lazy延迟加载_第1张图片

运行后会显示大段上图所示的显示语句,均是运行程序时所加载的类,可以利用快捷键Ctrl+F来查找我们所自己编写的Point类,发现并没有被加载.

上述代码中,仅仅是将Point类做了声明,得到的结果是并没有被加载到内存中;那么如果我们实际new出对象呢?

将上述代码修改:

class Point{}
public class TestClassLoader01 {
    public static void main(String[] args) {
        Point p1 = new Point();
    }
}

再次运行后显示:
类加载与Spring框架@Lazy延迟加载_第2张图片

在控制台的运行结果的截取片段中,我们可以看到标红的框内可以看到已经加载到了我们所编写的Point类.

结论

根据上边简单的示例,我们可以得到结论:

只是引用类,是不会加载到JVM内存中的;
需要创建真正的实例对象(new/反射创建对象)才会将类加载到JVM内存中.

@Lazy的加载

之前的文章中也提到过@Lazy注解是Spring框架的一大优势--延迟加载,可以让大对象(占用内存较多)使用时才创建,得以有效的节省内存资源.

那么,该注解所谓的延迟加载,究竟是将描述的类何时加载呢?

我们可以根据上文中验证类加载的方法,去验证@Lazy的延迟加载,可以在控制台看到,加载信息中已经存在@Lazy注解描述的类的加载信息了.

结论

所以我们也就知道,@Lazy注解所谓的延迟加载,并不是说将类先不加载到JVM内存中,而是先不创建实例对象.

从另一个方面来理解,@Lazy都是描述Spring框架Bean池中的对象,Bean池中的对象都是Spring框架已经创建好的存储在Bean池中的,所以会加载也是理所应当的.

你可能感兴趣的:(java,spring)