source

@RequiredArgsConstructor(onConstructor = @_(@Autowired)에 수식자를 추가할 수 있습니까?

factcode 2023. 3. 20. 23:38
반응형

@RequiredArgsConstructor(onConstructor = @_(@Autowired)에 수식자를 추가할 수 있습니까?

주석을 사용하려면@Qualifier컨스트럭터 의존성 주입에서는 다음과 같은 것을 얻을 수 있습니다.

public class Example {

    private final ComponentExample component;

    @Autowired
    public Example(@Qualifier("someComponent") ComponentExample component) {
        this.component = component;
    }
}

보일러 플레이트 코드를 줄이기 위한 Lombok의 주석을 알고 있으며, 컨스트럭터를 포함할 필요가 없습니다.@RequiredArgsConstructors(onConstructor=@__(@Inject))그러나 이것은 한정자가 없는 속성에서만 작동합니다.

에 수식자를 추가할 수 있는지 아는 사람이 있나요?@RequiredArgsConstructor(onConstructor = @__(@Autowired))?

편집:

드디어 그렇게 할 수 있게 되었습니다!다음과 같이 서비스를 정의할 수 있습니다.

@Service
@RequiredArgsConstructor
public class SomeRouterService {

   @NonNull private final DispatcherService dispatcherService;
   @Qualifier("someDestination1") @NonNull private final SomeDestination someDestination1;
   @Qualifier("someDestination2") @NonNull private final SomeDestination someDestination2;

   public void onMessage(Message message) {
       //..some code to route stuff based on something to either destination1 or destination2
   }

 } 

프로젝트의 루트에 다음과 같은 lombok.config 파일이 있는 경우:

# Copy the Qualifier annotation from the instance variables to the constructor
# see https://github.com/rzwitserloot/lombok/issues/745
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier

이것은 최근 lombok 1.18.4에 소개되어 블로그 포스트에 기재되어 있으며, 제가 이 기능의 구현을 추진하는 주된 원동력 중 하나였다고 자부합니다.

스프링 트릭을 사용하여 @Qualifier 주석 없이 원하는 한정자를 사용하여 필드에 이름을 지정할 수 있습니다.

@RequiredArgsConstructor
public class ValidationController {

  //@Qualifier("xmlFormValidator")
    private final Validator xmlFormValidator;

수락된 답변이 잘 작동하는지 테스트하지 않았지만, 롬복의 설정 파일을 작성하거나 편집하는 대신 수식자 이름을 원하는 멤버 변수 이름으로 바꾸는 것이 더 깔끔한 방법이라고 생각합니다.

// Error code without edit lombok config
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class Foo {
    @Qualifier("anotherDao") UserDao userDao;
}

@Qualifier를 제거하고 변수 이름을 변경하기만 하면 됩니다.

// Works well
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class Foo {
    UserDao anotherDao;
}

언급URL : https://stackoverflow.com/questions/38549657/is-it-possible-to-add-qualifiers-in-requiredargsconstructoronconstructor

반응형