programing

봄콩은 조건부 콩에 의존합니다.

cafebook 2023. 2. 22. 23:13
반응형

봄콩은 조건부 콩에 의존합니다.

나는 봄콩을 다른 콩에 넣고 싶다.그래서 저는 그냥@DependsOn주석입니다.

중요한 건 이 콩은 이 콩을 쓰고 있는 조건부 콩은@ConditionalOnProperty(name = "some.property", havingValue = "true")주석입니다.따라서 속성이 거짓일 경우 콩은 설치되지 않습니다(그것이 우리가 원하는 것입니다).@DependsOn분명히 실패한다.여기서의 목표는 두 번째 콩을 작성하는 것이지만, 첫 번째 콩이 생성된 경우에는 첫 번째 콩 뒤에 작성합니다.

이 작업을 수행할 수 있는 방법이 있습니까?@ConditionalOnProperty? 그리고 그 장난을 치지 않고@Order주석?

도와주셔서 고맙습니다.

다음과 같은 접근방식은 어떻습니까?

interface Something {}

public class FirstBean implements Something {}

public class SecondBean implements Something{} // maybe empty implementation

이 설정은 다음과 같습니다.

@Configuration
public class MyConfiguration {

  @Bean(name = "hello")
  @ConditionalOnProperty(name = "some.property", havingValue = true) 
  public Something helloBean() {
     return new FirstBean();
  }

  @Bean(name = "hello")
  @ConditionalOnProperty(name = "some.property", havingValue = false) 
  public Something secondBean() {
     return new SecondBean();
  }

  @Bean
  @DependsOn("hello")
  public MyDependantBean dependantBean() {
       return new MyDependantBean();
  }
}

즉, 빈 구현이라도 Something bean을 생성하여 종속 bean이 어떤 경우에도 Something에 의존할 수 있도록 하는 것입니다.

봄은 마법으로 가득 차 있지만, 아마 시도해 볼 만한 가치가 있을 거예요.

사용하는 대신@DependsOn사용할 수 있습니다.@AutoConfigureAfter()첫 번째 콩이 생성되지 않았더라도 두 번째 콩이 생성될 수 있지만 순서는 유지됩니다.

@Configuration
public class FirstConfiguration {

  @Bean(name = "firstBean")
  @ConditionalOnProperty(name = "some.property", havingValue = true) 
  public FirstBean firstBean() {
     return new FirstBean();
  }
}

@Configuration
@AutoConfigureAfter(name = {"firstBean"})
public class SecondConfiguration {

  @Bean
  public SecondBean secondBean() {
       return new SecondBean();
  }
}

다른 쪽 콩이 있는지 없는지에 대한 두 가지 경우를 위해 종속 콩에 대한 두 가지 정의를 작성해 주시겠습니까?

예:

@Bean(name = "myDependentBean")
@DependsOn("otherBean")
@ConditionalOnProperty(name = "some.property", havingValue = true) 
public DependentBean myDependentBean() {
    return new DependentBean();
}

@Bean(name = "myDependentBean")
@ConditionalOnProperty(name = "some.property", havingValue = false, matchIfMissing = true) 
public DependentBean myDependentBean_fallback() {
    return new DependentBean();
}

(오늘 비슷한 문제를 해결하기 위해 이 방법을 사용했습니다.)

그러면 스프링은 첫 번째 정의를 사용합니다.some.propertytrue, 그리고 인스턴스화)myDependentBean끝나고otherBean.한다면some.property누락 또는false봄은 두 번째 정의를 사용하기 때문에 신경 쓰지 않습니다.otherBean.

또는 다음 중 하나를 사용할 수 있습니다.@ConditionalOnBean/@ConditionalOnMissingBean대신 이것들로@ConditionalOnProperty(안 먹어봤는데)

커스텀 조건 클래스를 사용할 수 있습니다.

public class BeanPresennceCondition implements Condition {

  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
      FirstBean firstBean = null;
      try {
      firstBean = (FirstBean)context.getBeanFactory().getBean("firstBean"); 
      }catch(NoSuchBeanDefinitionException ex) {

      }
     return firstBean != null;
  }
}

언급URL : https://stackoverflow.com/questions/49446205/spring-bean-depends-on-a-conditional-bean

반응형