SpringBoot中设置Listener解析

news/2024/7/17 9:36:45 标签: java, python

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

java">package listener;

import java.util.EventListener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ListenerExample {
	static class MyListener implements ServletContextListener {

		@Override
		public void contextInitialized(ServletContextEvent sce) {
			System.out.println("contextInitialized--->"+this);
		}

		@Override
		public void contextDestroyed(ServletContextEvent sce) {

		}

	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Bean
	public ServletListenerRegistrationBean getExampleListener() {
		ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean<>();
		registrationBean.setListener(new MyListener());
		registrationBean.setOrder(1);
		return registrationBean;
	}
}

代码很简单,就这样。

我们来看看调用栈

java">at listener.ListenerExample$MyListener.contextInitialized(ListenerExample.java:19)
	at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187)
	at io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:205)
	at io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:174)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:239)
	at org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory.createDeploymentManager(UndertowEmbeddedServletContainerFactory.java:410)
	at org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory.getEmbeddedServletContainer(UndertowEmbeddedServletContainerFactory.java:235)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
	at server.Boot.main(Boot.java:13)

选择1个断点

stop in io.undertow.servlet.core.ApplicationListeners.contextInitialized

OK,断点搞定,进来分析一下

java">public void contextInitialized() {
        if(!started) {
            return;
        }
        //new listeners can be added here, so we don't use an iterator
        final ServletContextEvent event = new ServletContextEvent(servletContext);
        for (int i = 0; i < servletContextListeners.length; ++i) {
            ManagedListener listener = servletContextListeners[i];
            IN_PROGRAMATIC_SC_LISTENER_INVOCATION.set(listener.isProgramatic() ? PROGRAMATIC_LISTENER : DECLARED_LISTENER);
            try {
                this.<ServletContextListener>get(listener).contextInitialized(event);
            } finally {
                IN_PROGRAMATIC_SC_LISTENER_INVOCATION.remove();
            }
        }
    }

我们看看servletContextListeners的值

java">main[1] print servletContextListeners
 servletContextListeners = instance of io.undertow.servlet.core.ManagedListener[2] (id=3771)
main[1] print servletContextListeners[0]
 servletContextListeners[0] = "ManagedListener{listenerInfo=ListenerInfo{listenerClass=class io.undertow.websockets.jsr.Bootstrap$WebSocketListener}}"
main[1] print servletContextListeners[1]
 servletContextListeners[1] = "ManagedListener{listenerInfo=ListenerInfo{listenerClass=class listener.ListenerExample$MyListener}}"

然后会执行

java"> this.<ServletContextListener>get(listener).contextInitialized(event);

我们看看get做了什么

java">private <T> T get(final ManagedListener listener) {
        return (T) listener.instance();
    }

原来是实例化,进去跟踪

java">> 
Step completed: "thread=main", io.undertow.servlet.core.ApplicationListeners.contextInitialized(), line=183 bci=94
183            for (int i = 0; i < servletContextListeners.length; ++i) {

main[1] next
> 
Step completed: "thread=main", io.undertow.servlet.core.ApplicationListeners.contextInitialized(), line=184 bci=31
184                ManagedListener listener = servletContextListeners[i];

main[1] next
> 
Step completed: "thread=main", io.undertow.servlet.core.ApplicationListeners.contextInitialized(), line=185 bci=38
185                IN_PROGRAMATIC_SC_LISTENER_INVOCATION.set(listener.isProgramatic() ? PROGRAMATIC_LISTENER : DECLARED_LISTENER);


main[1] next
> 
Step completed: "thread=main", io.undertow.servlet.core.ApplicationListeners.contextInitialized(), line=187 bci=60
187                    this.<ServletContextListener>get(listener).contextInitialized(event);

main[1] print listener
 listener = "ManagedListener{listenerInfo=ListenerInfo{listenerClass=class listener.ListenerExample$MyListener}}"
main[1] 

实例化的代码如下:

java">public EventListener instance() {
        if (!started) {
            throw UndertowServletMessages.MESSAGES.listenerIsNotStarted();
        }
        return handle.getInstance();
    }
java">> 
Step completed: "thread=main", io.undertow.servlet.core.ManagedListener.instance(), line=76 bci=16
76            return handle.getInstance();

main[1] print handle
 handle = "io.undertow.servlet.util.ImmediateInstanceHandle@38aa816f"
main[1] step
> 
Step completed: "thread=main", io.undertow.servlet.util.ImmediateInstanceHandle.getInstance(), line=36 bci=0
36            return instance;

