2012-06-14 7 views
0

내 프로젝트에서 봄과 ibatis를 사용합니다. 여기에 제 질문이 있습니다.타사 클래스를 pointcut 할 수 있습니까?

add/update/delete과 같은 모든 변경 사항을 추적하고 표 T_TRACE_LOG에 기록하고자합니다. 표의 열은 operation_type, object_type, log_content, log_date입니다. AOP의 내 마음에 와서 내가 자동으로이 과정을 원

"add", "customer", "name='andy',age=23,...", 2012-06-14 17:04:57.410 

log_content는 Customer.toString()에서 온다 : 여기

는 예를 들어 기록이다.

일부는 이고 일부는 insertCustomer()이고 다른 일부는 createCustomer()을 사용하기 때문에 클라이언트 코드를 제어 할 수 없습니다. 그러나 그들 모두는 마침내 getSqlMapClientTemplate().insert("inserCustomer", Customer)라고 불렀다. 그래서 getSqlMapClientTemplate().insert()에 pointcut하여 모두 일치 시키길 원합니다. 여기

내 노력하지만, 그것은 작동하지 않습니다

는 AOP는 클래스에 "포인트 컷 정보를"컴파일
<aop:pointcut expression="execution(* com.xxx.CustomerDaoImpl.insert(..))" id="logPointCut"/> 

때문에 : 나는 다음과 같이 표현을 변경하는 경우

<aop:pointcut expression="execution(* org.springframework.orm.ibatis.SqlMapClientTemplate.insert(..))" id="insertLogPointCut"/> 

의미가 있습니다 바이트 코드 기반의 소스 코드이므로 ibatis 클래스에서 pointcut하는 것은 불가능하다고 생각합니다. 그것이 틀렸다면, 어떻게 내 상황을 처리 할 수 ​​있습니까? (이것은 자바의 동적 프록시를 사용하고 있기 때문에) 봄

<aop:aspectj-autoproxy proxy-target-class="true"/> 
<bean id="traceLogger" class="com.xx.TraceLogger"/> 
<aop:config> 
    <aop:pointcut expression="execution(* com.xx.CustomerDaoImpl.insert(..))" id="insertLogPointCut"/> 
    <aop:aspect id="logAspect" ref="traceLogger"> 
     <aop:after-returning method="logAfterReturning" pointcut-ref="insertLogPointCut"/> 
    </aop:aspect> 
</aop:config> 
+1

봄에 의해 클라이언트 템플릿 클래스가 인스턴스화됩니까? –

+0

예, 스프링의 ioc로 인스턴스화되었습니다. SqlMapClientTemplate은 org.springframework.orm.ibatis.SqlMapClientFactoryBean을 가리키는 참조 "sqlMapClient"와 함께 CustomerDaoImpl에 삽입됩니다. –

+0

주석이 아닌 질문에 정보를 추가하십시오. –

답변

1

기본 AOP의 동작은 인터페이스와 함께 작동 : 여기

는 구성입니다. pointcut이 concrete 클래스에 설정되어 있으면 작동하지 않습니다.

SqlMapClientTemplate, 올바르게 기억한다면 클래스입니다.

당신은 "실행 (* org.springframework으로 포인트 컷을 대신 SqlMapClientTemplate의 SqlMapClientOperations를 사용하고 작성하는 프록시 생성을위한 CG-lib 디렉토리를 사용하여

  1. 의 선택, 또는
  2. 변화 여러분의 빈 있습니다. orm.ibatis.SqlMapClientOperations.insert (..))는 "

나는 당신의 생각이 잘못, 방법 2.

추천된다. AOP 관련 내용은 해당 바이트 코드로 컴파일되지 않습니다. 그들은 모두 런타임에서 처리됩니다 (Spring의 경우)

+0

네, 맞습니다. Spring AOP는 AspectJ와 다르다. Spring AOP는 동적 프록시 패턴을 사용하므로 런타임에 작동합니다. AspectJ의 ajc는 바이트 코드로 컴파일된다. –

+0

귀하의 방법 2에 대해, 나는 아직도 어떻게해야할지 모르겠다.내'CustomerDaoImpl'은'SqlMapClientDaoSupport'에서 확장되었고, 단순히 addCustomer (customer) 메소드에서'getSqlMapClientTemplate(). insert ("addCustomer", customer)'를 호출합니다. 그렇다면 SqlMapClientOperations를 대신 사용하는 방법은 무엇입니까? –

+0

정보를 제공해 주셔서 감사합니다. 그건 내 잘못이야. 문제를 발견했다. Dao 인터페이스의 일부가 아닌 DaoImpl의 메소드에서'getSqlMapClientTemplate(). insert ("addCustomer", customer)'를 호출했습니다. 이것은 방금 루프의 다른 인터페이스 메소드에 의해 호출되었습니다 (많은 고객 삽입). 나는 Dao 인터페이스에 메서드를 추가하고 작동합니다. 감사! –

관련 문제