[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.@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.업데이트 : 나는 당신이하려는 일을하는 것이 불가능하다고 두려워합니다. 주입 지점의 매개 변수로부터 생성자 인수를 얻을 수 없습니다. FactoryBean이 가장 먼저 보일 수 있지만 주입 지점 메타 데이터는 제공되지 않습니다. (주의 :이 사건은 CDI에서 쉽게 다루어진다)
업데이트 : 나는 당신이하려는 일을하는 것이 불가능하다고 두려워합니다. 주입 지점의 매개 변수로부터 생성자 인수를 얻을 수 없습니다. FactoryBean이 가장 먼저 보일 수 있지만 주입 지점 메타 데이터는 제공되지 않습니다. (주의 :이 사건은 CDI에서 쉽게 다루어진다)
원래 답변 : (외부에서 유형을 구성하는 경우 계속 작동 할 수 있음)
생성자에서 @Inject를 사용하기 만하면됩니다. 그러나 생성자 주입시 스프링이 찡그림에 유의하십시오. setter / field injection을 고려하십시오.
그러나 귀하의 경우에는 클래스가 하나 이상의 빈을 가질 가능성이 큽니다. 이 경우 @Resource (name = "beanName")를 사용할 수 있습니다.
javax.inject.Inject의 문서에서 :
-
==============================
3.생성자에 유형을 지정하는 옵션은 다음과 같습니다.
생성자에 유형을 지정하는 옵션은 다음과 같습니다.
public abstract class GenericDAO<T> { private Class<T> persistentClass; public GenericDAO() { this.persistentClass = (Class<T>) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; } ... }
각 T에 대해 특정한 구현을 가져야 만한다.
장점은 T 타입을 매개 변수로 전달할 필요가 없다는 것입니다.
-
==============================
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
인 경우 유형을 주입 할 수 있습니다.
from https://stackoverflow.com/questions/4614349/replace-constructor-arg-with-spring-annotation by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 보안에서 커스텀 UserDetail 객체를 생성하는 방법 (0) | 2019.03.29 |
---|---|
[SPRING] DataSourceUtils.getConnection 대 DataSource.getConnection (0) | 2019.03.29 |
[SPRING] 스프링 타이머 실행을 취소하는 방법 (0) | 2019.03.28 |
[SPRING] Spring3의 @Transactional @Scheduled가 DB에 커밋되지 않았습니까? (0) | 2019.03.28 |
[SPRING] 정적 와이어 스프링 클래스 (0) | 2019.03.28 |