Не только с Java.
Но если вы компилируете с помощью компилятора AspectJ или модифицируете ваши классы с помощью ткачества времени загрузки AspectJ, то это возможно.
Определение аспекта из Википедия :
аспект является частью программы, которая
решает основные проблемы
Аспекты часто используются для добавления, например, логики транзакций и безопасности.
Чтобы продемонстрировать, как аспект может решить вашу проблему, я создал пример, который перехватывает все исключения, возвращаемые из вызова на интеграционный уровень, из метода в классах, помеченных аннотацией @Service. В этом случае классы, которые содержат .integration.
в имени пакета.
Это всего лишь пример. Вы можете изменить его, чтобы перехватывать RuntimeExceptions в других местах. Например, во всех методах, которые находятся внутри класса, в имени которого есть Facade и который вызывает другие методы. Смотрите картинку ниже для идей:
альтернативный текст http://files.espenberntsen.net/stackoverflow/call-to-integration-layer.png
Оранжевые стрелки - мой pointpect AspectJ, проиллюстрированный с помощью плагина AJDT в Eclipse. Это места, где вы можете поймать и справиться с исключениями времени выполнения в AfterThrowing
рекомендации.
Вот совет:
@AfterThrowing(value="serviceMethodAfterExpcetionFromIntegrationLayerPointcut()",
throwing="e")
public void serviceMethodAfterExceptionFromIntegrationLayer(JoinPoint joinPoint,
RuntimeException e) {
StringBuilder arguments = generateArgumentsString(joinPoint.getArgs());
logger.error("Error in service " + joinPoint.getSignature()
+ " with the arguments: " + arguments, e);
}
My serviceMethodAfterExpcetionFromIntegrationLayerPointcut
фактически состоит из двух других точек:
@Pointcut("call(* *..integration.*.*(..))")
public void integrationLayerPointcut() {}
@Pointcut("within(@org.springframework.stereotype.Service *)")
public void serviceBean() {}
@Pointcut("serviceBean() && integrationLayerPointcut()")
public void serviceMethodAfterExpcetionFromIntegrationLayerPointcut() {}
Вкратце, pointcut находит все места в классах, помеченных аннотацией @Service
, которые вызывают метод в классе на уровне интеграции. (См. Оранжевые стрелки на картинке)
Если вы хотите вместо этого перехватывать исключения во время выполнения в своих тестовых классах, вы можете изменить точку на это:
@Pointcut("within(com.redpill.linpro.demo..*Test)")
public void inDemoProjectTestClass() {}
Тогда приведенный выше совет перехватит все исключения в тестовых классах, которые заканчиваются на Test в пакете ..demo.
Дополнительная информация о @ AspectJ style здесь .
AspectJ хорошо интегрируется с Spring. Общую информацию об AspectJ можно найти здесь и поддержку Spring AspectJ здесь .