簡體   English   中英

Spring 3 Service Dao層與抽象類問題

[英]Spring 3 Service Dao layers with abstract class question

我正在嘗試在服務層中實現通用抽象類。 我已經在我的dao層中使用了類似的模式,並且工作正常。 我在Spring in Practice v8電子書中找到了一個工作示例。 我想知道是否有一種方法可以自動連接以下工作代碼。 (代碼有效,但是在類中使用任何其他方法之前,我必須調用輔助方法“ setDao”)

測試類別:

    public class App {


    public static void main(String[] args) {
        ApplicationContext appContext = new ClassPathXmlApplicationContext("classpath:/applicationContext.xml");

        MyService service = (MyService)appContext.getBean("myService");

        service.setDao();

        Heading detail = new Heading();
        detail.setName("hello");

        service.save(detail);

        Heading dos = service.findById(Long.valueOf(1));
        System.out.println(dos);
    }
}

MyServiceImpl類

    @Service("myService")
public class MyServiceImpl extends AbstractServiceImpl<Heading> implements HeadingService {

    @Autowired
    private HeadingDao headingDao;

    public void setHeadingDao(HeadingDao headingDao) {
        this.headingDao = headingDao;
    }

    public void setDao() {
        super.setDao(this.headingDao);
    }

}

MyService介面

    public interface HeadingService extends AbstractService<Heading> {
    public void setDao();
}

AbstractServiceImpl類

    @Service
public abstract class AbstractServiceImpl<T extends Object> implements AbstractService<T> {

    private AbstractDao<T> dao;

    public void setDao(AbstractDao<T> dao) {
        this.dao = dao;
    }

    public void save(T t) {
        dao.save(t);
    }

    public T findById(Long id) {
        return (T)dao.findById(id);
    }

    public List<T> findAll() {
        return dao.findAll();
    }

    public void update(T t) {
        dao.update(t);
    }

    public void delete(T t) {
        dao.delete(t);
    }

    public long count() {
        return dao.count();
    }

}

AbstractService接口

    public interface AbstractService<T extends Object> {

    public void save(T t);
    public T findById(Long id);
    public List<T> findAll();
    public void update(T t);
    public void delete(T t);
    public long count();

}

不必調用方法( setDao() )來允許您的子類將DAO引用傳遞給您的超類,為什么要反轉方向並強制子類將DAO提供給超類?

例如:

public abstract class AbstractServiceImpl<T extends Object> implements AbstractService<T> {
    private AbstractDao<T> dao;

    abstract AbstractDao<T> getDao();

    public void save(T t) {
        getDao().save(t);
    }
}

public class FooServiceImpl extends AbstractServiceImpl<Foo> {
     @Autowired
     private FooDao fooDao;

     @Overrides
     public AbstractDao<Foo> getDao() {
         return fooDao;
     }
}

無需從外部調用方法即可將引用傳遞鏈付諸實踐。

嘗試使MyServiceImpl實現InitializingBean,並將setDao()方法更改為afterPropertiesSet()。 在框架調用設置器后,它將自動被調用。

或者,(甚至更簡單),只需在setHeaderDao(...)方法中調用setDao()。

將spring框架版本升級到4,即可解決問題。
檢查頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM