2012-09-14 2 views
2

Возможно, работа с пружинным компонентом не работает. Я использую Spring 3.1 и tomcat 7.0.Весенний компонентный сканер не работает

Это как мой applicationContext.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:cache="http://www.springframework.org/schema/cache" 
xmlns:p="http://www.springframework.org/schema/p" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
      http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> 

    <context:annotation-config/> 
    <context:component-scan base-package="com.abc"/> 

    <bean id="myBean" class="com.efg.test.MyBean" /> 
</beans> 

У меня есть класс, как это:

package com.abc.test 

@Component 
class Test { 
    @Autowired 
    private static MyBean myBean; 

    public static MyBean getMyBean() { return myBean; } 
    public static void setMyBean(MyBean bean) { myBean = bean; } 
} 

я ожидал, что тест будет инициализирована Spring на запуске WebApplication и что myBean будет введен автоматически, поэтому, если я вызываю какой-либо (статический) метод теста, у меня есть ненулевая ссылка на myBean.

Однако myBean не вводится и всегда имеет значение null (myBean сам инициализируется как singleton, он просто не вводится). Что еще я должен сделать, чтобы заставить это работать? Если я добавлю Test-класс в applicationContext.xml, все будет работать. Я предполагаю, что тест просто не инициализирован весной и поэтому не подключен.

Update: мне нужно, чтобы иметь возможность получить доступ к autowired поля из статического контекста (метода этого класса вызываются как функция JSP), поэтому он должен быть статическими.

ответ

7

Идея Spring заключается в том, что она инициализирует и настраивает экземпляры ваших классов (т. Е. Объектов). На практике это означает, что @Autowired не может применяться к полям static, потому что статические поля не принадлежат ни одному экземпляру (а ваши методы доступа также не должны быть static).

+0

Хорошо, я должен предоставить больше контекста, мне нужно, чтобы они были статическими, потому что они называются пользовательской функцией JSP. Я обновил свое описание. Спасибо, однако, это была часть информации, которой у меня не было :) – Tim

+0

Работает вот так :) Теперь все, что мне нужно было сделать, это сохранить экземпляр класса как singleton и получить доступ к этому объекту Spring. – Tim

1

Я не верю, что вы можете прямо вводить статические поля с помощью Spring. См. this.

Смежные вопросы