Слои Spring 3 Service Dao с абстрактным вопросом о классе - PullRequest
2 голосов
/ 01 августа 2011

Я пытаюсь реализовать общий абстрактный класс в моем слое обслуживания. Я уже использую шаблон simliar в моем слое дао, и он отлично работает. Я нашел рабочий пример в книге 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 class

    @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 class

    @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();
    }

}

интерфейс абстрактного сервиса

    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();

}

Ответы [ 3 ]

4 голосов
/ 01 августа 2011

Вместо того, чтобы вызывать метод (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;
     }
}

Нет необходимости вызывать метод извне, чтобы запустить цепочку передачи ссылок в действие.

1 голос
/ 01 августа 2011

Попробуйте заставить MyServiceImpl реализовать InitializingBean и изменить метод setDao () на afterPropertiesSet (). Он будет автоматически вызван после того, как фреймворк завершит вызов сеттера.

Или (еще проще) просто вызовите setDao () в вашем методе setHeaderDao (...).

0 голосов
/ 18 декабря 2015

Обновите версию Spring Framework до 4, и проблема будет решена.
проверьте эту страницу.

...