中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用spring AOP記錄用戶操作日志的方法示例

發布時間:2020-10-08 12:28:03 來源:腳本之家 閱讀:180 作者:ngulc 欄目:編程語言

前言

最近項目已經開發完成,但發現需要加用戶操作日志,如果返回去加也不太現實,所以使用springAOP來完成比較合適。下面來一起看看詳細的介紹:

注解工具類:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogAnnotation {
 String operateModelNm() default "";
 String operateFuncNm() default "";
 String operateDescribe() default "";
}

切面類:

@Aspect
public class MyInterceptor {
 @Pointcut("execution(** com.luchao.spring.test3.service.impl.*.*(..))")
 private void anyMethod(){}//定義一個切入點

 @Before("anyMethod() && args(name)")
 public void doAccessCheck(String name){
 System.out.println(name);
 System.out.println("前置通知");
 }

 @AfterReturning("anyMethod()")
 public void doAfter(){
 System.out.println("后置通知");
 }

 @After("anyMethod()")
 public void after(JoinPoint point){

 System.out.println("最終通知");
 }

 @AfterThrowing("anyMethod()")
 public void doAfterThrow(){
 System.out.println("例外通知");
 }

 @Around("anyMethod()")
 public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
 Signature signature = pjp.getSignature();
 MethodSignature methodSignature = (MethodSignature)signature;
 Method targetMethod = methodSignature.getMethod();
// System.out.println("classname:" + targetMethod.getDeclaringClass().getName());
// System.out.println("superclass:" + targetMethod.getDeclaringClass().getSuperclass().getName());
// System.out.println("isinterface:" + targetMethod.getDeclaringClass().isInterface());
// System.out.println("target:" + pjp.getTarget().getClass().getName());
// System.out.println("proxy:" + pjp.getThis().getClass().getName());
// System.out.println("method:" + targetMethod.getName());

 Class[] parameterTypes = new Class[pjp.getArgs().length];
 Object[] args = pjp.getArgs();
 for(int i=0; i<args.length; i++) {
  if(args[i] != null) {
  parameterTypes[i] = args[i].getClass();
  }else {
  parameterTypes[i] = null;
  }
 }
 //獲取代理方法對象
 String methodName = pjp.getSignature().getName();
 Method method = pjp.getSignature().getDeclaringType().getMethod(methodName, parameterTypes);

 if(method.isAnnotationPresent(LogAnnotation.class)){
  System.out.println("存在1");
 }
 //獲取實際方法對象,可以獲取方法注解等
 Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(signature.getName(), targetMethod.getParameterTypes());

 if(realMethod.isAnnotationPresent(LogAnnotation.class)){
  realMethod.getAnnotation(LogAnnotation.class).operateDescribe();
  System.out.println("存在2");
 }

 System.out.println("進入環繞通知");
 Object object = pjp.proceed();//執行該方法
 System.out.println("退出方法");
 return object;
 }
}

配置類:

@Configurable
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "com.luchao.spring.test3")
public class test3Config {

 @Bean
 public MyInterceptor myInterceptor(){
 return new MyInterceptor();
 }

 @Bean
 public EncoreableIntroducer encoreableIntroducer(){
 return new EncoreableIntroducer();
 }
}

服務類:

@Component
public class PersonServiceBean implements PersonServer {

 /**
 * 保存方法
 * @param name
 */
 @LogAnnotation(operateModelNm = "測試方法", operateFuncNm = "保存方法")
 public void save(String name) {
 System.out.println("我是save方法");

 }

 /**
 * 更新方法
 * @param name
 * @param id
 */
 public void update(String name, Integer id) {
 System.out.println("我是update()方法");
 }

 /**
 * 獲取方法
 * @param id
 * @return
 */
 public String getPersonName(Integer id) {
 System.out.println("我是getPersonName()方法");
 return "xxx";
 }
}

測試方法:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = test3Config.class)
public class SpringAOPTest {

 @Autowired
 private PersonServer personServer;

 @Test
 public void inteceptorTest(){
 Encoreable encoreable = (Encoreable)personServer;
 encoreable.performEncore();
 personServer.save("test");
 }
}

在springAOP切面中使用的是代理,所以直接獲取的是代理對象,不能獲取真實對象的一些信息,如注解等。

      //獲取代理方法對象
  String methodName = pjp.getSignature().getName();
  Method method = pjp.getSignature().getDeclaringType().getMethod(methodName, parameterTypes);

如果要獲取真實對象,獲取注解的信息,可以方便我們進行判斷記錄。

       //獲取實際方法對象,可以獲取方法注解等
  Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(signature.getName(), targetMethod.getParameterTypes());

這樣就完成了一個簡單的操作日志記錄demo。另外,如果不是講某個方法設置切點,可以ant風格的切點切入方式,設置多個或所有方法。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新建县| 石渠县| 会东县| 车险| 随州市| 洪湖市| 封丘县| 佳木斯市| 长泰县| 嘉峪关市| 宜宾县| 潞城市| 会泽县| 库车县| 泊头市| 漳浦县| 济南市| 清镇市| 丁青县| 宁陕县| 习水县| 华蓥市| 秭归县| 濮阳县| 余江县| 依安县| 丰台区| 黑山县| 韩城市| 永胜县| 济源市| 高碑店市| 大关县| 安丘市| 姜堰市| 宁都县| 山丹县| 安徽省| 临清市| 新和县| 大庆市|