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