복붙노트

[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. ==============================

    1.아니요 ... JSR 330의 선택적 요소는 없습니다 ... 선택적 주입을 사용하려면 특정 프레임 워크를 사용해야합니다. @Autowired annotation

    아니요 ... JSR 330의 선택적 요소는 없습니다 ... 선택적 주입을 사용하려면 특정 프레임 워크를 사용해야합니다. @Autowired annotation

  2. ==============================

    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. ==============================

    3.인스턴스 주입은 종종 간과됩니다. 유연성이 뛰어납니다. 종속성을 가져 오기 전에 사용 가능성을 확인하십시오. 충족되지 않은 get은 값 비싼 예외를 throw합니다. 용도:

    인스턴스 주입은 종종 간과됩니다. 유연성이 뛰어납니다. 종속성을 가져 오기 전에 사용 가능성을 확인하십시오. 충족되지 않은 get은 값 비싼 예외를 throw합니다. 용도:

    @Inject
    Instance<SomeType> instance;
    SomeType instantiation;
    
    if (!instance.isUnsatisfied()) {
        instantiation = instance.get();
    }
    

    주입 후보를 정상적으로 제한 할 수 있습니다.

    @Inject
    @SomeAnnotation
    Instance<SomeType> instance;
    
  4. ==============================

    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. ==============================

    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합니다. 빈은 물론 런타임에 주입되지만 이것은 불가능할 경우 응용 프로그램이 시작되지 않습니다. 이 문서에서 주입 된 인스턴스를 필터링하는 방법을 비롯하여 훨씬 더 많은 예제를 찾을 수 있습니다.

  6. from https://stackoverflow.com/questions/19485878/can-inject-be-made-optional-in-jsr-330-like-autowirerequired-false by cc-by-sa and MIT license