2013-03-24 1 views
1

여러 개의 DAO 클래스 (스프링 JDBC를 사용함)를 만들었으므로 검색 인덱스를 업데이트 할 수 있도록 저장, 업데이트 및 삭제에 대한 이벤트를 내보내려고합니다.저장, 업데이트 및 삭제시 이벤트를 방출하는 DAO

한 가지 방법은 각 DAO에서 이벤트 방출 논리를 작성하는 것이지만 많은 반복이 될 수 있습니다. 그래서 나는 AOP와 "around advice"를 사용하는 것을 생각했다. 그러나 이것이 AOP를 사용하는 정확한 "시간"인지 나는 모른다. 더 적합한 다른 솔루션이 있습니까?

답변

2

리스너를 사용하여이 작업을 수행 할 수도 있습니다. 자식 클래스는 부모 클래스를 일종의 도우미로 활용한다는 점에서 흐름이 약간 뒤집 힙니다.

public abstract class AbstractCrudDao<T> { 
    private Collection<Listener> listeners = new HashSet<Listener>(); 

    public void addListener(final Listener listener) { 
     listeners.add(listener); 
    } 

    protected void doAction(CrudAction<T> crudAction) 
    { 
     for(Listener listener : listeners) { 
      listener.beforeAction(); 
     } 
     crudAction.doAction(); 
     for(Listener listener : listeners) { 
      listener.afterAction(); 
     } 
    } 

    public interface CrudAction { 
     void doAction(); 
    } 

    public interface Listener { 
     void beforeAction(); 
     void afterAction(); 
    } 
} 

public class CarDao extends AbstractCrudDao { 
    public void create(Car car) { 
     doAction(new CrudAction() { 
      public void doAction() { 
       //create car here 
      } 
     }); 
    } 
} 

각 CRUD 작업을 위해 별도의 CollectionListener의 년대를 만들 수도 있고, 어쨌든 당신이 원하는 원하는대로 변경합니다.

+0

업데이트 해 주셔서 감사합니다. 그러나 하위 클래스에서 create 메소드의 구현을 어떻게 지정할 수 있습니까? CarDao와 같은? 추상적 인 DAO에서 모든 것을 지정하는 경우 이것이 어떻게 작동하는지 알지만 하위 클래스의 실제 로직을 구현해야 할 때는 그렇지 않습니다. – LuckyLuke

+0

업데이트되어 더 잘 작동하는지 알려주세요. –

+0

그게 내가 원하는 것을 더 많이 보았습니다. 고마워요! 콜백의 예가 나쁘지는 않지만 유연성과 API 디자인에 대해 생각하고있었습니다. 하지만 예를 들어 InsertListeners 또는 UpdateListeners 만 호출하는 방법은 무엇입니까? 다른 버전의 CrudAction을 만들고 instanceof 연산자를 사용합니까? – LuckyLuke

2

모든 CRUD DAO에 대한 추상 baseclass를 작성하면됩니다. 기본 인터페이스는 콜백 메커니즘의 일종에 걸릴 것입니다,이 같은 보일 것이다 :

public abstract class AbstractCrudDao<T> { 
    public void create(T t, CompleteCallback completeCallback) 
    { 
     create(t); 
     completeCallback.onComplete(); 
    } 

    public abstract void create(T t); 

    //same for read, update, delete 

    public interface CompleteCallback { 
     void onComplete(); 
    } 
} 

분명히 이것이 완료 예에서 멀리이다,하지만 난 그게위한 트리거로 콜백을 활용하는 아이디어를 전시 생각 완성. onException 이벤트를 수신하기 위해 인터페이스를 추가로 확장 할 수 있습니다.

Spring의 트랜잭션 관리를 사용하는 경우 트랜잭션의 내부 또는 외부에서 콜백 이벤트를 수행할지 여부에 따라 추가 조정이 필요할 수 있습니다.

개인적으로 DAO 코드를 소유하지 않는 한 개인적으로는 AOP를 사용하지 않겠지 만, 그렇다고하더라도 다른 메커니즘이 선호 될 수 있습니다.

+0

이것이 어떻게 작동하는지 알 수 있지만 사용법에 대해 하나의 질문이 있습니다. 개체에 색인을 생성하는 서비스에서 콜백 수신기를 구현했거나 인터페이스를 구현 한 익명 클래스를 만든 다음 내부에 검색 인덱서를 사용하겠습니까? – LuckyLuke

+0

글쎄, 그것은 누가 콜백에 행동 할 것인가에 달려있다. 콜백 위임을 통해 콜백을 적절한 위치에 전달해야 할 수도 있습니다. 이 시점에서 익명의 내부 클래스 또는 최상위 수준의 구체적인 구현을 사용하여 구현을 인라인 할 수 있습니다. –

+0

니스, 이것을 구현하려고합니다. 그것의 아이디어처럼 :) – LuckyLuke

관련 문제