基于Spring加载类、构造方法、静态块、加载先后顺序

2 篇文章 0 订阅
1 篇文章 0 订阅

以前面试有做到一个题,类、构造方法、静态块的执行顺序,这几天突然想到如果在SpringBoot下的执行顺序呢?为什么不用Spring,在这个小demo中SpringBoot无需额外的配置直接可以写我想要的代码,所以这个结果对于Spring来说是一样的。Spring Boot基本上是Spring框架的扩展,它消除了设置Spring应用程序所需的XML配置,为更快,更高效的开发生态系统铺平了道路。废话不多说,代码走起!

创建一个SpringBoot项目,目录如下
在这里插入图片描述
config类:主要用于某类没有注解为组件,Spring无法管理。

@Configuration
public class BeanConfig {

    static {
        System.out.println("BeanConfig~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~静态块");
    }

	@Bean
    public TestParent testParent(){
        return new TestParent();
    }
}

entity类:

//实体子
@Component
public class TestChild extends TestParent{

    static{
        System.out.println("TestChild类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~静态代码块");
    }

    {
        System.out.println("TestChild类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~构造块");
    }
    private EntityD d = new EntityD("TestChild");

    public TestChild() {
        System.out.println("testChild类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~构造方法");
    }

    public TestChild(String str) {
        System.out.println("testChild类~~~~~~~~~~~~~~~~~~~"+str+"~~~~~~~~~~~~~~~~~~~~~~~~~~~构造方法");
    }

}

//实体父
public class TestParent {

    static{
        System.out.println("TestParent类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~静态代码块");
    }

    private EntityD d = new EntityD("TestParent");

    public TestParent() {
        System.out.println("testParent类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~构造方法");
    }

}

//实体C
@Component
public class TestC {

    static{
        System.out.println("testC类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~静态代码块1111111");
    }

	private static EntityD d = new EntityD("TestC");
    
    static{
        System.out.println("testC类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~静态代码块222222");
    }

    public TestC() {
        System.out.println("testC类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~构造方法");
    }
}

//实体类D
public class EntityD {
	public EntityD(String str){
	        System.out.println(str+"类~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~EntityD成员变量");
    }
}

Test测试类:

@SpringBootTest
public class DemoApplicationTests {

    static {
        System.out.println("DemoApplicationTests~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~静态块");
    }

    @Autowired
    private TestC testc;

    @Test
    public void say(){
        System.out.println("执行测试方法");
        
    }

}

结构好了,让我们启动DemoApplicationTests中的say方法看看,输出结果吧
在这里插入图片描述
得到的结论:因为由Spring管理对象的生命周期,所以会扫描Component、@Configuration注解的类

1.静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关,且只执行一次。(TestC的静态代码块之间)
2. 先执行父类的静态代码块和静态变量初始化,再执行子类的静态代码块和静态变量初始化。(TestB静态块先打印是因为TestA继承TestB,当Spring加载TestA时,会先去加载TestB)
3. 构造块先构造函数前执行,执行父类的实例变量初始化再执行父类的构造函数 ,然后执行子类的实例变量初始化最后执行子类的构造函数。 (实体类构造前有隐式的super(),调用父类的构造方法)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值