자격 없음 CDI 없음
소개
Vamos는 CDI에서 자격을 획득할 수 있으며, CDI에서 CDI로 전환하고 JAVA에서 언어로 확장할 수 있으며, 자격을 부여할 수 있는 능력을 발휘할 수 있습니다.
QUALIFICADORES OU 한정자
상상해보십시오 que temos uma interface com várias implementações, uma das utilidades dos qualifier é informarmos qual implementação vamos usar, se liga no exemplo.
public interface PaymentMethod {
public void pay();
}
ai temos 2는 PaymentMethod 인터페이스를 통해 구현합니다.
public class CreditCard implements PaymentMethod {
@Override
public void pay() {
System.out.println("payment by cred card");
}
}
public class Cash implements PaymentMethod {
@Override
public void pay() {
System.out.println("payment by CASH");
}
}
Se em nossa classe cliente apenas injetarmos a interface PaymentMethod a CDI lançará uma exceção de ambiguidade, informando que não sabe qual implementação irá injetar, calmo até ai ?
public class Checkout {
@Inject
private PaymentMethod payment;
public void checkout() {
payment.pay();
}
}
Da uma olha no error que vai aparecer no seu console.
WELD-001475: The following beans match by type, but none have matching qualifiers:
- Managed Bean [class br.com.cassunde.cdi.qualifier.Cash] with qualifiers [@Any @Payment],
- Managed Bean [class br.com.cassunde.cdi.qualifier.CreditCard] with qualifiers [@Any @Payment]
Para resolvermos isso teremos que criar um qualifier CDI, a sua criação e bem simples, basta criar uma anotação java padrão com uma pequena diferença, essa nossa anotação terá um @Qualifier, como o próprio nome já diz, será o responsável por indicar que essa nossa anotação e um 한정자. ficara mais ou menos assim.
@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD, PARAMETER })
@Qualifier
public @interface PaymentCreditCard {}
vamos fazer um exemplo ruim e depois vamos ver uma forma melhor de resolver esse problema usando qualifier, em nosso exemplo a interface PaymentMethod tem 2 implementações a CreditCard e a Cash, em nossa abordagem ruim faremos uma outra anotação para qualificarmos a segunda implementação então vamos lá: Qualifier para Implementação 현금:
@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD, PARAMETER })
@Qualifier
public @interface PaymentCash {}
para usarmos esses qualifier ficara mais ou menos assim: - 신용카드 구현
@PaymentCreditCard
public class CreditCard implements PaymentMethod {
@Override
public void pay() {
System.out.println("payment by creditcard");
}
}
클래스 클라이언트
public class Checkout {
@Inject
@PaymentCreditCard
private PaymentMethod payment;
public void checkout() {
System.out.println("Starting checkout");
payment.pay();
}
}
Dessa forma não fica muito legal, caso apareça uma nova implementação teremos que criar uma nova anotação e por ai vai... vamos agora melhorar essa abordagem, vamos inserir uma enum em nosso 한정자.
Vou criar essa enum e um terceiro 한정자 chamado
public enum PaymentType {
CREDIT,
CASH,
DEBIT
}
Nosso terceiro 한정자 ficaria assim:
@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD, PARAMETER })
@Qualifier
public @interface Payment {
PaymentType type();
}
Agora podemos substituir os primeiros qualifier que criamos por esse último, ficando mais ou menos assim:
신용카드 구현
@Payment(type=PaymentType.CREDIT)
public class CreditCard implements PaymentMethod {
@Override
public void pay() {
System.out.println("payment by cred card");
}
}
방법 클라이언트
public class Checkout {
@Inject
@Payment(type=PaymentType.CREDIT)
private PaymentMethod payment;
public void checkout() {
System.out.println("Starting checkout");
payment.pay();
}
}
현금 구현
@Payment(type=PaymentType.CASH)
public class Cash implements PaymentMethod {
@Override
public void pay() {
System.out.println("payment by cred card");
}
}
방법 클라이언트
public class Checkout {
@Inject
@Payment(type=PaymentType.CASH)
private PaymentMethod payment;
public void checkout() {
System.out.println("Starting checkout");
payment.pay();
}
}
Observem que agora estamos usando apenas uma única anotação e estamos "tipando"nosso 한정자, dessa forma temos mais liberdade para evoluir o código.
모든 것이 마찬가지입니다.
Reference
이 문제에 관하여(자격 없음 CDI 없음), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cassunde/qualificadores-no-cdi-2mpj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)