весеннее наследование контекста DispatcherServlet - PullRequest
3 голосов
/ 03 декабря 2011

Обычно есть один ApplicationContext (родительский) и 0..n DispatcherServlets (дочерний). Возможно ли также, чтобы имел DispatcherServlet с другим DispatcherServle t в качестве родительского контекста с ApplicationContext в качестве родительского? Как я понял, бины могут быть разрешены транзитивно, поэтому должен быть доступ к контексту приложения.

Я не хочу помещать общие бины в ApplicationContext, потому что они не должны быть доступны другим DispatcherServlet - за одним исключением.

Ответы [ 2 ]

1 голос
/ 19 января 2012

Я расширил DispatcherServlet.Теперь работает отлично!

public class ConfigurableDispatcherServlet extends DispatcherServlet {

    private String contextParent;

    /**
     * Initialize and publish the WebApplicationContext for this servlet.
     * <p>
     * Delegates to {@link #createWebApplicationContext} for actual creation of
     * the context. Can be overridden in subclasses.
     * 
     * @return the WebApplicationContext instance
     * @see #setContextClass
     * @see #setContextConfigLocation
     */
    protected WebApplicationContext initWebApplicationContext() {
        // No fixed context defined for this servlet - create a local one.
        WebApplicationContext parent = WebApplicationContextUtils.getWebApplicationContext(getServletContext(),
                "org.springframework.web.servlet.FrameworkServlet.CONTEXT." + getContextParent());
        WebApplicationContext wac = createWebApplicationContext(parent);

        // Publish the context as a servlet context attribute.
        String attrName = getServletContextAttributeName();
        getServletContext().setAttribute(attrName, wac);
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Published WebApplicationContext of servlet '" + getServletName() +
                        "' as ServletContext attribute with name [" + attrName + "]");
        }
        if(this.logger.isInfoEnabled()) {
            this.logger.info(getServletName() + " is a child of " + parent.getDisplayName());
        }

        return wac;
    }

    public String getContextParent() {
        return contextParent;
    }

    public void setContextParent(String contextParent) {
        this.contextParent = contextParent;
    }
}
1 голос
/ 03 декабря 2011

Из HttpServletBean и FrameworkServlet похоже, что вы можете сделать следующее, чтобы bar использовал контекст foo как свой собственный:

<servlet>
    <servlet-name>foo</servlet-name>
    <servlet-class>...DispatcherServlet</servlet-class>
</servlet>

<servlet>
    <servlet-name>bar</servlet-name>
    <servlet-class>...DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextAttribute</param-name>
        <param-value>foo-servlet</param-value>
    </init-param>
</servlet>
...