2014-11-18 3 views
0

Это простой вопрос,Spring MVC: Как получить контекстный параметр при создании экземпляра компонента?

Как получить параметр контекста сервлета, когда весна создает экземпляр компонента?

мой контекст сервлета XML

<beans:bean id="ApplicationInfo" class="xx.xx.xx.ApplicationInfo"/> 

В моем коде

public class ApplicationInfo{ 
    ApplicationInfo() 
    { 
     //get context.xml or web.xml parameter 
     String xxx = .......; 
    } 
} 

мой pom.xml

<org.springframework-version>3.2.11.RELEASE</org.springframework-version> 
<org.aspectj-version>1.6.9</org.aspectj-version> 
<org.slf4j-version>1.5.10</org.slf4j-version> 
<org.springsecurity-version>3.2.5.RELEASE</org.springsecurity-version> 
<org.springjpa-version>1.1.0.RELEASE</org.springjpa-version> 
<hibernate.version>4.1.6.Final</hibernate.version> 
<postgresql.version>9.1-901-1.jdbc4</postgresql.version> 
<tiles-version>2.2.2</tiles-version> 
<jackson-json-version>2.1.0</jackson-json-version> 

Примечание: я пытался получить контекст сервлета с помощью @annotation, однако это nullpointer.

enter image description here

+0

Дон» т. Внесите «Среда» и вручную извлеките значение с помощью 'getProperty' или просто добавьте поле, аннотированное с помощью' @Value («$ {your.property.name}»). Это приведет к добавлению свойства. «ServletContext» является одним из доступных ресурсов для свойств. –

+0

Как вводить Окружающую среду? или, может быть, какая-то связь для меня? – Stupidfrog

+0

Просто добавьте '@ Autowired' в поле типа' Environment'. Также обратите внимание, что он доступен после построения, попытка доступа к нему в конструкторе завершится с ошибкой. Использование «Среда» дает вам абстракцию для свойств и позволяет (например) помещать их в файл свойств или JNDI или web.xml (или вы можете смешивать). И он очищает ваш код от привязки к контексту сервлета. –

ответ

1

Если вы хотите получить доступ к autowired боба в конструкторе, вы должны использовать инъекции типа конструктора:

@Component 
public class ApplicationInfo { 
    private final FooService fooService; 

    @Autowired 
    public ApplicationInfo(ServletContext servletContext, FooService fooService) { 
     this.fooService = fooService; 

     // do something here 
    } 
} 

Если у вас есть (или хотят) придерживаться XML фасоли определения вы должны сделать свой класс реализованным интерфейсом ServletContextAware, что позволяет Spring автоматически устанавливать эту зависимость через сеттер. Вместо того, чтобы доступ к нему в конструкторе, вы делаете это в методе с аннотацией @PostConstruct, который вызывается, когда боб полностью инициализирован:

public class ApplicationInfo implements ServletContextAware { 
    private final FooService fooService; 
    private ServletContext servletContext; 

    public ApplicationInfo(FooService fooService) { 
     this.fooService = fooService; 
    } 

    @PostConstruct 
    public void init() { 
     // now you fooService and servletContext are set 
    } 

    @Override 
    public void setServletContext(ServletContext servletContext) { 
     this.servletContext = servletContext; 
    } 
} 
<bean class="demo.ApplicationInfo"> 
    <constructor-arg name="fooService" ref="fooService" /> 
</bean> 

<bean id="fooService" class="demo.FooService"/> 
+0

Его работа! однако, если у моего компонента есть некоторый параметр, нужно его вводить, то как? как Stupidfrog

+0

Я обновил ответ, я думаю, он полностью отвечает вашим проблема сейчас –

+0

Спасибо @Maciej Walkowiak! ваше решение решит мои потребности сейчас. У меня есть дополнительная база вопросов по этому решению. Предположим, что applicaiontInfo - это Bean A, someServices - Bean B.Bean B создает экземпляр из конструктора и вводит Bean A (пример: ). Таким образом, мой заказ представляет собой экземпляр Bean A с контекстом сервлета (для получения некоторого значения из context.xml), а затем создайте экземпляр Bean B., ваше решение сможет сделать Bean A уже собирающим информацию перед введением в Bean B? я попробую этот сценарий после опубликования этого комментария. – Stupidfrog

0

Попробуйте с @Value аннотацию

public class ApplicationInfo { 
    @Value("${parameterName}") 
    private String parameter; 
}