@Autowired 컨스트럭터 파라미터를 개별적으로 "required=false"로 설정하는 방법
를 사용하고 있습니다.@Autowired아래 주석@Configuration클래스 컨스트럭터
@Configuration
public class MyConfiguration {
private MyServiceA myServiceA;
private MyServiceB myServiceB
@Autowired
public MyConfiguration(MyServiceA myServiceA, MyServiceB myServiceB){
this.myServiceA = myServiceA;
this.myServiceB = myServiceB;
}
}
Spring documentation sais로 주석 의존성이 필요한지 여부를 선언할 수 있습니다.
마크를 붙이면@Autowired컨스트럭터 아래의 주석required=false(스프링 매뉴얼에 기재되어 있는 바와 같이) 자동배선되는2개의 서비스는 필수가 아닙니다.
@Autowired(required = false)
public MyConfiguration(MyServiceA myServiceA, MyServiceB myServiceB){
this.myServiceA = myServiceA;
this.myServiceB = myServiceB;
}
Spring 문서부터:
인수 메서드가 여러 개인 경우 모든 인수에 'required' 파라미터를 적용할 수 있습니다.
어떻게 하면required각 생성자 매개변수에 개별적으로 속성을 부여합니까?사용하기 위해 필요@Autowired모든 필드 아래에 주석을 달 수 있습니까?
안부 전해요,
Java 8 및 Spring Framework 4를 사용하는 경우Optional.
@Autowired
public MyConfiguration(Optional<MyServiceA> myServiceA, Optional<MyServiceB> myServiceB){
myServiceA.ifPresent(service->{this.myServiceA = service});
myServiceB.ifPresent(service->{this.myServiceB = service});
}
명시적 접근법
기본적으로 필요한 의존관계와 옵션 의존관계가 있는 콩이 있습니다.컨피규레이션빈뿐만 아니라 다른 모든 시나리오를 처리하는 권장 방법은 필수 의존관계 전용 컨스트럭터를 생성하고 옵션 의존관계용 세터 주입을 사용하는 것입니다.
public class MyConfiguration {
private final MyServiceA myServiceA;
private MyServiceB myServiceB
@Autowired
public MyConfiguration(MyServiceA myServiceA){
this.myServiceA = myServiceA;
}
@Autowired(required = false)
public void setMyServiceB(MyServiceB myServiceB) {
this.myServiceB = myServiceB;
}
}
이 접근방식을 사용하면 모의 라이브러리를 사용하지 않고도 클래스를 쉽게 유닛화할 수 있습니다.컨스트럭터 및 옵션세터를 사용하여 테스트 상태의 객체를 작성할 수 있습니다.
놓는 것@Autowired(required = false)현장에서 직접 세터를 제거하는 것도 가능하지만, 컨스트럭터 주입을 사용하고 있기 때문에 의존 관계를 좀 더 명확하게 기술하고 싶다고 생각합니다.
추가 아이디어
또한 Optional 유형을 사용하여 필수 종속성이 아닌 랩을 작성할 수도 있습니다.개발자들 사이에서는 클래스에 속성이 있는 경우 설정해야 한다고 생각하는 것이 일반적이지만, 이는 명백히 시나리오에 맞지 않습니다.특정 의존관계에 대해 결석 가능성을 보다 명확하게 표시하기 위해 [Optional]를 사용할 수 있습니다.
public class MyConfiguration {
private final MyServiceA myServiceA;
private Optional<MyServiceB> myServiceB
@Autowired
public MyConfiguration(MyServiceA myServiceA){
this.myServiceA = myServiceA;
this.myServiceB = Optional.empty();
}
@Autowired(required = false)
public void setMyServiceB(MyServiceB myServiceB) {
this.myServiceB = Optional.ofNullable(myServiceB);
}
}
일부 사용자는 이 기능을 사용하는 것을 반대합니다.Optional(주로 Brian Goetz의 답변 때문에) 클래스 속성을 입력합니다만, 최종적으로 프로젝트에 임하는 것은 팀 전체의 결정입니다.
4.3.0 봄부터.RC1은 다음을 수행할 수 있습니다.
public MyConfiguration(MyServiceA myServiceA, @Autowired(required = false) MyServiceB myServiceB){
this.myServiceA = myServiceA;
this.myServiceB = myServiceB;
}
~하듯이ElementType.PARAMETER주석 대상으로 추가되었습니다.
Spring 5.0부터@Autowired(required = false)로 대체될 수도 있다@Nullable 코틀린 타입은 할 수 ( 코틀린 널러블).MyServiceB?
Spring Framework 5.0부터는 @Nullable 주석(예를 들어 javax.annotation)을 사용할 수도 있습니다.JSR-305에서 무효):
@Configuration
public class MyConfiguration {
private MyServiceA myServiceA;
private MyServiceB myServiceB
@Autowired
public MyConfiguration(@Nullable MyServiceA myServiceA, MyServiceB myServiceB){
this.myServiceA = myServiceA;
this.myServiceB = myServiceB;
}
}
언급URL : https://stackoverflow.com/questions/42135102/how-to-set-autowired-constructor-params-as-required-false-individually
'programing' 카테고리의 다른 글
| 카테고리에 상위 카테고리가 있는지 확인하는 방법 (0) | 2023.03.21 |
|---|---|
| Angular.js 지시 동적 템플릿URL (0) | 2023.03.21 |
| Rspec 테스트를 사용하여 rails json API 예제를 완료합니다. (0) | 2023.03.21 |
| 스프링 MVC에서 JSON payload를 @RequestParam에 POST하는 방법 (0) | 2023.03.21 |
| angularjs $140.높이가 정의되지 않았습니다. (0) | 2023.03.21 |