У нас есть веб-приложение с корневым контекстом приложения (applicationContext.xml) и диспетчерским сервлетом (dispatcher-servlet.xml), определенным в нашем web.xml следующим образом:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

...

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

Из-за ограничений доступа мы, очевидно, не можем получить доступ ни к одному из bean-компонентов DispatcherServlet из корневого родительского контекста.

Но мы хотели бы иметь возможность получить доступ к дочерним компонентам. Например, в нашем dispatcher-servlet.xml у нас есть:

<bean id="firstController" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
    ...
</bean>

<bean id="secondController" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
...
</bean>

Как мы можем получить доступ к secondController изнутри firstController, не требуя, чтобы он передавался как аргумент-конструктор или устанавливался как свойство?

Мы используем WebApplicationContextUtils.getWebApplicationContext(...) для доступа к братьям и сестрам в корне applicationContext.xml, но мы хотели бы сделать то же самое в дочернем контексте. (Изнутри одного из детей.)

0
Craig Otis 14 Дек 2012 в 20:05
Какая весенняя версия? вы можете использовать @Autowired?
 – 
Subin Sebastian
14 Дек 2012 в 20:08

1 ответ

Лучший ответ

Вы можете получить объект ApplicationContext, используя

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dispatcher-servlet.xml")

Предполагается, что dispatcher-servlet.xml находится в пути к классам. объект контекста должен быть кэширован. Затем используйте context.getBean() для доступа к bean-компонентам из любого места.

Другой вариант - использовать перегруженный метод, в котором мы можем передать имя атрибута контекста. Я этим не пользовался. WebApplicationContextUtils.getWebApplicationContext(ServletContext sc, String attrName)

0
Subin Sebastian 14 Дек 2012 в 20:20
Спасибо! В итоге я просто использовал @Autowired и сохранил его как ivar, но в будущем я изучу экстрапараметрический getWebApplicationContext().
 – 
Craig Otis
14 Дек 2012 в 20:26