Spring源码系列(补充):详解ApplicationContext
在之前的文章中,我们已经对Spring源码中的一些核心概念进行了分析。由于篇幅限制,我们并没有详细解释ApplicationContext类所继承的父接口及其作用。因此,本文将单独为ApplicationContext进行详细说明,包括其继承的父接口及其作用。
ApplicationContext父接口MessageSource大家应该都比较熟悉MessageSource,它用于国际化,许多项目都会使用它。使用MessageSource的基本步骤如下:
(资料图片)
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); String message = applicationContext.getMessage("test", null, new Locale("en")); System.out.println(message);
你需要在resources路径下创建相应的语言文件。例如,在本文的代码示例中,我们使用了“en”语言,因此需要创建messages_en.properties文件,其内容如下:
test=b
这样,当我们获取“test”语言时,就会得到“b”。
ResourcePatternResolverResourcePatternResolver主要用于获取资源,即资源加载,可以加载某个文件的内容。具体步骤如下:
// 创建一个Spring容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);//String message = applicationContext.getMessage("test", null, new Locale("en"));//System.out.println(message);Resource resource = applicationContext.getResource("classpath:spring.properties");System.out.println(resource.contentLength());
除此之外,ResourcePatternResolver还有其他用法,例如:
// 创建一个Spring容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);//String message = applicationContext.getMessage("test", null, new Locale("en"));//System.out.println(message);Resource resource = applicationContext.getResource("https://www.baidu.com");System.out.println(resource.contentLength());System.out.println(resource.getURL());//还可以获取多个资源Resource[] resources = applicationContext.getResources("classpath:com/xiaoyu/*.class");Arrays.stream(resources).forEach(System.out::println);
以上只是简单的示例,具体使用方法还需根据实际情况进行调整。
EnvironmentCapable获取运行时环境可以使用ApplicationContext的getEnvironment方法,具体用法如下:
// 创建一个Spring容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);applicationContext.getEnvironment().getPropertySources().forEach(System.out::println);System.out.println("================");applicationContext.getEnvironment().getSystemEnvironment().forEach((k, v) -> System.out.println(k + " : " + v));System.out.println("================");applicationContext.getEnvironment().getSystemProperties().forEach((k, v) -> System.out.println(k + " : " + v));System.out.println("================");System.out.println(applicationContext.getEnvironment().getProperty("sun.jnu.encoding"));System.out.println(applicationContext.getEnvironment().getProperty("xiaoyu"));
@PropertySource("classpath:spring.properties")
注意,可以使用@PropertySource注解将spring.properties添加到运行时环境,然后通过getProperty方法去获取。
ApplicationEventPublisherApplicationEventPublisher是一个事件发布器,我们可以通过ApplicationContext来发布一个相应的事件,具体步骤如下:
// 创建一个Spring容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); //发布自己的事件applicationContext.publishEvent(new MyEvent("xiaoyu"));
定义自己的事件:
public class MyEvent extends ApplicationEvent {private String message;public MyEvent(String message) {super(message);this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}}
创建一个事件监听器,可以监听所有事件,也可以单独监听自己的事件。如果想要监听所有事件,直接去掉泛型即可。Spring的事件也可以监听到,因此在监听部分需要自己判断是什么事件。具体步骤如下:
@Componentpublic class MyEventListener implements ApplicationListener {/** * Handle an application event. * * @param event the event to respond to */@Overridepublic void onApplicationEvent(MyEvent event) {if (event instanceof MyEvent) {System.out.println(((MyEvent) event).getMessage());}System.out.println(event);}}
OrderComparator这里注意下,OrderComparator并不是ApplicationContext的父接口,它是Spring内部提供的一种比较器,用于排序实现了Order接口或者@Order注解的bean。虽然在工作中我们也会用到排序,但单独写一篇文章可能并不必要,因此在这里简单提一下。
他是Spring内部提供的一种比较器,用于排序实现了order接口或者@order注解,首先定义两个具体的bean,具体用法如下:
public class First implements Ordered {@Overridepublic int getOrder() {return 1;}}
public class Second implements Ordered {@Overridepublic int getOrder() {return 2;}}
First first = new First();Second second = new Second();Arrays.asList(first, second).stream().sorted(OrderComparator.INSTANCE).forEach(System.out::println);
这样就会升序排序,数值越小越在前面,如果使用的是注解形式的@order,则使用下面的实例:
First first = new First();Second second = new Second();Arrays.asList(first, second).stream().sorted(AnnotationAwareOrderComparator.INSTANCE).forEach(System.out::println);
注意,OrderComparator只适用于实现了Ordered接口或者@Order注解的bean,如果需要对其他类型的对象进行排序,可以使用其他比较器。
结语至此,Spring的核心概念解析告一段落,但这只是一个开始,后续我们将深入理解Spring的源码。因此,建议仔细查看Spring的核心关键类,对于后续查看Spring源码会非常有帮助。同时,在实际项目中多关注Spring框架,加深对其理解和掌握。
关键词:
下一篇:最后一页
精心推荐
- 上海发布进一步优化调整疫情防控的相关措施-天天快资讯
- 山西汾酒12月6日获沪股通净买入2.19亿-播报
- 去年京津冀工信部门推进签约570多项高端高新项目
- 京津冀区域协同创新指数增长迅速
- 1至2月河北省工业生产平稳开局 规模以上工业增加值同比增长6.0%
- 浙江绍兴15日0-21时新增41例确诊病例
- 沈阳大气优良天数达近5年来最好水平
- 辽宁实行市级政府集中监管 首站定点冷库加强疫情防控
- 辽宁省25个博士后团队冲刺全国博士后创新创业大赛
- 安徽省宿州市埇桥区大营镇大营新村调整为中风险地区
- 云南哀牢山4名地质调查人员因公殉职原因查明
- 全国首部涉及“非现场执法”的法规施行 浦东新区打造引领区数字化城市治理样板
- 杭州一封控小区完成第三轮核酸检测 前两轮检测均为阴性
- 集采未中选药品现在怎么样了?这组数据告诉你
-
(四川统战人说统战事)“海归”博士后王暾:专注灾害预警科技创新 打通灾害预警“最后一公里” 中新网成都12月15日电 (起钰婷)“国
-
中新网福建平和12月15日电 (周晓彬 马淑惠)12月15日,福建省平和县人民法院依法宣判蔡某金等10人涉恶犯罪案件。 法院审理查明,20
-
中新网郑州12月15日电 (记者 韩章云)针对近日网友实名举报中国农业发展银行太康县支行员工夏某华吃空饷一事,中国农业发展银行河南省
-
中新网宿迁12月15日电 (记者 刘林)“房子干净又敞亮,社区漂亮又整洁。”15日,家住江苏宿迁牛角淹社区的袁有亮谈起新家,兴奋的心情
-
中新网通辽12月15日电 (记者 张林虎)15日,记者从内蒙古自治区通辽市科左后旗公安局获悉,该局打掉一个帮助网络犯罪转账的“跑分团队
X 关闭
行业排行
- 1、深圳:积极推进旅游业恢复 扎实推动经济稳定增长
- 2、保定定州提出一系列发展措施 引领体品产业向智能化品牌化高端化迈进
- 3、河北省财政厅充分发挥财政职能作用 促进交通运输事业发展
- 4、太原阳曲人才公寓项目开启施工招标工作 共有1954套人才公寓满足人才居住需求
- 5、山西出口钢构件顺利发货 为企业加强科技创新开辟了更为广阔的发展空间
- 6、上半年泰州姜堰实现新签约亿元和1000万美元以上项目95个 计划总投资208.319亿元
- 7、清华博士非洲修电站 因为他,“内卷”成为网络热词
- 8、内蒙古新增本土确诊病例3例 均在呼伦贝尔满洲里市
- 9、31省份新增新冠肺炎确诊病例67例 其中本土50例
- 10、浙江新增本土确诊病例45例 其中宁波6例、绍兴39例
X 关闭
产业
-
不用跑北京 在家门口也能挂上顶...
日前,我省首个神经疾病会诊中心——首都医科大学宣武医院河北医院...
-
“十四五”期间 河北省将优化快...
从省邮政管理局获悉,十四五期间,我省将优化快递空间布局,着力构...
-
张家口市宣化区:光伏发电站赋能...
3月19日拍摄的张家口市宣化区春光乡曹庄子村光伏发电站。张家口市宣...
-
“张同学”商标被多方抢注 涉及...
“张同学”商标被多方抢注,官方曾点名批评恶意抢注“丁真” ...
-
山东济南“防诈奶奶团”花式反诈...
中新网济南12月15日电 (李明芮)“老有所为 无私奉献 志愿服...
-
广州新增1例境外输入关联无症状...
广州卫健委今日通报,2021年12月15日,在对入境转运专班工作人...
-
西安报告初筛阳性病例转为确诊病例
12月15日10:20,经陕西西安市级专家组会诊,西安市报告新冠病毒...
-
广东东莞新增本土确诊病例2例 ...
(抗击新冠肺炎)广东东莞新增本土确诊病例2例 全市全员核酸检测...
-
中缅边境临沧:民警深夜出击捣毁...
中新网临沧12月15日电 (胡波 邱珺珲)记者15日从云南临沧边境...
-
“土家鼓王”彭承金:致力传承土...
中新网恩施12月15日电 题:“土家鼓王”彭承金:致力传承土家...