生成服务层类

时间:2016-06-11 16:21:31

标签: java spring generics service dao

我正在尝试按照代码重用最佳做法。 我有一些通用的DAO接口和一些常用的方法:

    public interface DaoInterface<T> {
        T findById(int id);
        //...more methods...
    }

及其实现类:

    public class GenericDao<T> implements DaoInterface<T> {

        @SuppressWarnings("unchecked")
        private final Class<T> persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

        @Autowired
        protected SessionFactory sessionFactory;

        @Override
        @SuppressWarnings("unchecked")
        public T findById(int id) {
            Session session = sessionFactory.getCurrentSession();
            return (T) session.get(persistentClass, id);
        }

        //...more methods...
    }

然后我的每个具体实现类扩展GenericDao并实现其接口。

我的应用程序中也有Service层。一些服务的方法完全将他们的工作委托给DAO类。因此,在每个具体的Service实现中,我自动装配适当的DAO类并调用其方法。 所以现在它看起来:

public interface CustomerService {
    Customer findById(int id);
}

和实施:

@Service
@Transactional(readOnly = true, rollbackFor = Exception.class)
public class CustomerServiceImpl implements CustomerService {

    @Autowired
    private CustomerDao customerDao;

    @Override
    public Customer findById(int id) {
        return customerDao.findById(id);
    }
}

我的问题是 - 如何以与DAO相同的方式生成服务类?所以我的具体课将会看起来:

public class CustomerServiceImpl extends GenericService<Customer> implements CustomerService {
.....
}

问题是我无法在通用服务中自动装配DAO类:

@Autowired
private GenericDao<T> dao;

这样我就可以调用dao的方法。 我应该在构造函数中做到吗?

还有一个问题 - 在通用类或每个实现类中,使用@Transactional注释方法的正确位置在哪里?

1 个答案:

答案 0 :(得分:2)

您必须创建一个通用Dao的实例,并在服务层中做出一些决定:

abstract class GenericService<T> {
    @Autowired
    protected GenericDao dao;
    @SuppressWarnings("unchecked")
    protected final Class<T> persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

    @Override
    public T  findById(int id) {
        return dao.findById(id,persistenceClass);
    }   
}

此外,如果您需要一个好的通用存储库层,请查看Spring Data Jpa

这将使只有一个 GenericDao的实例。

接下来你有两个选择:

  1. 创建满足您所有需求的单件服务
  2. 为每个实体创建一个类服务

    Partial Class Pages_user
        Inherits System.Web.UI.Page
    
        Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs)
    
            If Not IsPostBack Then
                Dim conn As New System.Data.SqlClient.SqlConnection("Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\Laura\Final_proj\App_Data\surgerydb.mdf;Integrated Security=True;Connect Timeout=30")
                Dim cmdstring As String = "SELECT pt.PatientId, pt.ForeName, pt.Username, md.Name, md.Purpose, md.Instrcutions  " +
                                            "FROM Patient pt INNER JOIN prescription pr ON pt.PatientId = pr.PatientId  " +
                                            "INNER JOIN medicine md ON md.MedicineId = pr.MedicineId Where pt.PatientId  = @PatientId"
                Dim dt As New System.Data.DataTable()
                Dim da As New System.Data.SqlClient.SqlDataAdapter(cmdstring, conn)
                da.SelectCommand.Parameters.Add("@PatientId", System.Data.SqlDbType.Int).Value = CInt(Session("PatientId").ToString())
                conn.Open()
                da.Fill(dt)
                conn.Close()
    
                GridView1.DataSource = dt
                GridView1.DataBind()
            End If
    
        End Sub
    End Class
    

    现在,您的每个服务都必须使用提供的持久性类型扩展GenericService,并且作业已完成。