main[1] print instance
 instance = "listener.ListenerExample$MyListener@77128536"
main[1] 

说明提前创建好了,那么什么时候创建的呢?

在这个Listener构造函数的地方查看栈,就知道了

java">at listener.ListenerExample$MyListener.<init>(ListenerExample.java:16)
	at listener.ListenerExample.getExampleListener(ListenerExample.java:34)
	at listener.ListenerExample$$EnhancerBySpringCGLIB$$328558d2.CGLIB$getExampleListener$0(<generated>)
	at listener.ListenerExample$$EnhancerBySpringCGLIB$$328558d2$$FastClassBySpringCGLIB$$c5c06cca.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358)
	at listener.ListenerExample$$EnhancerBySpringCGLIB$$328558d2.getExampleListener(<generated>)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:234)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:215)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:91)
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:79)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getServletContextInitializerBeans(EmbeddedWebApplicationContext.java:241)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.selfInitialize(EmbeddedWebApplicationContext.java:228)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.access$000(EmbeddedWebApplicationContext.java:89)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext$1.onStartup(EmbeddedWebApplicationContext.java:213)
	at org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory$Initializer.onStartup(UndertowEmbeddedServletContainerFactory.java:711)
	at io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:192)
	at io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:174)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:239)
	at org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory.createDeploymentManager(UndertowEmbeddedServletContainerFactory.java:410)
	at org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory.getEmbeddedServletContainer(UndertowEmbeddedServletContainerFactory.java:235)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
	at server.Boot.main(Boot.java:13)
