SpringBoot原理之一_类加载顺序、SpringBoot启动过程

1.SpringBoot的类加载顺序怎么能知道? 在Bean的默认构造函数里面使用System.out.println就能知道创建顺序。

2.一个问题:SpringBoot的main函数中能够使用IOC容器中的Bean吗? 可以,但不能是通过注解注入的,只能是在run程序之后,通过ApplicationContext获取的。 这要搞清楚SpringBoot的启动过程,连Tomcat都是在run程序之后创建的,Spring容器更是之后了。 在启动类中用注解为成员变量注入值,由于先加载成员变量,之后加载静态的main函数,成员变量被加载并默认初始化时,main函数还没运行,Spring框架都还没启动,自然无法处理启动类中的注解。【注意,这与启动类中成员变量是否被static修饰无关,根本原因是启动类中成员变量被创建时,Spring框架还没启动】【另外,成员变量被加载就是被创建吗?从表现上看不是这么回事,因为构造函数中的System.out.println方法没有执行,可见加载只是创建引用变量,默认初始化只是指向默认的null对象,此时并没有创建对象,只有new才会创建对象。注意:JVM加载类并不等于】

JVM加载类的过程:加载、初始化、实例化,实例化才是调用new构造函数 https://blog..net/justloveyou_/article/details/72466416

public class Test {
          
   
    private TestA testA = new TestA();
    private static TestB testB = new TestB();

    public static void main(String[] args) {
          
   
        System.out.println("Test");
    }
}


class TestA{
          
   
    public TestA(){
          
   
        System.out.println("TestA");
    }
}

class TestB{
          
   
    public TestB(){
          
   
        System.out.println("TestB");
    }
}

输出:
TestB
Test

注意:
TestA即使被new了,但是并没有创建

另外一点,手动new的对象,其注解都不会起作用,已经与SpringIOC容器无关了。此时再从SpringIOC中取出注解装入的该类实例,可以看到是两个不同的实例。 @Scope修饰为单例也没用,new的时候是直接调用构造函数,与注解无关,注解起作用的时机在SpringIOC容器创建并扫描包的时候。

与加载顺序相关的注解: @DependOn @Order

经验分享 程序员 微信小程序 职场和发展