Spring ApplicationContext

本文详细介绍了Spring框架中的核心组件ApplicationContext的功能,包括资源加载、国际化支持、事件发布与监听等特性,并通过示例展示了如何使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ApplicationContext是一个IoC容器,但它扩展了IoC容器的许多功能:例如像资源的获取,国际化,事件的处理和传播等,你可以基于Spring容器来打造自己的应用程序框架。

首先我们通过ApplicationContext的源代码分析一下:

public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
                             ...
}

资源的获取: 

Spring提供了对资源文件的泛型存取,ApplicationContext它继承了org.springframework.core.io.ResourceLoader接口,你可以使用getResource()方法并指定资源文件的URL来取的一个实现Resource接口的实例。

例如:Resource res=context.getResource("classpath:admin.properties");

 

国际化:

ApplicationContext它继承了org.springframework.context.MessageSource接口,你可以使用getMessage()的各种版本的方法来取得文字消息的资源文件,从而实现国际化消息的目的。

你可以通过MessageSource的一个实现ResourceBundleMessageSource来取得国际化消息。

下面我们来实例里来说明:

首先定义一个配置文件:

<?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
">
<!-- basename 属性用来设置消息资源的前置档案文件名称,在这边设置是messages,表示
消息资源文件的名称可以是messages_en_US.properties等名称 -->
	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="messages"></property>
	</bean>
</beans>

 接着提供资源文件:这里提供两个资源文件一个是美式英语系的,另一个是中文系的

messages_en_US.properties

 

userLogin=User {0} login at {1}

 

messages_zh_TW.properties(由于直接使用Big5中文编码容器出现乱码,这里使用native2ascii进行了编码的转换)

 

userLogin=\u7528\u6237 {0} \u4E8E {1} \u767B\u5F55

 

测试类:

package com.messagesource;

import java.util.Calendar;
import java.util.Locale;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MessageSourceDemo {
	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("beans-config.xml");
		Object[] arguments=new Object[]{"乔彦辉",Calendar.getInstance().getTime()};
		/*
		 * getMessage(String code, Object[] args, Locale locale)
		 * 第一个参数表示属性文件中的key
		 * 第二个参数表示填充参数列表
		 * 第三个参数表示语言
		 */
		System.out.println(ac.getMessage("userLogin",arguments,Locale.US));
		System.out.println(ac.getMessage("userLogin",arguments,Locale.TAIWAN));
	}

}

 

输出结果为:

User 乔彦辉 login at 10/6/10 1:14 PM
用户 乔彦辉 于 2010/10/6 下午 1:14 登录

 监听事件:

在Spring应用程序执行期间,ApplicationContext本身就会发布一连串的事件,所有发布的事件都是抽象类org.springframework.context.ApplicationEvent的子类。例如:

ContextClosedEvent  在ApplicationContext关闭时发布的事件

ContextRefreshedEvent在初始化或refresh会发布的事件

RequestHandledEvent 在Web应用程序中,当请求被处理时,ApplicationContext会发布此事件。

如果你对这些事件感兴趣可以实现org.springframework.context.ApplicationListener接口。

ConsoleListener  仅在Debug时使用,会在文字模式下显示记录ApplicationContext的相关消息。

PerformanceMonitorListerner  在web应用程序中,搭配WebApplicationContext使用,可记录请求 的回应时间。

事件传播:

你可以使用ApplicationContext的publishEvent()方法来传播事件。

现在我们来实现一个简单的事件捕获的例子:

首先我们来定义一个事件:

package com.spring.ch042;

import org.springframework.context.ApplicationEvent;

public class MessageEvent extends ApplicationEvent{
	private static final long serialVersionUID = 1L;
	private String message;
	public MessageEvent(Object source,String message) {
		super(source);
		this.message=message;
	}
	public String getMessage(){
		return this.message;
	}
}

 

接着我们一个监听器,用来监听事件,并注册

package com.spring.ch042;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class MessageEventListener implements ApplicationListener{
	public void onApplicationEvent(ApplicationEvent event) {
		if(event instanceof MessageEvent){
			MessageEvent messageEvent=(MessageEvent)event;
			System.out.println("Received "+messageEvent.getMessage()+" from "+
					messageEvent.getSource());
		}
		
	}

}

 

<?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="publisher" class="com.spring.ch042.EventPublisherDemo"/>
<!-- 注册监听器 -->
<bean class="com.spring.ch042.MessageEventListener"/>
   
 </beans>

 

 

