스프링 컴포넌트의 변수들은 주입되어야합니다.

 

스프링의 @Component, @Controller, @Service 그리고 @Repository 클래스들은 기본적으로 애플리케이션에서 하나만 인스턴스화 되는 싱글톤 객체입니다. 일반적으로 이러한 클래스들은 logger와 같은 적은 수의 static 멤버 변수들을 가질 수 있지만, 모든 non-static 멤버 변수들은 스프링에 의해 관리되어야 합니다. 즉, 이러한 변수들은 @Resource, @Inject, @Autowired @Value 와 같은 종류의 어노테이션이 달려있어야 합니다.

이러한 클래스들에 주입되지 않은 멤버 변수를 가지는 것은 상태를 변경하려는 시도를 나타낼 수 있습니다. 그들은 싱글톤 객체이기에, 상태를 변경하는 시도는 결국 User1 의 세션에서 User2 로 데이터를 노출하는 것을 보장합니다.

이 규칙은 @ConfigurationProperties 로 어노테이션되지 않은 싱글턴 객체인 @Component, @Controller, @Service 또는 @Repository 클래스가 아래의 어노테이션이 달리지 않은non-static 멤버를 가질 때 문제를 제기합니다.

  • org.springframework.beans.factory.annotation.Autowired
  • org.springframework.beans.factory.annotation.Value
  • javax.annotation.Inject
  • javax.annotation.Resource

규칙을 어긴 코드

@Controller
public class HelloWorld {

    private String name = null;

    @RequestMapping("/greet", method = GET)
    public String greet(String greetee) {

        if (greetee != null) {
            this.name = greetee;
        }

        return "Hello " + this.name;  // greetee 가 null 인 경우, 이전 사용자의 데이터가 표시됩니다. 
    }
}

참고


If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project