01-new SpringApplication

准备配置Bean

java 复制代码
@Configuration
public class TestSpringApplication {

    static class Bean1 {
    }

    static class Bean2 {
    }

    static class Bean3 {
    }

    @Bean
    public Bean2 bean2() {
        return new Bean2();
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        return new TomcatServletWebServerFactory();
    }

}

准备配置文件

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bean1" class="com.you.meet.nice.test.web.springboot.TestSpringApplication.Bean1"/>

</beans>

测试加载BeanDefinition

测试推断应用类型

测试初始化器

测试主类推断

java 复制代码
System.out.println("1. 从源中获取BeanDefinition");
// 配置类中获取
SpringApplication springApplication = new SpringApplication(TestSpringApplication.class);
// xml中获取
springApplication.setSources(CollUtil.newHashSet(
    "classpath:b01.xml"
));

System.out.println("2. 推断应用类型");
Method deduceFromClasspath = WebApplicationType.class.getDeclaredMethod("deduceFromClasspath");
deduceFromClasspath.setAccessible(true);
// 静态方法  不需要对象
System.out.println("\t应用类型:" + deduceFromClasspath.invoke(null));

System.out.println("3. 添加初始化器");
springApplication.addInitializers(applicationContext -> {
    if (applicationContext instanceof GenericApplicationContext) {
        GenericApplicationContext gac = (GenericApplicationContext) applicationContext;
        // 这个初始化器被调用时  会注册一个bean
        gac.registerBean("bean3", Bean3.class);
    }
});

System.out.println("4. 添加监听器");
springApplication.addListeners(event -> {
    System.out.println("\t事件为:" + event.getClass());
});

System.out.println("5. 主类推断");
Method deduceMainApplicationClass = SpringApplication.class.getDeclaredMethod("deduceMainApplicationClass");
deduceMainApplicationClass.setAccessible(true);
System.out.println("\t主类为:" + deduceMainApplicationClass.invoke(springApplication));

ConfigurableApplicationContext applicationContext = springApplication.run(args);
// 创建ApplicationContext
// 调用初始化器对ApplicationContext做扩展
// ApplicationContext.refresh


for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) {
    System.out.println("beanName:" + beanDefinitionName + " 来源=>" + applicationContext.getBeanFactory().getBeanDefinition(beanDefinitionName).getResourceDescription());
}
applicationContext.close();
相关推荐
知其然亦知其所以然14 分钟前
Spring AI 入门实战:我用七个关键词,彻底搞懂了它的核心概念!
java·后端·spring
码农颜16 分钟前
java 设计模式_行为型_19命令模式
java·设计模式·命令模式
魔镜魔镜_谁是世界上最漂亮的小仙女22 分钟前
java-JDBC
java·后端
gorgor在码农26 分钟前
Spring Boot多数据源切换:三种实现方式详解与实战
java·spring boot·后端·mybatis·mybatis plus·多数据源切换
jarenyVO27 分钟前
Spring Cloud Gateway 全面学习指南
java·gateway
一名小码农39 分钟前
线上GC count突增问题排查及修复记录
java·gc·调优·线上问题·死循环·线上
RexTechie1 小时前
Spring Cloud Alibaba 中间件
java·spring cloud·中间件
RexTechie1 小时前
Spring Cloud 原生中间件
spring·spring cloud·中间件
chanalbert1 小时前
Spring Boot诞生背景:从Spring的困境到设计破局
java·spring boot·spring
小袁搬码1 小时前
Eclise中Lombck配置
java·eclipse·lombok