programing

정적 필드와 함께 @Autowired를 사용할 수 있습니까?

goodcopy 2022. 8. 28. 18:51
반응형

정적 필드와 함께 @Autowired를 사용할 수 있습니까?

사용할 수 있는 방법이 있나요?@Autowiredstatic 필드를 사용합니다.그렇지 않은 경우 다른 방법이 있습니까?

간단히 말해서, 아니다.스프링에는 정적 필드를 자동 배선하거나 수동으로 배선할 수 없습니다.이걸 하려면 당신만의 논리를 써야 할 거예요.

@Component("NewClass")
public class NewClass{
    private static SomeThing someThing;

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

@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();
   }
}

스태틱 변수를 부작용으로 초기화하는 자동 배선 가능한 빈을 만듭니다.

자동 배선 정적 필드(또는 상수)는 무시되지만 오류가 발생하지 않는다는 답변을 추가하려고 했습니다.

@Autowired
private static String staticField = "staticValue";

XML 표기법 및MethodInvokingFactoryBean예를 들어 여기를 참조하십시오.

private static StaticBean staticBean;

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

가능한 한 스프링 주입을 사용하는 것을 목표로 하는 것이 좋습니다.이것은 권장되는 접근법입니다만, 스프링 컨테이너로부터 모든 것을 꺼낼 수 있는 것은 아니거나 레거시 시스템을 취급하는 것은 아니기 때문에, 항상 가능한 것은 아닙니다.

이 방법에서는 노트 테스트도 더 어려워질 수 있습니다.

Application Context Aware를 사용할 수 있습니다.

@Component
public class AppContext implements ApplicationContextAware{
    public static ApplicationContext applicationContext;

    public AppBeans(){
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

그리고나서

static ABean bean = AppContext.applicationContext.getBean("aBean",ABean.class);

면책사항 이것은 결코 표준이 아니며 이를 위한 더 나은 봄 방법이 있을 수 있습니다.위의 답변 중 어느 것도 퍼블릭스태틱필드의 배선 문제에 대응하고 있지 않습니다.

나는 세 가지를 성취하고 싶었다.

  1. 스프링을 사용하여 "자동 배선"(@Value 사용)
  2. 공용 정적 값 노출
  3. 수정 방지

내 물체는 이렇게 생겼다.

private static String BRANCH = "testBranch";

@Value("${content.client.branch}")
public void finalSetBranch(String branch) {
    BRANCH = branch;
}

public static String BRANCH() {
    return BRANCH;
}

1과 2는 이미 체크 아웃이 되어 있습니다.숨길 수 없기 때문에, 어떻게 하면 셋터에의 콜을 막을 수 있을까요?

@Component
@Aspect
public class FinalAutowiredHelper {

@Before("finalMethods()")
public void beforeFinal(JoinPoint joinPoint) {
    throw new FinalAutowiredHelper().new ModifySudoFinalError("");
}

@Pointcut("execution(* com.free.content.client..*.finalSetBranch(..))")
public void finalMethods() {}


public class ModifySudoFinalError extends Error {
    private String msg;

    public ModifySudoFinalError(String msg) {
        this.msg = msg;
    }

    @Override
    public String getMessage() {
        return "Attempted modification of a final property: " + msg;
    }
}

이 측면에서는 final로 시작하는 모든 메서드가 랩되고 호출되면 오류가 발생합니다.

나는 이것이 특별히 유용하다고 생각하지 않지만, 만약 당신이 강박적이고 완두콩과 당근을 분리하는 것을 좋아한다면, 이것은 그것을 안전하게 하는 한 가지 방법이다.

중요한 봄은 함수를 호출할 때 자신의 측면을 호출하지 않습니다.이걸 더 쉽게 만들었지, 안좋게도, 그걸 알기 전에 논리를 알아냈지.

일반적으로 개체 인스턴스별로 정적 필드를 설정하는 것은 잘못된 방법입니다.

추가할 수 있는 옵션 문제를 피하기 위해synchronizedprivate static Logger의 경우에만 정의하고 설정합니다.

@Autowired
public synchronized void setLogger(Logger logger)
{
    if (MyClass.logger == null)
    {
        MyClass.logger = logger;
    }
}

:

private static UserService userService = ApplicationContextHolder.getContext().getBean(UserService.class);

1: 컨스트럭터 1: 컨스트럭터 사용방법@Autowired

@Component
public class MyClass {

    private static MyService service;

    @Autowired
    public MyClass(MyService service) {
        TestClass.service= service;
    }
}

2: 사용방법 2:@PostConstruct[ Static ]으로 을 [Static Field로

@Component
public class MyClass {

    private static MyService service;

    @Autowired
    private MyService srv;

    @PostConstruct
    public void init() {
        this.service= srv;
    }
}

자세한 내용은 여기를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/1018797/can-you-use-autowired-with-static-fields

반응형