В этой статье показано три различных способа перехода к контексту приложения 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, являются их собственными. |