有一种方法可以用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>
我想只使用注释转换代码。 有人可以解释一下吗?
答案 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>
。