2013-10-27 7 views
8

Этот вопрос может показаться немного странным. Предположим, у меня есть Служба, которую я хочу использовать в классе Utility, который имеет некоторые статические методы. Служба является фасолью Spring, поэтому, естественно, я, например, использую сеттер и (@Autowired), чтобы ввести его в мой класс утилиты. Как уже упоминалось в документации Spring, все бобы являются статическими в контексте компонента. Поэтому, когда вы хотите вставить компонент в класс, вам не нужно использовать «статический» модификатор. Смотрите ниже:Каков правильный способ использования инжектируемого компонента в статическом методе?

 

public class JustAClass{ 
    private Service service; 

    public void aMethod(){ 
    service.doSomething(....); 
    } 

    @Autowired 
    public void setService(Service service){ 
    this.service = service; 
    } 

} 
 

Теперь возвращаясь к тому, что я говорил первый (Использование службы в статическом методе):

 

public class JustAClass{ 
    private static Service service; 

    public static void aMethod(){ 
    service.doSomething(....); 
    } 

    @Autowired 
    public void setService(Service service){ 
    this.service = service; 
    } 

} 
 

Хотя служба статична, я вынужден поставить статический за его определения. Это немного противоречит интуиции. это неправильно? или это лучший способ? Thanks

ответ

12

Вы не можете автоустанавливать статическое поле.

Но вы можете сделать немного обходной путь:

@Component 
public class JustAClass{ 
    private static Service service; 

    @Autowired 
    private Service tmpService; 

    @PostConstruct 
    public void init() { 
    service = tmpService; 
    } 

} 

Обратите внимание, что вы должны объявить этот класс как «Component», чтобы придать tmpService

+0

Это хорошо, работает для меня! – Kaunteya

+0

Это что-то, что будет сделано регулярно? Или существует ли другой подход, обычно используемый в этих ситуациях? –

3

У вас нет выбора. Если вы хотите инициализировать поле класса static, вам придется позволить Spring создать экземпляр этого класса и ввести значение.

Небольшой совет. В этом случае нет никаких оснований для использования методов static. Если вы хотите использовать однопользовательскую утилиту, просто сделайте свой bean-компонент областью singleton.

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