Статьи

Spring Framework — Контекст приложения — Три способа добраться до контекста приложения

В этой статье показано три различных способа перехода к контексту приложения Spring Framework в вашем коде.

Резюме

(Это репост более старой статьи, которую я написал в 2010 году). При поиске в Google «Spring ApplicationContextAware » вы найдете множество рекомендаций, и я также вижу, что многие продолжают жаловаться, говоря, что их метод setApplicationContext не вызывается. Чтобы пояснить, я пишу несколько заметок в надежде, что это поможет прояснить, как работает контекст.

Метод-1

В вашем классе вы реализуете класс ApplicationContextAware следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MyClass implements ApplicationContextAware {
 
    static final long serialVersionUID = 02L;
 
    ApplicationContext applicationContext = null;
 
    public void doSomething(){
        if (applicationContext != null && applicationContext.containsBean("accessKeys")){
            MyBean beanA = (MyBean) applicationContext.getBean("mybean");
            //Do something with this AccessBean
        }
 
        return null;
    }
 
    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
        System.out.println("setting context");
        this.applicationContext = applicationContext;
    }
 
}

Метод-2

Если вы находитесь в сервлете Java, вы можете сделать следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
public class gzservlet extends HttpServlet {
    static final long serialVersionUID = 02L;
 
    ApplicationContext applicationContext = null;
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if (applicationContext == null){
            System.out.println("setting context in get");
            applicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
        }
        if (applicationContext != null && applicationContext.containsBean("accessKeys")){
            AccessBean thisAccessBean = (AccessBean) applicationContext.getBean("accessKeys");
            req.setAttribute("keys", thisAccessBean.toString());
            System.out.println("setting keys");
        }
 
        req.getRequestDispatcher("/index2.jsp").include(req,resp);
    }
 
}

Таким образом, вопрос, который можно задать, это когда использовать что? И ответ есть. Зависит от того, как вы вызываете Spring.

Что работает для метода № 1: когда вы вызываете Spring, вы используете ссылку DispatcherServlet. Затем метод # 1 разрешит реализацию ApplicationContextAware и вызовет метод setApplicationContext () для установки контекста.

В web.xml:

01
02
03
04
05
06
07
08
09
10
<servlet>
    <servlet-name>dispatchservlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
    <servlet-name>dispatchservlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Если вы не используете DispatcherServlet и инициализируете Spring с использованием Listener, и у вас есть свой собственный сервлет, который управляет областью запросов \ ответов, используйте метод № 2. Ниже приведен пример того, как будет выглядеть файл web.xml в этом случае.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 
<servlet>
  <servlet-name>MyOwnServlet</servlet-name>
  <servlet-class>com.something.myservlet</servlet-class>
  <load-on-startup>2</load-on-startup>
</servlet>
 
<servlet-mapping>
  <servlet-name>MyOwnServlet</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

Я надеюсь, что это проясняет, почему иногда, даже если вы реализовали интерфейс ApplicationContextAware, ваш установщик не вызывается.

[09/12/2010] Вот третий способ получить ваш контекст:

Создайте следующий класс со статическим методом, чтобы получить ваш контекст:

01
02
03
04
05
06
07
08
09
10
11
12
13
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
 
public class ApplicationContextProvider implements ApplicationContextAware{
    private static ApplicationContext ctx = null;
    public static ApplicationContext getApplicationContext() {
        return ctx;
    }
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        this.ctx = ctx;
    }
}

и в свой XML-файл конфигурации Spring Bean добавьте следующее:

1
<bean id="applicationContextProvider" class="ApplicationContextProvider"></bean>

И теперь в ваших классах вы можете делать следующее:

1
ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();

Это оно!!!

Приветствия.

Если вы считаете эту статью полезной, рассмотрите возможность подписки на мою электронную почту или разместите ее на своем любимом социальном сайте. Смотрите ссылки в правой части навигации.

Теперь для сегодняшнего вдохновения

Чтобы быть инновационным, мы не можем смотреть на то, что сделали другие. Вся идея о том, чтобы проложить путь, заключается в том, что до этого пути не было. Будь инновационным сегодня!

См. Оригинальную статью здесь: Spring Framework — Контекст приложения — три способа добраться до контекста приложения.

Мнения, высказанные участниками Java Code Geeks, являются их собственными.