[웹][스프링] ContextLoaderListener

스프링 context loader / spring 3.2.11. / tomcat 8.0.14




org.springframework.web.context.ContextLoaderListener


grepcode 를 통해 단순히 소스분석만 해보자.

// Stack trace
contextInitialized():108, ContextLoaderListener {org.springframework.web.context}
listenerStart():4797, StandardContext {org.apache.catalina.core}
startInternal():5221, StandardContext {org.apache.catalina.core}
start():150, LifecycleBase {org.apache.catalina.util}
addChildInternal():724, ContainerBase {org.apache.catalina.core}
addChild():700, ContainerBase {org.apache.catalina.core}
addChild():714, StandardHost {org.apache.catalina.core}
manageApp():1587, HostConfig {org.apache.catalina.startup}
invoke0():-1, NativeMethodAccessorImpl {sun.reflect}
invoke():-1, NativeMethodAccessorImpl {sun.reflect}
invoke():-1, DelegatingMethodAccessorImpl {sun.reflect}
invoke():-1, Method {java.lang.reflect}
invoke():300, BaseModelMBean {org.apache.tomcat.util.modeler}
invoke():-1, DefaultMBeanServerInterceptor {com.sun.jmx.interceptor}
invoke():-1, JmxMBeanServer {com.sun.jmx.mbeanserver}
createStandardContext():463, MBeanFactory {org.apache.catalina.mbeans}
createStandardContext():413, MBeanFactory {org.apache.catalina.mbeans}
invoke0():-1, NativeMethodAccessorImpl {sun.reflect}
invoke():-1, NativeMethodAccessorImpl {sun.reflect}
invoke():-1, DelegatingMethodAccessorImpl {sun.reflect}
invoke():-1, Method {java.lang.reflect}
invoke():300, BaseModelMBean {org.apache.tomcat.util.modeler}


ContextLoaderListener
ContextLoaderListener 는 ServletContextListener 를 implement 한다.
class ContextLoaderListener extends ContextLoader implements ServletContextListener

ㄹㅇㄴㄹ

// org.apache.catalina.startup.HostConfig.java
public void manageApp(Context context)  {

    String contextName = context.getName();

    if (deployed.containsKey(contextName))
        return;

    ...

    // Add the associated docBase to the redeployed list if it's a WAR
    boolean isWar = false;
    if (context.getDocBase() != null) {
        ...
    }
    host.addChild(context);
    ...
}

// org.apache.catalina.core.StandardHost.java
@Override
public void addChild(Container child) {

    child.addLifecycleListener(new MemoryLeakTrackingListener());

    if (!(child instanceof Context))
        throw new IllegalArgumentException
            (sm.getString("standardHost.notContext"));
    super.addChild(child);

}

// ContainerBase.java
@Override
public void addChild(Container child) {
    if (Globals.IS_SECURITY_ENABLED) {
        ...
    } else {
        addChildInternal(child);
    }
}

// ContainerBase.java
private void addChildInternal(Container child) {
    ...
    if ((getState().isAvailable() ||
         LifecycleState.STARTING_PREP.equals(getState())) &&
            startChildren) {
        try {
            child.start();
        } catch (LifecycleException e) {
            log.error("ContainerBase.addChild: start: ", e);
            throw new IllegalStateException
                ("ContainerBase.addChild: start: " + e);
        }
    }
}

// LifecycleBase.java
@Override
public final synchronized void start() throws LifecycleException {
    ...
    try {
        startInternal();
    } catch (Throwable t) {
        ...
    }
}

// StandardContext.java
@Override
protected synchronized void startInternal() throws LifecycleException {
    ...
    try {
        ...
        // Configure and call application event listeners
        if (ok) {
            if (!listenerStart()) {
                log.error( "Error listenerStart");
                ok = false;
            }
        }
}


// StandardContext.java 
public boolean listenerStart() {
    ...
    for (int i = 0; i < instances.length; i++) {
        if (!(instances[i] instanceof ServletContextListener))
            continue;
        ServletContextListener listener =
            (ServletContextListener) instances[i];
        try {
            fireContainerEvent("beforeContextInitialized", listener);
            if (noPluggabilityListeners.contains(listener)) {
                listener.contextInitialized(tldEvent);
            } else {
                listener.contextInitialized(event);
            }
        ...
}






댓글 없음:

댓글 쓰기