2009-06-19 4 views

ответ

74

Короче говоря, нет. Весной вы не можете автоопределить или вручную провести статические поля. Для этого вам придется написать свою собственную логику.

+0

Если вы нашли старый код, делая это, это анти-паттерн. Прищурившись, наклоните голову и найдите лучший способ решить проблему. Вы будете рады, что вы это сделали. –

+0

этот [ответ] (http://stackoverflow.com/a/3746611/409976) также полезен для '@ AutoWired' Spring' –

+0

. Вы можете найти более подробную информацию [ответ здесь] (http://stackoverflow.com/a/ 17660550) – nmy

5

Создайте компонент, который вы можете autowire, который инициализирует статическую переменную как побочный эффект.

52

@Autowired может использоваться с сеттерами, чтобы у вас мог быть сеттер, изменяющий статическое поле.

Только один окончательное предложение ... НЕ

+4

Умный .... Я не могу заставить себя повышать это, хотя :) – skaffman

+33

Почему вы предлагаете не делать этого? –

+7

Да, мне также интересно узнать, почему это не рекомендуется делать ... – will824

4

Вы можете достичь этого, используя XML обозначения и MethodInvokingFactoryBean. Например, посмотрите here.

private static StaticBean staticBean; 

public void setStaticBean(StaticBean staticBean) { 
    StaticBean.staticBean = staticBean; 
} 

Вы должны стремиться использовать пружинную инъекцию, где это возможно, как это рекомендуемый подход, но это не всегда возможно, поскольку я уверен, что вы можете себе представить, как не все может быть вынута из пружинного контейнера или вы возможно, имея дело с устаревшими системами.

Примечание. При таком подходе тестирование ноты также может быть более сложным.

61
@Component 
public class NewClass{ 
    private static SomeThing someThing; 

    @Autowired 
    public void setSomeThing(SomeThing someThing){ 
     NewClass.someThing = someThing; 
    } 
} 
+0

любая идея, как я могу использовать этот подход при инициализации репозитория? – kiedysktos

0

Init вашего autowired компонента в методе @PostConstruct

@Component 
public class TestClass { 
    private static AutowiredTypeComponent component; 

    @Autowired 
    private AutowiredTypeComponent autowiredComponent; 

    @PostConstruct 
    private void init() { 
     component = this.autowiredComponent; 
    } 

    public static void testMethod() { 
     component.callTestMethod(); 
    } 
}