注册监听器
AbstractApplicationContext refresh()
private void registerListeners() throws BeansException {
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let post-processors apply to them!
Collection listeners = getBeansOfType(ApplicationListener.class, true, false).values();
for (Iterator it = listeners.iterator(); it.hasNext();) {
addListener((ApplicationListener) it.next());
}
}
public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {
private TaskExecutor taskExecutor = new SyncTaskExecutor();
/**
* Set the TaskExecutor to execute application listeners with.
* <p>Default is a SyncTaskExecutor, executing the listeners synchronously
* in the calling thread.
* <p>Consider specifying an asynchronous TaskExecutor here to not block the
* caller until all listeners have been executed. However, note that asynchronous
* execution will not participate in the caller's thread context (class loader,
* transaction association) unless the TaskExecutor explicitly supports this.
* @see org.springframework.core.task.SyncTaskExecutor
* @see org.springframework.core.task.SimpleAsyncTaskExecutor
* @see org.springframework.scheduling.timer.TimerTaskExecutor
*/
public void setTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = (taskExecutor != null ? taskExecutor : new SyncTaskExecutor());
}
/**
* Return the current TaskExecutor for this multicaster.
*/
protected TaskExecutor getTaskExecutor() {
return taskExecutor;
}
广播事件
public void multicastEvent(final ApplicationEvent event) {
for (Iterator it = getApplicationListeners().iterator(); it.hasNext();) {
final ApplicationListener listener = (ApplicationListener) it.next();
getTaskExecutor().execute(new Runnable() {
public void run() {
listener.onApplicationEvent(event);
}
});
}
}
}
FrameworkServlet
this.webApplicationContext.publishEvent(
new ServletRequestHandledEvent(this,
request.getRequestURI(), request.getRemoteAddr(),
request.getMethod(), getServletConfig().getServletName(),
WebUtils.getSessionId(request), getUsernameForRequest(request),
processingTime, failureCause));
具体的事件处理
public class PerformanceMonitorListener implements ApplicationListener {
protected final Log logger = LogFactory.getLog(getClass());
protected final ResponseTimeMonitorImpl responseTimeMonitor = new ResponseTimeMonitorImpl();
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof RequestHandledEvent) {
RequestHandledEvent rhe = (RequestHandledEvent) event;
this.responseTimeMonitor.recordResponseTime(rhe.getProcessingTimeMillis());
if (logger.isTraceEnabled()) {
// Stringifying objects is expensive. Don't do it unless it will show.
logger.trace("PerformanceMonitorListener: last=[" + rhe.getProcessingTimeMillis() + "ms]; " +
this.responseTimeMonitor + "; " + rhe.getShortDescription());
}
}
}
}
分享到:
相关推荐
Apollo在客户端中通过MetaServer配置和AppId配置实现动态配置获取,支持配置监听和配置变化事件的实时推送。 Sleuth是Spring Cloud应用中的一个分布式跟踪系统,它集成Zipkin,通过日志收集服务调用链数据。Zipkin...
Spring Cloud是建立在Spring Boot基础上的一系列微服务开发工具,它提供了服务发现、配置中心、负载均衡、熔断机制等功能,帮助开发者构建云原生的应用。 这份"Spring框架学习笔记"会深入探讨以上各个知识点,通过...
Spring的IoC容器在这些基础上提供了更多高级服务,比如bean的实例缓存、生命周期管理、代理、事件发布和资源加载等。 Spring的高层容器视图展示了容器启动时如何读取应用提供的配置信息,生成bean配置注册表,然后...
- **ApplicationContext**:是一种高级的Spring容器,除了提供BeanFactory的所有功能外,还增加了国际化支持、事件发布机制等功能。 通过以上介绍,我们可以看到Spring框架不仅功能强大,而且设计得非常灵活。无论...
在Spring中,AOP通过代理机制实现,可以将这些关注点以声明式的方式插入到业务逻辑中,使得代码更加简洁,降低了系统的复杂性。 3. **Spring全家桶**:Spring框架不仅包含Spring Core,还包括Spring MVC、Spring ...
动力节点老杜Spring6配套笔记主要讲解了Spring框架的一些核心概念和最佳实践,特别是针对代码设计中的开闭原则(Open-Closed Principle, OCP)进行了深入探讨。在给出的代码示例中,我们可以看到一个简单的用户登录...
标题和描述均提到了“spring指南学习笔记”,这意味着文档聚焦于Spring框架的学习心得与关键概念。Spring是一个开源的Java企业级应用框架,以其强大的依赖注入(Dependency Injection, DI)和面向切面编程(Aspect ...
【SpringBoot核心特性】 SpringBoot是Spring框架的一个扩展,它旨在简化Spring应用程序的开发过程,...这份学习笔记涵盖了SpringBoot的基础特性和SpringCloud的负载均衡实践,对于深入理解这两个技术有极大的帮助。
2. **Spring Context**:建立在Core之上,提供了一个配置文件的加载机制及事件传播机制。 3. **Spring AOP**:提供了面向切面编程的实现,让开发者能够更加方便地实现诸如事务管理等功能。 4. **Spring DAO**:提供...
此外,笔记还可能涉及了Spring Cloud Config(配置管理工具)、Spring Cloud Bus(事件、消息总线)、Spring Cloud Stream(消息驱动的编程模型)等高级主题。 学习SpringCloud时,理解每个组件的作用及其在微服务...
《Spring Security 3笔记》 在深入探讨Spring Security 3的知识点之前,我们先了解下这个框架的基本概念。Spring Security是Spring生态系统中的一个组件,它为Java应用提供了全面的安全服务,包括认证、授权以及Web...
- **3.2 循环依赖**:讲解了如何处理对象间的循环依赖问题,Spring通过三级缓存机制来解决这个问题,确保所有Bean的正确初始化。 - **3.3 更多DI的知识**:介绍更高级的注入方式,如`@Autowired`注解、`@Qualifier`...
5. **Spring Cloud Bus**:事件、消息总线,可以广播配置更改,也可以用于微服务间的通信。 6. **Feign**:声明式服务调用,通过接口定义来简化服务间调用的编写。 7. **Spring Cloud LoadBalancer**:负载均衡器...
《Spring技术内幕 学习笔记》是一份深入探讨Spring框架核心机制的学习资料,结合作者zzc1684在iteye博客上的博文,我们可以从中学习到Spring框架的多个重要知识点。Spring作为Java企业级应用开发的基石,其设计思想...
Spring Cloud Bus作为微服务间的轻量级通信机制,常配合Config使用,实现配置的动态刷新,也可以用于其他服务间的消息传递。 9. **Spring Cloud Gateway** Spring Cloud Gateway是SpringCloud的新一代API网关,...
Spring笔记中提到的技术知识点主要围绕Hibernate框架展开,Hibernate是一个开放源代码的对象关系映射(Object/Relational Mapping,简称ORM)框架,用于Java环境。它对JDBC进行了非常轻量级的对象封装,使得开发者...
Spring框架是Java应用开发中广泛使用的轻量级框架,它以IoC(Inversion of Control,控制反转)和DI...通过深入理解并熟练运用这些概念和机制,开发者可以更好地利用Spring来构建高质量、可扩展的应用程序。
2. **Spring Context**:建立在Spring Core基础上,提供了国际化支持、资源加载机制、事件传播机制等高级特性。 3. **Spring AOP**:提供了面向切面编程的支持。AOP允许将横切关注点(如日志、安全检查)从业务逻辑...
**Spring3笔记** Spring是企业级应用的全面解决方案,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等。以下是关键点: 1. **依赖注入(Dependency Injection, DI)**: 通过容器管理组件之间的依赖关系,...
7. **Spring Security**:Spring的安全管理组件,提供了一套全面的认证和授权机制,保护Web应用免受安全威胁。 8. **Spring Data**:一套用于简化数据访问的库,支持多种数据存储技术,如JPA、MongoDB等,提供了...