2013-02-12 2 views
0

에 차단 제외 :AspectJ를 - 시도 - 마지막으로 나는이 같은 많은 방법이있다 측면

Connection connection = null; 
    try { 
     connection = new Connection(); 
     connection.connect(); 
     .... // method body 

    } finally { 
     if (connection != null) { 
      connection.disconnect(); 
     } 
    } 

내가 apects (AspectJ를)로이 부분을 제외 할 수 있습니까?

+0

네, 주위에 조언을 할 수 있습니다. –

+0

@MarkoTopolnik ok,하지만'Connection' 객체를 만들고 메소드의 다른 코드에 액세스 할 수 있도록해야합니다 (즉, 미래에'connection.setMethod (...) '와 같이하고 싶습니다). 것이 가능하다? – MyTitle

+0

확실히 가능합니다. 질문은 당신이 좋아하는 것입니다. 하나의 아이디어는'ThreadLocal'을 사용하는 것입니다. –

답변

0

또는 복사/붙여 넣기를 피하기 위해 template pattern을 사용하여 연결 배관을 추출 할 수 있습니다. 이제

abstract ConnectionTemplate { 
    private Connection connection = // ... 

    /** 
    * Method to be implementad by child classes 
    */ 
    public abstract void businessLogicCallback(); 

    /** 
    * Template method that ensure that mandatory plumbing is executed 
    */ 
    public void doBusinessLogic() { 
     try { 
      openConnection(); 
      // fetch single result, iterate across resultset, etc 
      businessLogicCallback(); 
     finally { 
      closeConnection(); 
     } 
    } 

    void openConnection() { 
     connection.open(); 
    } 

    void closeConnection() { 
     if (connection != null) { 
      connection.close(); 
     } 
    } 
} 

, 클래스를 구현하는


스프링 프레임 워크는이 기술을 사용하면

ImportantBusinessClass importantClass = new ImportantBusinessClass(); 
importantClass.doBusinessLogic();  // opens connection, execute callback and closes connection 
처럼 사용 간단

class ImportantBusinessClass extends ConnectionTemplate { 

    @Override 
    public void businessLogicCallback() { 
     // do something important 
    } 
} 

로 할 수 있습니다 기본적인 아이디어는 뭔가처럼 어떤 곳에서는 특히 JdbcTemplate은 SQL, 연결, 행과 도메인 간의 매핑을 처리합니다. 개체 등 자세한 내용은 GitHub의 source code을 참조하십시오.

+0

고마워요. 하지만 'businessLogicCallback'의 반환 유형을 제어해야합니다. – MyTitle

+0

void 메소드는 예제 일뿐입니다. JdbcTemplate의 제공된 예제를 보면 입력 인수로 클래스를 기반으로 을 리턴하는 일반 메소드가 있음을 알 수 있습니다. 또한 [RowMapper ] (http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/jdbc/core/RowMapper.html)을 사용하여 ' List '및 [RowCallBackHandler] (http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/jdbc/core/RowCallbackHandler.html)를 참조하십시오. – matsev

2

주변 관리로 연결 관리를 추출하고 ThreadLocal에 노출함으로써 비즈니스 코드에서 문맥 상 Connection을 사용할 수 있습니다. 당신이 열려있는 연결에 ThreadLocal를 설정해야합니다 주위 조언에

public class ConnectionHolder { 
    public static final ThreadLocal<Connection> connection = new ThreadLocal<>(); 
} 

는 당신에게 아주 확실 무조건 분명 그 이후합니다 정적 속성과 함께 public 클래스를 정의합니다. 이것은 ThreadLocal s 인 가장 큰 함정입니다 : 개체를 관련없는 컨텍스트로 누출시킵니다. ThreadLocal을 상속하는 하위 스레드도주의하십시오 (WebSphere에 한 번 문제가있었습니다).

전체적으로 ThreadLocal은 상당히 더러운 해결책이지만, Spring과 같은 의존성 주입 프레임 워크를 사용하고 요청 범위가 설정된 bean 등을 구성해야합니다. 이는 좋은 생각이지만 당신의 부분에 대해 더 많은 연구를 할 것입니다.

+0

너무 게으른 코멘트에 대해 유감스럽게 생각합니다.하지만 가능한 한 코드를 명확하게 만들고 싶습니다. 요청 범위가있는 콩 등을 선호합니다. 스프링을 사용하여이를 달성하는 방법을 조금 더 설명 할 수 있습니까? 실제로 저는 Guice를 사용합니다. 그래서 Spring 예제/팁 등을 제공하면 Guice에게 코드를 포팅하려고합니다. 감사합니다. – MyTitle

+0

필자가 기억하는 한, XML 설정의 빈 선언에'scope = "request"속성 만 있으면된다. –