Hibernate Annotation:如何将类的bean注释为@Repository

时间:2014-05-05 22:01:11

标签: java spring hibernate

我正在使用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,那会起作用吗?

非常感谢。

2 个答案:

答案 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,并且仍然有资格进行自动装配。