[SPRING] @Autowire (required = false)와 같이 @Inject를 JSR 330에서 선택적으로 사용할 수 있습니까?
SPRING@Autowire (required = false)와 같이 @Inject를 JSR 330에서 선택적으로 사용할 수 있습니까?
Spring의 @Autowire는 일치하는 autowire 후보가 없다면 Spring이 에러를 던지지 않도록 설정할 수 있습니다 : @Autowire (required = false)
거기에 상응하는 JSR-330 주석이 있습니까? 일치하는 후보자가 없으면 항상 @Inject가 실패합니다. @Inject를 사용할 수 있지만 일치하는 유형이 발견되지 않으면 프레임 워크를 사용할 수없는 방법이 있습니까? 그 정도까지는 어떤 문서도 찾을 수 없었습니다.
해결법
-
==============================
1.아니요 ... JSR 330의 선택적 요소는 없습니다 ... 선택적 주입을 사용하려면 특정 프레임 워크를 사용해야합니다. @Autowired annotation
아니요 ... JSR 330의 선택적 요소는 없습니다 ... 선택적 주입을 사용하려면 특정 프레임 워크를 사용해야합니다. @Autowired annotation
-
==============================
2.java.util.Optional을 사용할 수 있습니다. Java 8을 사용하고 Spring 버전이 4.1 이상인 경우 (여기 참조) 대신
java.util.Optional을 사용할 수 있습니다. Java 8을 사용하고 Spring 버전이 4.1 이상인 경우 (여기 참조) 대신
@Autowired(required = false) private SomeBean someBean;
Java 8과 함께 제공되는 java.util.Optional 클래스를 사용할 수 있습니다. 다음과 같이 사용하십시오.
@Inject private Optional<SomeBean> someBean;
이 인스턴스는 결코 null이 아니므로 다음과 같이 사용할 수 있습니다.
if (someBean.isPresent()) { // do your thing }
이 방법을 사용하면 생성자 주입을 수행 할 수 있습니다. 일부 콩은 필수이고 일부 콩은 선택적이며 큰 유연성을 제공합니다.
참고 : 아쉽게도 Spring은 Guava의 com.google.common.base.Optional (여기 참조)을 지원하지 않으므로 Java 8 이상을 사용하는 경우에만이 메서드가 작동합니다.
-
==============================
3.인스턴스 주입은 종종 간과됩니다. 유연성이 뛰어납니다. 종속성을 가져 오기 전에 사용 가능성을 확인하십시오. 충족되지 않은 get은 값 비싼 예외를 throw합니다. 용도:
인스턴스 주입은 종종 간과됩니다. 유연성이 뛰어납니다. 종속성을 가져 오기 전에 사용 가능성을 확인하십시오. 충족되지 않은 get은 값 비싼 예외를 throw합니다. 용도:
@Inject Instance<SomeType> instance; SomeType instantiation; if (!instance.isUnsatisfied()) { instantiation = instance.get(); }
주입 후보를 정상적으로 제한 할 수 있습니다.
@Inject @SomeAnnotation Instance<SomeType> instance;
-
==============================
4.AutowiredAnnotationBeanFactoryPostProcessor (Spring 3.2)는 지원되는 'Autowire'주석이 필요한지 여부를 결정하기 위해이 메소드를 포함한다 :
AutowiredAnnotationBeanFactoryPostProcessor (Spring 3.2)는 지원되는 'Autowire'주석이 필요한지 여부를 결정하기 위해이 메소드를 포함한다 :
/** * Determine if the annotated field or method requires its dependency. * <p>A 'required' dependency means that autowiring should fail when no beans * are found. Otherwise, the autowiring process will simply bypass the field * or method when no beans are found. * @param annotation the Autowired annotation * @return whether the annotation indicates that a dependency is required */ protected boolean determineRequiredStatus(Annotation annotation) { try { Method method = ReflectionUtils.findMethod(annotation.annotationType(), this.requiredParameterName); if (method == null) { // annotations like @Inject and @Value don't have a method (attribute) named "required" // -> default to required status return true; } return (this.requiredParameterValue == (Boolean) ReflectionUtils.invokeMethod(method, annotation)); } catch (Exception ex) { // an exception was thrown during reflective invocation of the required attribute // -> default to required status return true; } }
즉, 기본적으로 아니요.
디폴트로 검색되는 메소드 이름은 '필수'입니다. @Inject 주석의 필드가 아니므로 메소드가 널 (NULL)이 될 것이고 true가 리턴됩니다.
이 BeanPostProcessor를 서브 클래 싱하고 decideRequiredStatus (Annotation) 메소드를 오버라이드하여 true 또는 오히려 '더 똑똑한'것을 반환함으로써이를 변경할 수 있습니다.
-
==============================
5.선택적 주입 점을 만들 수 있습니다!
선택적 주입 점을 만들 수 있습니다!
http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#lookup에 설명 된대로 주입 조회를 사용해야합니다.
@Inject Instance<Type> instance; // In the code try { instance.get(); }catch (Exception e){ }
또는 모든 유형의 인스턴스
@Inject Instance<List<Type>> instances
또한 get () 메소드는 필요한 경우 지연 평가됩니다. 기본 주입은 시작 시간에 평가되고 주입 될 수있는 빈이 발견되지 않으면 예외를 throw합니다. 빈은 물론 런타임에 주입되지만 이것은 불가능할 경우 응용 프로그램이 시작되지 않습니다. 이 문서에서 주입 된 인스턴스를 필터링하는 방법을 비롯하여 훨씬 더 많은 예제를 찾을 수 있습니다.
from https://stackoverflow.com/questions/19485878/can-inject-be-made-optional-in-jsr-330-like-autowirerequired-false by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] HTTP 상태 405 - 요청 메소드 'POST'가 지원되지 않음 (스프링 MVC) (0) | 2019.02.06 |
---|---|
[SPRING] RestTemplate PATCH 요청 (0) | 2019.02.06 |
[SPRING] Spring Data JPA 저장소 : 조건 적으로 자식 엔티티를 가져 오는 방법 (0) | 2019.02.06 |
[SPRING] Spring JDBC에서 현재 Connection 객체를 얻는 방법 (0) | 2019.02.06 |
[SPRING] 봄에 필수 속성을 정의하는 방법은 무엇입니까? (0) | 2019.02.06 |