JAVA基礎編(7)-カスタム注釈(実践)
3443 ワード
JAVA && Spring && SpringBoot2.x-学習ディレクトリ
Spring AOPとHystrixカスタム注釈を組み合わせたケース.
AOP-Spring実プロジェクトにおける切面向けプログラミング(ツールクラスを含む)
1.関連maven依存
2.注記解析
本質的にSpringのAOPを用いてカスタムJava注釈を解析する.
注記ソース:
解析ソース:
2.折り返し通知
JoinPointオブジェクトからMethodオブジェクトを取得し、オブジェクトへの注釈を取得して、操作を完了できます.
Spring AOPとHystrixカスタム注釈を組み合わせたケース.
AOP-Spring実プロジェクトにおける切面向けプログラミング(ツールクラスを含む)
1.関連maven依存
com.netflix.hystrix
hystrix-javanica
1.5.18
2.注記解析
本質的にSpringのAOPを用いてカスタムJava注釈を解析する.
注記ソース:
com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface HystrixCommand {
String groupKey() default "";
String commandKey() default "";
String threadPoolKey() default "";
String fallbackMethod() default "";
HystrixProperty[] commandProperties() default {};
HystrixProperty[] threadPoolProperties() default {};
Class extends Throwable>[] ignoreExceptions() default {};
ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
HystrixException[] raiseHystrixExceptions() default {};
String defaultFallback() default "";
}
解析ソース:
com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect
1.切断面の定義 @Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand)")
public void hystrixCommandAnnotationPointcut() {
}
@Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser)")
public void hystrixCollapserAnnotationPointcut() {
}
2.折り返し通知
@Around("hystrixCommandAnnotationPointcut() || hystrixCollapserAnnotationPointcut()")
public Object methodsAnnotatedWithHystrixCommand(final ProceedingJoinPoint joinPoint) throws Throwable {
Method method = getMethodFromTarget(joinPoint);
Validate.notNull(method, "failed to get method from joinPoint: %s", joinPoint);
if (method.isAnnotationPresent(HystrixCommand.class) && method.isAnnotationPresent(HystrixCollapser.class)) {
throw new IllegalStateException("method cannot be annotated with HystrixCommand and HystrixCollapser " +
"annotations at the same time");
}
MetaHolderFactory metaHolderFactory = META_HOLDER_FACTORY_MAP.get(HystrixPointcutType.of(method));
MetaHolder metaHolder = metaHolderFactory.create(joinPoint);
HystrixInvokable invokable = HystrixCommandFactory.getInstance().create(metaHolder);
ExecutionType executionType = metaHolder.isCollapserAnnotationPresent() ?
metaHolder.getCollapserExecutionType() : metaHolder.getExecutionType();
Object result;
try {
if (!metaHolder.isObservable()) {
result = CommandExecutor.execute(invokable, executionType, metaHolder);
} else {
result = executeObservable(invokable, executionType, metaHolder);
}
} catch (HystrixBadRequestException e) {
throw e.getCause();
} catch (HystrixRuntimeException e) {
throw hystrixRuntimeExceptionToThrowable(metaHolder, e);
}
return result;
}
JoinPointオブジェクトからMethodオブジェクトを取得し、オブジェクトへの注釈を取得して、操作を完了できます.