最后我们来测试一下:

 

 

 

package com.spring.ch042;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class EventPublisherDemo implements ApplicationContextAware{
	private ApplicationContext ctx;
	public void setApplicationContext(ApplicationContext ctx)
			throws BeansException {
		this.ctx=ctx;
	}
	public static void main(String[] args) {
		ApplicationContext ctx=new ClassPathXmlApplicationContext("/META-INF/eventdemo.xml");
		EventPublisherDemo pub=(EventPublisherDemo)ctx.getBean("publisher");
		pub.publish("Hello");
		pub.publish("The quick brown fox jumped over the lazy dog");
		
	}
	public void publish(String message){
		//发布事件
		this.ctx.publishEvent(new MessageEvent(this,message));
	}
}

 

输出结果为:

Received Hello from com.spring.ch042.EventPublisherDemo@a31e1b
Received The quick brown fox jumped over the lazy dog from com.spring.ch042.EventPublisherDemo@a31e1b

 到这里ApplicationContext常用的功能就介绍完了。如果大家知道其他的功能,希望指点。

 

资源下载链接为: https://pan.quark.cn/s/d37d4dbee12c A:计算机视觉,作为人工智能领域的关键分支,致力于赋予计算机系统 “看懂” 世界的能力,从图像、视频等视觉数据中提取有用信息并据此决策。 其发展历程颇为漫长。早期图像处理技术为其奠基,后续逐步探索三维信息提取,与人工智能结合,又经历数学理论深化、机器学习兴起,直至当下深度学习引领浪潮。如今,图像生成和合成技术不断发展,让计算机视觉更深入人们的日常生活。 计算机视觉综合了图像处理、机器学习、模式识别和深度学习等技术。深度学习兴起后,卷积神经网络成为核心工具,能自动提炼复杂图像特征。它的工作流程,首先是图像获取,用相机等设备捕获视觉信息并数字化;接着进行预处理,通过滤波、去噪等操作提升图像质量;然后进入关键的特征提取和描述环节,提炼图像关键信息;之后利用这些信息训练模型,学习视觉模式和规律;最终用于模式识别、分类、对象检测等实际应用。 在实际应用中,计算机视觉用途极为广泛。在安防领域,能进行人脸识别、目标跟踪,保障公共安全;在自动驾驶领域,帮助车辆识别道路、行人、交通标志,实现安全行驶;在医疗领域,辅助医生分析医学影像,进行疾病诊断;在工业领域,用于产品质量检测、机器人操作引导等。 不过,计算机视觉发展也面临挑战。比如图像生成技术带来深度伪造风险,虚假图像和视频可能误导大众、扰乱秩序。为此,各界积极研究检测技术,以应对这一问题。随着技术持续进步,计算机视觉有望在更多领域发挥更大作用,进一步改变人们的生活和工作方式 。
内容概要:该论文探讨了光纤通信中光脉冲传输性能的数值仿真方法,重点研究了光脉冲在光纤中传输时受到色散、损耗和非线性效应的影响。文章采用分步傅里叶方法求解非线性薛定谔方程(NLSE),并对高斯脉冲、超高斯脉冲和双曲正割脉冲三种常见光脉冲的传输演化进行了仿真分析。结果显示,双曲正割脉冲在相同的传输条件下具有最佳的抗色散和非线性能力。此外,论文还通过改变群速度色散(GVD)和非线性系数等参数,进一步分析了不同条件对光脉冲传输性能的影响,并提出了脉冲选择策略和系统设计建议。最后,通过性能评估指标对三种脉冲的传输性能进行了量化分析,验证了分步傅里叶方法的有效性,并为光纤通信系统的优化设计提供了指导。 适合人群:从事光纤通信领域研究的技术人员、研究生以及对光脉冲传输感兴趣的科研人员。 使用场景及目标:①理解光脉冲在光纤中传输时所受的色散、损耗和非线性效应的影响;②掌握分步傅里叶方法求解非线性薛定谔方程的具体步骤;③评估不同脉冲形状在光纤中的传输性能,选择合适的脉冲类型和优化系统参数;④为实际工程应用提供理论依据和技术支持。 其他说明:论文不仅提供了详细的仿真代码和结果分析,还通过扩展仿真展示了不同参数对光脉冲传输性能的影响,有助于读者更全面地理解光脉冲传输的物理机制和工程应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值