1. Sumber Rekod BeanDefinition
Bekas spring kosong pada mulanya Anda perlu pergi ke pelbagai sumber untuk mencari sumber beanDefinition atau fail xml. Dalam kaedah pembinaan, sumber utama akan diperolehi, iaitu kelas bootstrap, dan beanDefinition akan diperolehi mengikut kelas bootstrap.
2. Buat kesimpulan jenis aplikasi
Tentukan jenis rujukan berdasarkan pakej balang
3. Rekodkan pemula ApplicationContext
Perluas Konteks Aplikasi
4. Pendengar rekodDengar acara penting5. Analisis larian SpringApplication1 Dapatkan SpringApplicationRunListeners, namanya tidak bagus, ia sebenarnya penerbit acaraTerbitkan acara permulaan aplikasi, terbitkan acara pada nod penting apabila program bermulapublic static void main(String[] args) throws Exception{ // 添加 app 监听器 SpringApplication app = new SpringApplication(); app.addListeners(e -> System.out.println(e.getClass())); // 获取事件发送器实现类名 List<String> names = SpringFactoriesLoader.loadFactoryNames(SpringApplicationRunListener.class, A39_2.class.getClassLoader()); for (String name : names) { System.out.println(name); Class<?> clazz = Class.forName(name); Constructor<?> constructor = clazz.getConstructor(SpringApplication.class, String[].class); SpringApplicationRunListener publisher = (SpringApplicationRunListener) constructor.newInstance(app, args); // 发布事件 DefaultBootstrapContext bootstrapContext = new DefaultBootstrapContext(); publisher.starting(bootstrapContext); // spring boot 开始启动 publisher.environmentPrepared(bootstrapContext, new StandardEnvironment()); // 环境信息准备完毕 GenericApplicationContext context = new GenericApplicationContext(); publisher.contextPrepared(context); // 在 spring 容器创建,并调用初始化器之后,发送此事件 publisher.contextLoaded(context); // 所有 bean definition 加载完毕 context.refresh(); publisher.started(context); // spring 容器初始化完成(refresh 方法调用完毕) publisher.running(context); // spring boot 启动完毕 publisher.failed(context, new Exception("出错了")); // spring boot 启动出错 }
public static void main(String[] args) throws IOException { ApplicationEnvironment env = new ApplicationEnvironment(); // 系统环境变量, properties, yaml env.getPropertySources().addLast(new ResourcePropertySource(new ClassPathResource("step3.properties"))); env.getPropertySources().addFirst(new SimpleCommandLinePropertySource(args)); for (PropertySource<?> ps : env.getPropertySources()) { System.out.println(ps); } // System.out.println(env.getProperty("JAVA_HOME")); System.out.println(env.getProperty("server.port")); }
Persekitaran aplikasi Penerbitan telah menyediakan acara
public static void main(String[] args) throws IOException, NoSuchFieldException { ApplicationEnvironment env = new ApplicationEnvironment(); env.getPropertySources().addLast( new ResourcePropertySource("step4", new ClassPathResource("step4.properties")) ); ConfigurationPropertySources.attach(env); for (PropertySource<?> ps : env.getPropertySources()) { System.out.println(ps); } System.out.println(env.getProperty("user.first-name")); System.out.println(env.getProperty("user.middle-name")); System.out.println(env.getProperty("user.last-name")); } }
5. Env pasca pemprosesan (*) melalui EnvironmentPostProcessorApplicationListener (*)
application.properties, dihuraikan oleh StandardConfigDataLocationResolver
><🎜 .application.jsonpublic class Step5 { public static void main(String[] args) { SpringApplication app = new SpringApplication(); app.addListeners(new EnvironmentPostProcessorApplicationListener()); /*List<String> names = SpringFactoriesLoader.loadFactoryNames(EnvironmentPostProcessor.class, Step5.class.getClassLoader()); for (String name : names) { System.out.println(name); }*/ EventPublishingRunListener publisher = new EventPublishingRunListener(app, args); ApplicationEnvironment env = new ApplicationEnvironment(); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>> 增强前"); for (PropertySource<?> ps : env.getPropertySources()) { System.out.println(ps); } publisher.environmentPrepared(new DefaultBootstrapContext(), env); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>> 增强后"); for (PropertySource<?> ps : env.getPropertySources()) { System.out.println(ps); } } private static void test1() { SpringApplication app = new SpringApplication(); ApplicationEnvironment env = new ApplicationEnvironment(); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>> 增强前"); for (PropertySource<?> ps : env.getPropertySources()) { System.out.println(ps); } ConfigDataEnvironmentPostProcessor postProcessor1 = new ConfigDataEnvironmentPostProcessor(new DeferredLogs(), new DefaultBootstrapContext()); postProcessor1.postProcessEnvironment(env, app); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>> 增强后"); for (PropertySource<?> ps : env.getPropertySources()) { System.out.println(ps); } RandomValuePropertySourceEnvironmentPostProcessor postProcessor2 = new RandomValuePropertySourceEnvironmentPostProcessor(new DeferredLog()); postProcessor2.postProcessEnvironment(env, app); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>> 增强后"); for (PropertySource<?> ps : env.getPropertySources()) { System.out.println(ps); } System.out.println(env.getProperty("server.port")); System.out.println(env.getProperty("random.int")); System.out.println(env.getProperty("random.int")); System.out.println(env.getProperty("random.int")); System.out.println(env.getProperty("random.uuid")); System.out.println(env.getProperty("random.uuid")); System.out.println(env.getProperty("random.uuid")); } }
public class Step6 { // 绑定 spring.main 前缀的 key value 至 SpringApplication, 请通过 debug 查看 public static void main(String[] args) throws IOException { SpringApplication application = new SpringApplication(); ApplicationEnvironment env = new ApplicationEnvironment(); env.getPropertySources().addLast(new ResourcePropertySource("step6", new ClassPathResource("step6.properties"))); System.out.println(application); Binder.get(env).bind("spring.main", Bindable.ofInstance(application)); System.out.println(application); }
public class Step7 { public static void main(String[] args) { ApplicationEnvironment env = new ApplicationEnvironment(); SpringApplicationBannerPrinter printer = new SpringApplicationBannerPrinter( new DefaultResourceLoader(), new SpringBootBanner() ); // 测试文字 banner // env.getPropertySources().addLast(new MapPropertySource("custom", Map.of("spring.banner.location","banner1.txt"))); // 测试图片 banner // env.getPropertySources().addLast(new MapPropertySource("custom", Map.of("spring.banner.image.location","banner2.png"))); // 版本号的获取 System.out.println(SpringBootVersion.getVersion()); printer.print(env, Step7.class, System.out); } }
private static GenericApplicationContext createApplicationContext(WebApplicationType type) { GenericApplicationContext context = null; switch (type) { case SERVLET -> context = new AnnotationConfigServletWebServerApplicationContext(); case REACTIVE -> context = new AnnotationConfigReactiveWebServerApplicationContext(); case NONE -> context = new AnnotationConfigApplicationContext(); } return context; }
DefaultListableBeanFactory beanFactory = context.getDefaultListableBeanFactory(); AnnotatedBeanDefinitionReader reader1 = new AnnotatedBeanDefinitionReader(beanFactory); XmlBeanDefinitionReader reader2 = new XmlBeanDefinitionReader(beanFactory); ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(beanFactory); reader1.register(Config.class); reader2.loadBeanDefinitions(new ClassPathResource("b03.xml")); scanner.scan("com.itheima.a39.sub");
Terbitkan aplikasi sedia Acara
Terdapat pengecualian, terbitkan aplikasi acara gagal
Atas ialah kandungan terperinci Apakah proses permulaan asas Springboot?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!