스프링에 정적 필드를 자동으로 연결할 수없는 이유는 무엇입니까?


96

Spring 빈에서 정적 인스턴스 변수를 자동으로 연결할 수없는 이유는 무엇입니까? 나는 이것을 달성하는 다른 방법이 있다는 것을 알고 있지만 왜 우리가 아래 방식으로 할 수 없는지 알고 싶습니다.

예 :

@Autowired
public static Test test;

당신은 당신이 언급하는 다른 방법으로 약간의 빛을 파쇄 할 수 있습니까?
samshers

생성자를 통해 자동 연결하거나 @PostConstuct를 사용할 수 있습니다
gagarwa

답변:


69

정적 필드를 사용하면 정적 메서드 사용이 권장되기 때문입니다. 그리고 정적 방법은 악합니다. 의존성 주입의 주요 목적은 컨테이너가 사용자를 위해 객체를 생성하고 연결하도록하는 것입니다. 또한 테스트를 더 쉽게 만듭니다.

정적 메서드를 사용하기 시작하면 더 이상 개체의 인스턴스를 만들 필요가 없으며 테스트가 훨씬 더 어렵습니다. 또한 주어진 클래스의 여러 인스턴스를 만들 수 없습니다. 각각 다른 종속성이 주입됩니다 (필드가 암시 적으로 공유되고 전역 상태를 생성하기 때문에-또한 악합니다).


11
내가 만난 한 가지주의 사항은 테스트 중입니다. 사용하고자하는 경우 @BeforeClass그 방법 액세스 bean을 SpringJUnit4ClassRunner에, 그리고이 @Autowired시험에 .. 당신은 기본적으로 할 수 없습니다. 짜증나 네요.
Jason Polites 2013

4
이 대답은 왜 안되는지 설명합니다. 그러나 실제 동기는 프레임 워크가 정적 클래스를 빈에 연결하려고 할 때 아직 클래스 로더에 의해로드되지 않을 수 있다는 것입니다.
Andrea T

51
이 대답은 완전 무의미합니다. Spring은 테스트 전략을 강요하지 않습니다. 대답은 정적 클래스가 클래스 로더에 의해 인스턴스화 될 때 아직로드 된 Spring 라이브러리가 없다는 것입니다.
Andrea T

7
@AndreaT의 답변이 허용되는 답변이어야합니다.
Chirag Agrawal

3
정적 메서드는 테스트하기가 더 쉽지만 어렵지 않습니다. Spring이 의존성을 자동으로 주입하는 것은 좋지만 실제로 테스트하기에는 더 어려운 경로입니다. 모의, 스텁 및 테스트 이중은 정적 메서드가 아니라 코드 냄새입니다.
mttdbrd

150

클래스 로더가 정적 값을로드 할 때 Spring 컨텍스트는 아직로드되지 않았기 때문입니다. 따라서 클래스 로더는 빈에 정적 필드를 제대로 삽입하지 못하고 실패합니다.


46
Java 언어의 절반이 나쁜 생각이라는 의견을 표명하는 것보다 실제로 질문에 대답하는 것처럼 보이는 답변에 감사드립니다.
Warren Dew

1
"정적 클래스"?
Arun Raaj

Mockito는 스프링이 자동 연결하는 방식과 유사하게 정적 필드에 객체를 주입 할 수 있기 때문에 이것은 정확하지 않은 것 같습니다. 구현이 동일한지는 모르겠습니다. 더 많은 정보가 필요합니다.
gagarwa

Mockito는 정적 메서드를 모의 할 수 없습니다. 정적 메서드를 모의하려면 Powermock을 사용해야합니다.
Jaison Varghese

17

OOP 개념에 따르면 정적 변수가 자동으로 연결되면 잘못된 설계가됩니다.

정적 변수는 Object의 속성이 아니라 Class의 속성입니다. 스프링 자동 배선은 객체에서 이루어지며 제 생각에는 디자인이 깨끗합니다. 자동 와이어드 빈 객체를 싱글 톤으로 배포 할 수 있으며이를 정적으로 정의하는 것과 동일하게 달성 할 수 있습니다.


15

이 솔루션으로 스프링에 정적 필드를 자동으로 연결할 수 있습니다.

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}

4
Bugfinder는 비 정적 메서드에서 정적 필드를 설정하는 것에 대해 불평합니다.
Neftanic

비 정적 것들의 작품에서 @Neftanic 참조하는 정적 멤버, 역하지 않습니다
유네스 zeboudj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.