用Spring Annotation替换

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

我有这个构造函数:

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

我需要在我的Facade中注入:

 @Inject private GenericDAO autoDao; 

问题是我不知道如何在costructor中传递参数的值。

先感谢您

[更多信息]我试着解释我的问题。

   genericdaotest.domain.Person   

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

我认为@Inject本身无济于事,你也必须使用@Qualifier注释。

这是Spring Reference的相关部分:
3.9.3使用限定符微调基于注释的自动assembly

如果我理解正确,你将不得不使用@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注释。 有了它,你可以使用表达式语言,例如:

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

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

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

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

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

来自javax.inject.Inject的文档:

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

  @Inject ConstructorModifiersopt SimpleTypeName(FormalParameterListopt) Throwsopt ConstructorBody 

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

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

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

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

Spring的Java配置在这里可能会有所帮助。 如果您创建一个只使用注释@Configuration@Bean定义bean的Java类,它可能看起来像这样:

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

确保扫描DaoConfiguration类(通常通过@ComponentScan ),并在Spring上下文中为您创建适当的DAO对象。 bean将具有方法的名称,在本例中为personDao因此您可以使用名称personDao类型(如果类型为GenericDAO 按名称注入它。