用Spring Annotation替换<constructor-arg> </constructor-arg>

时间:2011-01-06 11:23:08

标签: java spring generics annotations code-injection

有一种方法可以用Annotation替换constructor-arg吗?

我有这个构造函数:

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>

我想只使用注释转换代码。 有人可以解释一下吗?

4 个答案:

答案 0 :(得分:4)

我认为仅@Inject无效,您还必须使用@Qualifier注释。

以下是春季参考文献的相关章节:
3.9.3 Fine-tuning annotation-based autowiring with qualifiers

如果我理解正确,您将必须使用@Qualifier机制。

如果您使用Spring's @Qualifier annotation,则可以内联执行,如下所示:

@Repository
public class DaoImpl implements Dao{

    private final Class<?> type;

    public DaoImpl(@Qualifier("type") final Class<?> type){
        this.type = type;
    }

}

但如果您使用JSR-330 @Qualifier annotation,我猜您必须创建自己的标有@Qualifier的自定义注释。


另一种可能性是@Value注释。有了它,您可以使用表达式语言,例如像这样:

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

答案 1 :(得分:2)

更新:恐怕不可能做你想做的事。您无法从注入点的参数中获取构造函数参数。 FactoryBean将是第一个看的地方,但没有给出注入点元数据。 (需要注意的是:CDI很容易涵盖此案例)

原始答案:(如果您在外部配置类型,这可能仍然有效)

只需在构造函数上使用@Inject即可。但请注意,春天在构造函数注入时皱眉。考虑setter / field injection。

但是,在您的情况下,您可能有多个Class类型的bean。如果是这种情况,您可以使用@Resource(name="beanName")

来自javax.inject.Inject的文档:

  

可注入的构造函数使用@Inject注释,并接受零个或多个依赖项作为参数。 @Inject可以应用于每个类最多一个构造函数。

   @Inject ConstructorModifiersopt SimpleTypeName(FormalParameterListopt)  
   Throwsopt ConstructorBody

答案 2 :(得分:2)

在构造函数中包含类型的选项是:

public abstract class GenericDAO<T> {
    private Class<T> persistentClass;

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

但每个T必须有特定的不同实现。

优点是您不需要将T类型作为参数传递。

答案 3 :(得分:0)

春天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<Person>