복붙노트

[SPRING] <constructor-arg>를 Spring Annotation으로 대체한다.

SPRING

를 Spring Annotation으로 대체한다.

constructor-arg를 Annotation으로 대체하는 방법이 있습니까?

이 생성자가 있습니다.

public GenericDAOImpl(Class<T> type) {
    this.type = type;
}

그리고 내 Facade에 그것을 주입해야합니다.

@Inject
private GenericDAO<Auto, Long> autoDao;

문제는 내가 costructor에서 매개 변수의 값을 전달하는 방법을 모른다는 것입니다.

미리 감사드립니다.

[더 많은 정보] 나는 내 문제를 설명하려고 노력한다.

<bean id="personDao" class="genericdao.impl.GenericDaoHibernateImpl">
        <constructor-arg>
            <value>genericdaotest.domain.Person</value>
        </constructor-arg>
</bean>

주석 만 사용하여 코드를 변환하고 싶습니다. 누군가 어떻게 설명 할 수 있습니까?

해결법

  1. ==============================

    1.@Inject만으로는 도움이되지 않는다고 생각합니다. @Qualifier 주석도 사용해야합니다.

    @Inject만으로는 도움이되지 않는다고 생각합니다. @Qualifier 주석도 사용해야합니다.

    다음은 Spring Reference의 관련 섹션입니다. 3.9.3 한정자로 주석 기반 자동 와이어링 미세 조정

    올바르게 이해한다면 @Qualifier 메커니즘을 사용해야합니다.

    Spring의 @Qualifier 주석을 사용하는 경우 다음과 같이 인라인 할 수 있습니다.

    @Repository
    public class DaoImpl implements Dao{
    
        private final Class<?> type;
    
        public DaoImpl(@Qualifier("type") final Class<?> type){
            this.type = type;
        }
    
    }
    

    그러나 JSR-330 @ Qualifier 주석을 사용하는 경우 @Qualifier로 표시된 고유 한 사용자 정의 주석을 만들어야합니다.

    또 다른 가능성은 @Value 주석입니다. 그것으로 Expression Language를 사용할 수 있습니다. 이렇게 :

    public DaoImpl(
        @Value("#{ systemProperties['dao.type'] }")
        final Class<?> type){
        this.type = type;
    }
    
  2. ==============================

    2.업데이트 : 나는 당신이하려는 일을하는 것이 불가능하다고 두려워합니다. 주입 지점의 매개 변수로부터 생성자 인수를 얻을 수 없습니다. FactoryBean이 가장 먼저 보일 수 있지만 주입 지점 메타 데이터는 제공되지 않습니다. (주의 :이 사건은 CDI에서 쉽게 다루어진다)

    업데이트 : 나는 당신이하려는 일을하는 것이 불가능하다고 두려워합니다. 주입 지점의 매개 변수로부터 생성자 인수를 얻을 수 없습니다. FactoryBean이 가장 먼저 보일 수 있지만 주입 지점 메타 데이터는 제공되지 않습니다. (주의 :이 사건은 CDI에서 쉽게 다루어진다)

    원래 답변 : (외부에서 유형을 구성하는 경우 계속 작동 할 수 있음)

    생성자에서 @Inject를 사용하기 만하면됩니다. 그러나 생성자 주입시 스프링이 찡그림에 유의하십시오. setter / field injection을 고려하십시오.

    그러나 귀하의 경우에는 클래스가 하나 이상의 빈을 가질 가능성이 큽니다. 이 경우 @Resource (name = "beanName")를 사용할 수 있습니다.

    javax.inject.Inject의 문서에서 :

  3. ==============================

    3.생성자에 유형을 지정하는 옵션은 다음과 같습니다.

    생성자에 유형을 지정하는 옵션은 다음과 같습니다.

    public abstract class GenericDAO<T> {
        private Class<T> persistentClass;
    
        public GenericDAO() {
            this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0];
        }
    ...
    }
    

    각 T에 대해 특정한 구현을 가져야 만한다.

    장점은 T 타입을 매개 변수로 전달할 필요가 없다는 것입니다.

  4. ==============================

    4.Spring Java Configuration이 도움이 될 것입니다. @Configuration과 @Bean 어노테이션을 사용하여 bean을 정의하는 Java 클래스를 작성하면 다음과 같이 보일 수 있습니다.

    Spring Java Configuration이 도움이 될 것입니다. @Configuration과 @Bean 어노테이션을 사용하여 bean을 정의하는 Java 클래스를 작성하면 다음과 같이 보일 수 있습니다.

    @Configuration
    public class DaoConfiguration {
        @Bean
        public GenericDAO<Person> personDao() {
            return new GenericDaoHibernateImpl(Person.class);
        }
    }
    

    DaoConfiguration 클래스가 (일반적으로 @ComponentScan을 통해) 스캔되었는지 확인하고 Spring 컨텍스트에서 적절한 DAO 객체가 생성되는지 확인하십시오. bean은이 경우 personDao 인 메소드의 이름을 가지므로 PersonDao라는 이름을 사용하여 이름을 주입하거나 유형이 GenericDAO 인 경우 유형을 주입 할 수 있습니다.

  5. from https://stackoverflow.com/questions/4614349/replace-constructor-arg-with-spring-annotation by cc-by-sa and MIT license