統合のmemcacheの形でAOPのアノテーション

1.最初のカスタム注:キャッシュを追加します。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
公共@interface Memcachedの{
//デフォルト= STATICキー接頭辞がキャッシュOMSクリアするために使用することができる
文字列のプレフィックス()デフォルト"STATIC_を";
//キー
文字列キー()デフォルト「」;
//フィルタ
文字列の条件()デフォルトの「真の」;
//パケットバッファ
文字列グループ()デフォルトの「ポータル・HOS-mclient1」;
二日単位のSの//バッファ期間
int型の有効期限()デフォルト60 * 60 * 48;
}
2.クラスセクション

@Aspect
パブリッククラスMemCachedAop {

プライベート静的最終ロガーログ= LoggerFactory.getLogger(MemCachedAop.class)。

@value( "$ {enable.static.cache}")
プライベートブールenableCache。

@Pointcut( "実行(* com.ylzinfo.hospital.portal.service.appservice * * *(..))。。。")
空隙appservicePointcut(保護){}

@Autowired
プライベートICacheClient cacheClient。

/ **
*写入或者读取缓存
*仅针对有注解的且该包下的方法
* /
@Around( "(注釈@(memcachedの)&& appservicePointcut())")
パブリックオブジェクトdoMemcachedAround(ProceedingJoinPointコール、memcachedのmemcachedの)のThrowable {スロー
文字列のpackageName = call.getSignature()getDeclaringTypeName()。
Call.getSignature methodNameの=文字列()のgetName();.
Log.info( "実行方法:{} - > {}"のpackageName、methodNameの);
//最終結果を返す
= nullオブジェクトの検索結果を;
//チェック条件
IF (!ヌル= memcachedの
&& checkConditions(呼び出して、memcached.conditions())
&& enableCache){
文字列のキー= resolvingKey(呼び出して、memcached.prefix()、memcached.key());
文字列memcached.groupグループ=();
結果cacheClient.get =(グループ、キー);
IF(結果== NULL){
// memcachedの中に存在していない
試し{
// AOPインターセプト法の実行
結果を= call.proceed();
//取得したアノテーション構成memcachedの有効期限
int型= memcached.expiration有効期限();
cacheClient.put(グループ、キー、結果、有効期限)。
log.info( "\ nは[]のMemcachedの書き込みバッファ" +
"\ NGROUP = {}" +
"\ NKEY = {}" +
"\ nValue = {}" +
"\ nexpiration = {}"、グループキー、JSON.toJSON(結果)、有効期限);
}キャッチ(ThrowableをE){
log.errorは( "メソッドの実行に失敗しました:{} - > {}"のpackageName、methodNameの);
log.error(「失敗理由:{} ; "e.getMessage())
}
}そうで{
//のmemcachedに直接リターンがある
\ nは[]のMemcachedを読み出すバッファ(log.info" "+
" \ NGROUP = {} "+
" \ NKEY = {} " +
"\ nValue = {}"、グループ、キー、JSON.toJSON(結果));
}
} {他
のtry {
結果= call.proceed();
}キャッチ(ThrowableのE){
log.errorは(「メソッドの実行に失敗しました:{} - > {}」 、のpackageName、methodNameの);
log.error( "失敗理由:{}"、e.getMessage());
}
}
返信結果;
}



/ **
*キャッシュされたキー取得
のアノテーションのサポートSPEL式で定義されている*キー
* @paramキー
* @paramメソッド
* @param argsを
* @return
* /
プライベートparseKey文字列(文字列キー、メソッド、メソッド、[]引数){オブジェクト

//)スプリングサポートライブラリを使用して(インターセプトメソッドパラメータ名のリストを取得
LocalVariableTableParameterNameDiscoverer U =
新しい新しいLocalVariableTableParameterNameDiscovererを();
文字列[] = u.getParameterNames paraNameArr(方法);
//キーがSPELのために使用されます分析
ExpressionParserはSpelExpressionParser新しい新しいパーサ=()である;
// SPELコンテキスト
、StandardEvaluationContext、新しい新しいコンテキスト、StandardEvaluationContext、=();
//メソッドのパラメータのSPELコンテキストに入れる
ための(int型私= 0;私は <paraNameArr.length、私は++){
context.setVariable(paraNameArr [I]、引数[I]);
}
戻りparser.parseExpression(キー)以降.getvalue(コンテキスト、String.class);
}

/ **
*オブジェクトのメソッドが傍受されて取得
*
* MethodSignature.getMethod()オブジェクトは、最上位の親クラス・インタフェースを取得または方法である
*クラスのメソッドの実装に注釈をキャッシュする
オブジェクトの反射法は、現在のオブジェクトを取得するように使用されるべきである*
* /
publicメソッド、getMethod(ProceedingJoinPoint PJPを){
//パラメータの種類取得
オブジェクト[]引数の=のpjp.getArgs();
クラス[] =新しい新しいクラスがargTypes [pjp.getArgs()長さ。];
{ため(;私は<args.length I ++はI = 0 INT)
がargTypes [I] =引数[ I] .getClass();
}
メソッド、メソッド= NULL;
試み{
METHOD = pjp.getTarget()のgetClass()getMethod(pjp.getSignature()のgetName()がargTypes。)..。
キャッチ}(ないNoSuchMethodException E){
log.error(e.getMessage());
}キャッチ(SecurityExceptionがE){
log.error(e.getMessage());
}
メソッドを返す;
}

/ **
*分析キー
*の@author zengfanqi
* @date 2019年5月6日
* @param
* @return文字列
* /
パブリック文字列resolvingKey {(ProceedingJoinPoint、接頭文字列、文字列のキーを呼び出し)

キーが空の場合、キーとして直接//メソッド名を
文字列methodNameの= call.getSignature ().getName();
IF(StringUtils.isEmpty(キー)){
戻りプレフィックスmethodNameの+;
}

//キーが、発現のSpeIであるか否かを判断する
場合には(key.startsWith( "#")){
メソッド、メソッドgetMethod =(コール);
ストリングparsekey = parseKey(キー、メソッド、call.getArgs())。
IF(StringUtils.isEmpty(parsekey)){
parsekey = methodNameの。
}
キー=接頭辞+ parsekey。
}他{
キー=プレフィックス+キー。
}
鍵を返します。
}

/ **
*校验条件
* @author zengfanqi
* @date 2019年5月6日
* @param
* @return
* /
パブリックブールcheckConditions(ProceedingJoinPoint呼び出し、文字列の条件){
ブールフラグ= FALSE。
方法メソッド= getMethod(呼び出し)。
ストリング条件= parseKey(条件、方法、call.getArgs())。
( "真" .equals(条件))であれば{
フラグ=真。
}
フラグを返します。
}
}
--------------------- 

おすすめ

転載: www.cnblogs.com/ly570/p/10992441.html