用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
按名称注入它。