programing

스프링: 정적 필드에 값을 주입하려면 어떻게 해야 합니까?

easyjava 2023. 2. 23. 23:08
반응형

스프링: 정적 필드에 값을 주입하려면 어떻게 해야 합니까?

이 수업과 함께

@Component
public class Sample {

    @Value("${my.name}")
    public static String name;


}

내가 노력하면Sample.name, 그것은 항상 '위험'하다.그래서 해봤어요.

public class Sample {

    public static String name;

    @PostConstruct
    public void init(){
        name = privateName;
    }

    @Value("${my.name}")
    private String privateName;

    public String getPrivateName() {
        return privateName;
    }

    public void setPrivateName(String privateName) {
        this.privateName = privateName;
    }  

}

이 코드는 동작합니다. Sample.name올바르게 설정되어 있습니다.이게 좋은 방법이야, 안 좋은 방법인가요?그렇지 않다면, 더 좋은 방법이 있을까요?어떻게 하는 거죠?

일단은...public static비의final들판은 사악하다.봄은 그러한 분야에 주입하는 것을 허락하지 않는다.

회피책은 유효하며, getter/setter도 필요 없습니다.private필드면 충분합니다.한편, 이것을 시험해 보세요.

@Value("${my.name}")
public void setPrivateName(String privateName) {
    Sample.name = privateName;
}  

(와 함께 동작합니다.@Autowired/@Resource하지만 건설적인 조언을 드리자면:다음을 사용하여 두 번째 클래스 만들기private대신 필드 앤 게터public static들판.

이 정보의 개요는 https://www.baeldung.com/spring-inject-static-field 입니다.

스프링은 @Value 주석을 찾을 때 종속성 주입을 사용하여 특정 값을 채웁니다.단, 인스턴스 변수에 값을 전달하는 대신 암묵적인 setter에 값이 전달됩니다.이 세터는 NAME_STATIC 값 입력을 처리합니다.

    @RestController 
//or if you want to declare some specific use of the properties file then use
//@Configuration
//@PropertySource({"classpath:application-${youeEnvironment}.properties"})
public class PropertyController {
 
    @Value("${name}")//not necessary
    private String name;//not necessary
 
    private static String NAME_STATIC;
 
    @Value("${name}")
    public void setNameStatic(String name){
        PropertyController.NAME_STATIC = name;
    }
}

로드 스태틱 변수의 샘플 코드입니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class OnelinkConfig {
    public static int MODULE_CODE;
    public static int DEFAULT_PAGE;
    public static int DEFAULT_SIZE;

    @Autowired
    public void loadOnelinkConfig(@Value("${onelink.config.exception.module.code}") int code,
            @Value("${onelink.config.default.page}") int page, @Value("${onelink.config.default.size}") int size) {
        MODULE_CODE = code;
        DEFAULT_PAGE = page;
        DEFAULT_SIZE = size;
    }
}

Spring Boot 어플리케이션의 메인클래스에서 Application Context를 사용하는 사용자는 다음 반환값만 사용할 수 있습니다.SpringApplication.run.

회피책을 실장할 필요가 있는 경우도 있습니다만, 가능한 한 대부분의 시나리오에서 회피하는 것이 좋습니다.스프링은 의존성 주입을 처리하는 데 탁월하며 대부분의 물체를 싱글톤으로 취급합니다.즉, Spring은 객체 생성 및 런타임에 이러한 객체 주입을 처리할 수 있습니다.이를 스프링 관리 콩이 싱글톤일 가능성이 높다는 사실과 결합하면 정적 방법 및 변수를 사용할 필요가 거의 없습니다.컨스트럭터 수준 또는 변수 수준에서 찾고 있는 객체의 인스턴스를 자동 배선하여 메서드 또는 변수의 정적 버전이 아닌 버전을 참조할 수 있습니다.이것은 이상적이며 정적 참조와 유사하게 동작합니다.비 스태틱 변수는 기본적으로 스태틱합니다.이는 코드의 모든 부분에서 객체의 인스턴스를 하나만 사용하고 의존성 주입을 통해 정적 참조와 마찬가지로 객체의 인스턴스화를 처리하지 않기 때문입니다.훌륭합니다! 이제 다른 작업이 필요할 수 있습니다(의존성 주입을 사용하지 않거나 클래스가 싱글톤이 아닌 경우). 그러나 가능한 한 회피책을 사용하지 않도록 합니다.그리고 이건 내 2센트야.3을 제안할 수 있는 사람이 있을지도 모릅니다.(:

public class InjectableClass{
     @Value("${my.value}")
     private String myString;
    
     public String nonStaticMethod(){
           return myString;
     }
}

public class LogicClass{
    private InjectableClass injectableClass;
    @Autowire
    public LogicClass(InjectableClass injectableClass){
       this.injectableClass = injectableClass;
    }

    public void logicClassMethod(){
        System.out.println("Hey! Here is the value I set on myString: " + 
                         injectableClass.nonStaticMethod() + ". That was 
                          basically like using a static method!");
    }
 }

언급URL : https://stackoverflow.com/questions/7253694/spring-how-to-inject-a-value-to-static-field

반응형