2019独角兽企业重金招聘Python工程师标准>>>
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}"
基本就是这么回事了,先初始化,构造对象,然后再调用这个对象的方法。