봄콩은 조건부 콩에 의존합니다.
나는 봄콩을 다른 콩에 넣고 싶다.그래서 저는 그냥@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.property
이true
, 그리고 인스턴스화)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
'programing' 카테고리의 다른 글
Angular에서 스코프 변수가 정의되지 않았는지 확인하는 방법JS 템플릿? (0) | 2023.02.27 |
---|---|
날짜 객체에 대한 대응 프로펠러 검증 (0) | 2023.02.27 |
$resource URL 쿼리 문자열 (0) | 2023.02.22 |
WordPress 3.5 사용자 지정 미디어 업로드(테마 옵션) (0) | 2023.02.22 |
워드프레스 내에서 pdf를 동적으로 작성하려면 어떻게 해야 합니까? (0) | 2023.02.22 |