aspectj-autoproxy proxy-target-class="true" 하면 Service 만 AOP작동됨
- 작성자 :
- 박*규
- 작성일 :
- 2014-07-03 00:30:48
- 조회수 :
- 1,542
- 구분 :
- 개발환경
- 진행상태 :
- 완료
Q
context-aspect.xml에서
<aop:aspectj-autoproxy proxy-target-class="true"/>
설정하고
@Aspect
public class TableMetaDataAspectJ2 {
클래스에서
@Pointcut("execution(* com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(..))")
public void handleResults() {}
@Before("handleResults() && args(statementScope, rs, skipResults, maxResults, callback)") <---- aop작동 안됨
public void beforeHandleResults(StatementScope statementScope, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) {
ResultSetMetaData metaData = null;
try {
metaData = rs.getMetaData();
DataSet dataset = new DataSet();
for (int i = 0; i < metaData.getColumnCount(); i++) {
String columnName = metaData.getColumnName(i+1);
int columnType = metaData.getColumnType(i+1);
String userscoreStr = UPPER_UNDERSCORE.to(LOWER_CAMEL ,columnName);
//dataset.addColumn(userscoreStr, ConvertDataType.getPlatformDataTypeFromSqlType(columnType));
}
if( logger.isDebugEnabled()) {
logger.debug("===============================================================================================");
logger.debug("========== EXECUTE22 SQL QUERY ID:"+statementScope.getStatement().getId());
logger.debug("===============================================================================================");
}
//Context.local.set(dataset);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Pointcut("execution(public * sfd.esmart.test..*(..))") <---- @Service만 aop작동됨. @Controller쪽은 작동안됨
public void testAop() {}
@Before("testAop()")
public void beforeHandleResults(JoinPoint thisJoinPoint) throws Exception {
Class clazz = thisJoinPoint.getTarget().getClass();
String className = thisJoinPoint.getTarget().getClass().getSimpleName();
String methodName = thisJoinPoint.getSignature().getName();
System.out.println("AspectUsingAnnotation.beforeTargetMethod executed.");
System.out.println(className + "." + methodName + " executed.");
}
설정하면
Test01ServiceImpl.getTest01List executed.
Test01Dao.getTest01List executed.
처럼 @Service에서는 AOP가 되는데
@Controller에서 그리고 다른 위치에서는 AOP가 안됩니다.
POM.xml에는 cglib넣었습니다.
<aop:aspectj-autoproxy proxy-target-class="true"/>
설정하고
@Aspect
public class TableMetaDataAspectJ2 {
클래스에서
@Pointcut("execution(* com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(..))")
public void handleResults() {}
@Before("handleResults() && args(statementScope, rs, skipResults, maxResults, callback)") <---- aop작동 안됨
public void beforeHandleResults(StatementScope statementScope, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) {
ResultSetMetaData metaData = null;
try {
metaData = rs.getMetaData();
DataSet dataset = new DataSet();
for (int i = 0; i < metaData.getColumnCount(); i++) {
String columnName = metaData.getColumnName(i+1);
int columnType = metaData.getColumnType(i+1);
String userscoreStr = UPPER_UNDERSCORE.to(LOWER_CAMEL ,columnName);
//dataset.addColumn(userscoreStr, ConvertDataType.getPlatformDataTypeFromSqlType(columnType));
}
if( logger.isDebugEnabled()) {
logger.debug("===============================================================================================");
logger.debug("========== EXECUTE22 SQL QUERY ID:"+statementScope.getStatement().getId());
logger.debug("===============================================================================================");
}
//Context.local.set(dataset);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Pointcut("execution(public * sfd.esmart.test..*(..))") <---- @Service만 aop작동됨. @Controller쪽은 작동안됨
public void testAop() {}
@Before("testAop()")
public void beforeHandleResults(JoinPoint thisJoinPoint) throws Exception {
Class clazz = thisJoinPoint.getTarget().getClass();
String className = thisJoinPoint.getTarget().getClass().getSimpleName();
String methodName = thisJoinPoint.getSignature().getName();
System.out.println("AspectUsingAnnotation.beforeTargetMethod executed.");
System.out.println(className + "." + methodName + " executed.");
}
설정하면
Test01ServiceImpl.getTest01List executed.
Test01Dao.getTest01List executed.
처럼 @Service에서는 AOP가 되는데
@Controller에서 그리고 다른 위치에서는 AOP가 안됩니다.
POM.xml에는 cglib넣었습니다.
A
안녕하세요. 표준프레임워크입니다.
<aop:aspectj-autoproxy proxy-target-class="true"/> 설정은 인터페이스를 구현하지 않은 타깃 클래스에서도 AOP를 적용하기위해
쓰는 설정입니다. 따라서 현재 현상과는 관련이 없어보입니다.
위에 설정하신 AOP 설정에서 @Before을 잘못 설정하신 듯 합니다.
@Before안에 들어가는 value값은 Pointcut을 지정한 메소드명 또는 pointcut expression이 올 수 있습니다.
args는 포인트컷의 파라미터를 지정하는 것으로, 예를 들어 args(String)로 쓰시면 파라미터 개수가 하나이고 String타입인 것만 선택하라는 표현식입니다.
위에서 쓰신 방식으로 보아 before advice메소드 안에 다른 argument값을 넣기 위해 저렇게 쓰신 것으로 보입니다.
Before advice에 JointPoint외에 다른 argument를 쓰시려면
@Before(value="handleResults()", argNames="statementScope, rs, skipRsults, maxResults, callback")
이런 식으로 쓰시기 바랍니다.
추가로,
Controller에서 AOP를 실행하기 위해서는 Controller annotation이 스캔된 Container(context)에서 위와 같은
<aop:aspectj-autoproxy proxy-target-class="true"/> 설정을 해주셔야합니다.
감사합니다.
<aop:aspectj-autoproxy proxy-target-class="true"/> 설정은 인터페이스를 구현하지 않은 타깃 클래스에서도 AOP를 적용하기위해
쓰는 설정입니다. 따라서 현재 현상과는 관련이 없어보입니다.
위에 설정하신 AOP 설정에서 @Before을 잘못 설정하신 듯 합니다.
@Before안에 들어가는 value값은 Pointcut을 지정한 메소드명 또는 pointcut expression이 올 수 있습니다.
args는 포인트컷의 파라미터를 지정하는 것으로, 예를 들어 args(String)로 쓰시면 파라미터 개수가 하나이고 String타입인 것만 선택하라는 표현식입니다.
위에서 쓰신 방식으로 보아 before advice메소드 안에 다른 argument값을 넣기 위해 저렇게 쓰신 것으로 보입니다.
Before advice에 JointPoint외에 다른 argument를 쓰시려면
@Before(value="handleResults()", argNames="statementScope, rs, skipRsults, maxResults, callback")
이런 식으로 쓰시기 바랍니다.
추가로,
Controller에서 AOP를 실행하기 위해서는 Controller annotation이 스캔된 Container(context)에서 위와 같은
<aop:aspectj-autoproxy proxy-target-class="true"/> 설정을 해주셔야합니다.
감사합니다.