我正在使用hibernate编写持久层代码。
我有一些我曾经注释为@Component的DAO类。
package com.mycompany.mypackage;
@Component
class MyDAO {
}
我在Spring配置中使用组件扫描,如下所示:
<context:annotation-config/>
<context:component-scan base-package="com.mycompany.mypackage"/>
如果我这样做,则会创建一个ID为“myDAO”的bean。但是,我被告知最好使用@Repository,因为它是一个持久层代码。
但是在用@ Repository替换@Component之后,bean就不会自动创建了。
我的问题是:这两个星期日有什么区别?如何使用自动扫描和使用@Repository创建bean?如果我继续使用@Component,那会起作用吗?
非常感谢。
答案 0 :(得分:0)
@Repository bean有资格进行持久性异常转换,应该在运行时加载。这是您要用于DAO图层的内容。
@Component之后被添加到Spring中,只是意味着annontated类是一个“spring bean”,并将在组件扫描期间加载。
通用DAO与组件扫描不能很好地融合。如果您考虑它,这是有道理的 - 您需要能够定义此类的多个实例,而不同之处仅在于传递给构造函数的类。该类本身无法自动装配,因此Spring无法使用它。
对于这部分,最好的办法是只用XML定义repo实例。如果你真的决定使用组件扫描,你必须继承Generic DAO并提供一个硬编码类的默认构造函数
答案 1 :(得分:0)
正如@Mortsahl所说,只需执行以下操作
public abstract class GenericDAOImpl<T> implements GenericDAO<T> {
private Class<T> type;
@Autowired
private SessionFactory sessionFactory;
@SuppressWarnings("unchecked")
public GenericDAOImpl(){
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
type = (Class<T>) pt.getActualTypeArguments()[0];
}
通过这种方式,您可以扩展您的通用DAO,并且仍然有资格进行自动装配。