SpringBoot调用SpringApplication.run()方法时,会有返回值
返回类型是ConfigurableApplicationContext接口类型,实际上返回的就是Spring容器
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringlearningApplication.class, args);
}
查看接口继承关系
可以发现, ApplicationContext的顶级父接口是SpringFactory,说明对SpringFactory做了功能增强
主要实现了一下四个接口的功能
MessageSource
ResourcePatternResolver
ApplicationEventPublisher
EnvironmentCapable
什么是BeanFactory?
-是 ApplicationContext的父接口
-是Spring的核心容器,比如context.getBean()方法由BeanFactory实现
-控制反转,基本的依赖注入,直至Bean的生命周期的各种功能,都有它的实现类提供(DefaultListableBeanFactory)
一.MessageSource
负责国际化,根据key,找到对不同的地区翻译的结果
key和value存在message.properties
例如:
message.properties存通用信息
message_en.properties存英文对应的信息
message_zh.properties存中文对应的信息
properties文件设置国际化配置
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringlearningApplication.class, args);
System.out.println(context.getMessage("hi", null, Locale.CHINA));
System.out.println(context.getMessage("hi", null, Locale.ENGLISH));
}
输出结果:
实现了对不同语言的不同消息,在浏览器请求的请求头中会携带语言信息。
二.ResourcePatternResolver 资源通配符处理器
可以根据通配符找到多个资源
//在类路径下找,如果资源在jar包中则找不到
System.out.println(context.getResource("classpath:application.properties"));
//用classpath* 可以在所有包中搜索
Resource[] resource = context.getResources("classpath*:META-INF/spring.factories");
for (Resource resource1 : resource) {
System.out.println(resource1);
}
输出结果:
三.EnvironmentCapable 环境适应
可以拿到当前的一些环境变量,不区分大小写
System.out.println(context.getEnvironment().getProperty("java_home"));
System.out.println(context.getEnvironment().getProperty("server.port"));
System.out.println(context.getEnvironment().getProperty("os"));
输出结果:
四.ApplicationEventPublisher 事件发布器
首先自定义一个时间class继承ApplicationEvent
import org.springframework.context.ApplicationEvent;
public class UserRegisteredEvent extends ApplicationEvent {
public UserRegisteredEvent(Object source) {
super(source);
}
}
发送事件:
构造方法传入的source 指的是事件的发送源
让context是事件源
context.publishEvent(new UserRegisteredEvent(context));
接受事件:
@Component
public class Componet {
@EventListener
public void get(UserRegisteredEvent event){
System.out.println(event);
System.out.println("监听到了时间");
}
}
可以在任何一个Bean内部监听事件,写一个方法,接受事件的类型要和传过来的事件类型一致,
方法上加@EventListener注解
执行效果:
成功的监听到了事件
小结:
1.BeanFactory 与 ApplicationContext 并不是简单的继承关系,后者组合并拓展了前者的功能
2.可以使用时间发布器来完成代码的解耦