java">Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(), line=91 bci=0
91    		for (Entry<String, ServletContextInitializer> initializerBean : getOrderedBeansOfType(

main[1] step
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=215 bci=0
215    		return getOrderedBeansOfType(beanFactory, type, Collections.emptySet());

main[1] step
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=220 bci=0
220    		List<Entry<String, T>> beans = new ArrayList<Entry<String, T>>();

main[1] print type
 type = "interface org.springframework.boot.web.servlet.ServletContextInitializer"
main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=221 bci=9
221    		Comparator<Entry<String, T>> comparator = new Comparator<Entry<String, T>>() {

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=230 bci=19
230    		String[] names = beanFactory.getBeanNamesForType(type, true, false);

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=231 bci=30
231    		Map<String, T> map = new LinkedHashMap<String, T>();

main[1] print names
 names = instance of java.lang.String[4] (id=3690)
main[1] print names[0]
 names[0] = "generateByFirstFilter"
main[1] print names[1]
 names[1] = "generateBySecondFilter"
main[1] print names[2]
 names[2] = "getExampleListener"
main[1] print names[3]
 names[3] = "dispatcherServletRegistration"
main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=232 bci=39
232    		for (String name : names) {

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=233 bci=65
233    			if (!excludes.contains(name) && !ScopedProxyUtils.isScopedTarget(name)) {

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=234 bci=84
234    				T bean = beanFactory.getBean(name, type);

main[1] print name
 name = "generateByFirstFilter"
main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=235 bci=95
235    				if (!excludes.contains(bean)) {

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=236 bci=106
236    					map.put(name, bean);

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=232 bci=118
232    		for (String name : names) {

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=233 bci=65
233    			if (!excludes.contains(name) && !ScopedProxyUtils.isScopedTarget(name)) {

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=234 bci=84
234    				T bean = beanFactory.getBean(name, type);

main[1] !!
next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=235 bci=95
235    				if (!excludes.contains(bean)) {

main[1] !!
next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=236 bci=106
236    					map.put(name, bean);

main[1] !!
next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=232 bci=118
232    		for (String name : names) {

main[1] !!
next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=233 bci=65
233    			if (!excludes.contains(name) && !ScopedProxyUtils.isScopedTarget(name)) {

main[1] !!
next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=234 bci=84
234    				T bean = beanFactory.getBean(name, type);

main[1] print name
 name = "getExampleListener"
main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=235 bci=95
235    				if (!excludes.contains(bean)) {

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=236 bci=106
236    					map.put(name, bean);

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=232 bci=118
232    		for (String name : names) {

main[1] print name
com.sun.tools.example.debug.expr.ParseException: Name unknown: name
 name = null
main[1] print map
 map = "{generateByFirstFilter=org.springframework.boot.web.servlet.FilterRegistrationBean@27d4a09, generateBySecondFilter=org.springframework.boot.web.servlet.FilterRegistrationBean@7e4204e2, getExampleListener=org.springframework.boot.web.servlet.ServletListenerRegistrationBean@b7c4869}"
main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=233 bci=65
233    			if (!excludes.contains(name) && !ScopedProxyUtils.isScopedTarget(name)) {

main[1] !!
next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=234 bci=84
234    				T bean = beanFactory.getBean(name, type);

main[1] !!
next
> !!
next
Nothing suspended.
> !
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=235 bci=95
235    				if (!excludes.contains(bean)) {

main[1] next
Unrecognized command: '!next'.  Try help...
main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=236 bci=106
236    					map.put(name, bean);

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=232 bci=118
232    		for (String name : names) {

main[1] next
> 
Step completed: "thread=main", org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(), line=240 bci=124
240    		beans.addAll(map.entrySet());

main[1] print namp
com.sun.tools.example.debug.expr.ParseException: Name unknown: namp
 namp = null
main[1] print map
 map = "{generateByFirstFilter=org.springframework.boot.web.servlet.FilterRegistrationBean@27d4a09, generateBySecondFilter=org.springframework.boot.web.servlet.FilterRegistrationBean@7e4204e2, getExampleListener=org.springframework.boot.web.servlet.ServletListenerRegistrationBean@b7c4869, dispatcherServletRegistration=org.springframework.boot.web.servlet.ServletRegistrationBean@7b94089b}"

基本就是这么回事了,先初始化,构造对象,然后再调用这个对象的方法。

转载于:https://my.oschina.net/qiangzigege/blog/904280


http://www.niftyadmin.cn/n/840880.html

相关文章

phpstorm(或webstorm) 打开后 一直停留在scanning files to index....,或跳出内存不够的提示框...

记得3月份做项目时就遇到过这个问题&#xff0c;当时解决的 &#xff0c;但是忘记怎么解决的啦&#xff0c;所以 &#xff0c;写博文是多么的重要啊。 说明&#xff1a; 在npm install 后&#xff0c;会出现Scanning files to index ...... 出现这个是正常的&#xff0c;但是一…

整数划分算法(代码)

#include <stdio.h> #include <stdlib.h> #include <string.h>/*输入n&#xff08;1-10之间数字&#xff09;&#xff0c;将数字分解显示&#xff0c;如6可以显示为6&#xff0c;51&#xff0c;42&#xff0c;411..... *///计算划分种数 int divideNumber(in…

《Python数据挖掘:概念、方法与实践》关联规则挖掘

本节书摘来自华章出版社《SAFe 4.0参考指南&#xff1a;精益软件与系统工程的规模化敏捷框架》一书中的第1章&#xff0c;第节&#xff0c;作者[美] 梅甘斯夸尔&#xff08;Megan Squire&#xff09;更多章节内容可以访问云栖社区“华章计算机”公众号查看。关联规则挖掘 在数据…

Linux 添用户报错:useradd:警告:此主目录已经存在

2019独角兽企业重金招聘Python工程师标准>>> 示例&#xff1a; 在添加一个用户时报错 [rootcentos001 ~]# useradd -u 1006 -g grp2 -d /home/aming/ -s /sbin/nologin user4 useradd&#xff1a;警告&#xff1a;此主目录已经存在。 //这里我们是要建立一个叫…

runtime自我总结

2019独角兽企业重金招聘Python工程师标准>>> runtiem开源地址&#xff1a;https://opensource.apple.com - - -https://opensource.apple.com/tarballs/objc4/ 附&#xff1a;查看某文件夹下包含某字符的文件---grep "file" * class_addMethod(Person, s…

什么是锁单?

锁单是期貨商品的一种做法&#xff0c;也就是同時持有买进卖空锁单Hedge Positions: 锁单功能通常用来进行开仓部位的避险&#xff0e;如没点击锁单Hedge&#xff0c;而直接于已开仓部位做一同一币组的反向单&#xff0c;将致使与原来的部位相对冲销, 举例而言:原来已有一口US…

51nod1832 先序遍历与后序遍历

对于给定的一个二叉树的先序遍历和后序遍历&#xff0c;输出有多少种满足条件的二叉树。两棵二叉树不同当且仅当对于某个x&#xff0c;x的左儿子编号不同或x的右儿子编号不同。Input第一行一个正整数n(3<n<10000)&#xff0c;表示二叉树的节点数&#xff0c;节点从1到n标…

开发心得

开发过程 需求分析&#xff1a;做什么、为什么、合入版本号、涉及软硬件、交付时间点、周边影响、风险识别等&#xff0c;分析完输出设计文档。 用例表单&#xff1a;分析完毕后要输出用例表单。考虑各种场景&#xff0c;用例表单未完毕不可写代码。 需求澄清&#xff1a;开发S…