Spring 源码解析(一)

56 阅读1分钟

本文先介绍一下ApplicationContext

主要类图

image-20240901224558495.png

image-20240901234355832.png

1)beanFactory 2)4个扩展功能

MessageSource:国际化语言

    public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);

        // 多语言 失败!!!

        String message1 = context.getMessage("hello", null, new Locale("zh", "CN"));
        String message2 = context.getMessage("hello", null, new Locale("en", "US"));
        System.out.println(message1);
        System.out.println(message2);
   }

image-20240901234237475.png

ResourcePatternResolver:根据正则表达式获取资源路径

@SpringBootApplication
public class Main {
    public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);
        Resource[] resources = context.getResources("classpath:messages_en.properties");
        for (Resource resource : resources) {
            System.out.println(resource);
        }
    }
}

image-20240901231603519.png 从结果上看,已经获取到资源了!

ApplicationEventPublisher:获取环境变量

        ConfigurableEnvironment environment = context.getEnvironment();
        String property = environment.getProperty("server.port");
        System.out.println(property);

image-20240901232527102.png

ApplicationEventPublisher:事件

public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);
        // 发出事件
        context.publishEvent(new MyEvent("123232"));
}
// 继承 ApplicationEvent 的自定义事件
public class MyEvent extends ApplicationEvent {
    public MyEvent(Object source) {
        super(source);
    }
}
// 监听事件
@Component
public class Listener {

    @EventListener
    public void onApplicationEvent(MyEvent event) {
        System.out.println("收到事件:" + event.getSource());
    }
    
}

image-20240901234018030.png

总结,ApplicationContext继承了多个类,也就是获得了多个类的功能,而且,上述的四个其他能力也比较实用。其中,国际化是海外项目或者大型项目用得比较多的功能,spring boot项目启动时也能获取环境变量并打印,而事件运用的就更加广泛了。

------------------关注--------------------------------------------------评论----------------------------