android aop静态方法,spring aop 不能对静态方法进行增强解决
想要通過aop的方式記錄HttpUtils發出的post請求日志,但是 aop 不能對靜態方法進行增強。只能對實例方法進行增強。。
如果一定要增強靜態方法,我們可以對目標類使用單例模式,然后通過調用實例方法去調用那個靜態方法,而且對應的對象實例必須納入spring容器管理,因此可以使用@Component申明下(注意不能直接new,直接new的對象不會納入ioc管理,這樣就不會被aop識別),然后在set實例方法上使用 @Autowired,將對象注入到 static修飾的 靜態類對象。這樣就可以使用 HttpsClientUtils.getHttpsClientUtils().HttpsPost() 實例方法來調用了,隨后HttpsPost()方法就會被aop所攔截。
目標類:
@Component
public class HttpsClientUtils {
private static HttpsClientUtils httpsClientUtils;
@Autowired
public void setHttpsClientUtils(
HttpsClientUtils httpsClientUtils) {
HttpsClientUtils.httpsClientUtils = httpsClientUtils;
}
public static HttpsClientUtils getHttpsClientUtils() {
return httpsClientUtils;
}
/**
* 在上面添加的一個實例方法,用于aop識別
*/
public String HttpsPost(String url, String param) throws CaHelperException {
Map header = new HashMap<>();
header.put("Content-Type", "application/json");
return HttpsPost(url, param, header);
}
/**
* 需要被aop增強的靜態方法
*/
public static String HttpsPost(String url, String param, Map header)
throws CaHelperException {
return HttpsRequest(url, param, header);
}
}
aop類,實現記錄日志記錄的邏輯
package org.szwj.ca.identityauthsrv.log;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @description: AOP日志實現
* @author: yinkai
* @create: 2020/7/28 9:38
*/
@Aspect
public class BrokerAspectInHttpSend {
/**
* 定義切入點,攔截所有發起的第三方證書商的請求 攔截指定工具類 org.szwj.ca.identityauthsrv.util.common.http.HttpsClientUtils
*/
@Pointcut("execution(public * org.szwj.ca.identityauthsrv.util.common.http.HttpsClientUtils.*(..)))")
public void BrokerAspectInHttpSend() {
}
/**
* @description 環繞通知打印IAS中所有的Controller的信息
*/
@Around("BrokerAspectInHttpSend()")
public Object httpUtilAround(ProceedingJoinPoint jp) throws Throwable {
Logger logger = LoggerFactory.getLogger(jp.getTarget().getClass());
logger.warn(
"############################發起證書商http請求開始############################################");
Object proceed = null;
try {
// 獲取處理請求的類方法
logger.warn("class_method={}",
jp.getSignature().getDeclaringTypeName() + "." + jp.getSignature()
.getName() + "()");
// 獲取請求方法傳入的參數
logger.warn("args={}", ToStringBuilder.reflectionToString(jp.getArgs()));
proceed = jp.proceed();
logger.warn("retrun={}", proceed);
} catch (Throwable throwable) {
logger.error("出現異常 {}", throwable.getMessage());
}
logger.warn(
"############################發起證書商http請求結束############################################");
return proceed;
}
}
總結
以上是生活随笔為你收集整理的android aop静态方法,spring aop 不能对静态方法进行增强解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑横屏图片(电脑横屏图片做成竖屏壁纸)
- 下一篇: 教育对一个国家的意义(浅谈教育的本质与作