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();
相关推荐
寻星探路8 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧10 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法11 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72511 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎11 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄11 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿11 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds12 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹12 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚12 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言