java自定義註解以及結合AOP的使用 在SpringBoot中用SpringAOP實現日誌記錄功能 Spring boot中使用aop詳解

參考過的博客:

1.https://www.cnblogs.com/wangshen31/p/9379197.html   在SpringBoot中用SpringAOP實現日誌記錄功能

2.https://www.cnblogs.com/bigben0123/p/7779357.html   Spring boot中使用aop詳解

 

需求:    

1.項目中有這樣的需求,執行方法的入參request繼承了CommonRequest,在CommonRequest中有個CommonRequestHead屬性,在這個請求頭中有很多的一些公共參數,比如cifSeq、cifName、useName等等公共字段,已經存儲好了。

2.現在我們在執行方法的request中要獲取到CommonRequestHead中的一些公共值,並且在方法執行的時候,將這些參數上送;

3.如果在每個方法裏面都去寫request.setCifSeq(request.getCommonRequestHead.getCifSeq());  這樣的一段話,每個方法都要去加,工作量大,而且代碼冗餘,不美觀,low。

4.考慮使用註解,結合spring的AOP。

5.現在只需要在執行方法上加上一個註解,指定要設置的屬性,程序自動幫我去CommonRequestHead中找到cifSeq的值,並且設置在request中。

 

代碼:

1.相關的model:    

SubmitRequest:

package com.cy.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class SubmitRequest extends CommonRequest {

    private String userName;

    private String passWord;

    private String cifSeq;
}

 CommonRequest:

package com.cy.model;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class CommonRequest {

    private CommonRequestHead commonRequestHead;

    public CommonRequest() {
        this.commonRequestHead = new CommonRequestHead();
    }
} 

 CommonRequestHead:

package com.cy.model;

import lombok.Getter;
import lombok.Setter;

/**
 * 假設CommonRequestHead中已經設置好了一些值了,如下
 */
@Getter
@Setter
public class CommonRequestHead {

    private String cifSeq = "999999";

    private String userName = "張三";

    private String passWord = "123456";
}

2.定義註解:      

AddRequestParam:

package com.cy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 給應用註解的方法中的入參,設置你想要的參數名
 * paramName: CommonRequestHead中你想要取的屬性名稱
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AddRequestParam {

    String paramName() default "userName";
}

3.切面類:      

ParamNameAspect:

package com.cy.annotation;

import com.cy.model.CommonRequestHead;
import com.cy.model.SubmitRequest;
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.springframework.stereotype.Component;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

@Component
@Aspect
public class ParamNameAspect {

    @Pointcut(value = "@annotation(com.cy.annotation.AddRequestParam)")
    public void pointCut() {

    }

    @Around("pointCut() && @annotation(addRequestParam)")
    public Object aroundMethod(ProceedingJoinPoint pjp, AddRequestParam addRequestParam) throws Throwable {
        //獲取註解裏面的值
        String paramName = addRequestParam.paramName();

        //獲取註解方法的參數
        Object args = pjp.getArgs()[0];
        if(args instanceof SubmitRequest){
            SubmitRequest submitRequest = (SubmitRequest) args;
            CommonRequestHead commonRequestHead = submitRequest.getCommonRequestHead();
            PropertyDescriptor pd = new PropertyDescriptor(paramName, CommonRequestHead.class);
            Method getParamValueMethod = pd.getReadMethod();    //獲得getCifSeq方法
            String paramValue = (String) getParamValueMethod.invoke(commonRequestHead); //獲取到commonRequestHead中對應的getCifSeq()的值

            //找到SubmitRequest對應的setCifSeq方法,並且設置值
            Field[] fields = SubmitRequest.class.getDeclaredFields();
            for(Field field : fields){
                if(paramName.equals(field.getName())){
                    PropertyDescriptor spd = new PropertyDescriptor(paramName, SubmitRequest.class);
                    Method setParamValueMethod = spd.getWriteMethod();          //獲得setCifSeq方法
                    setParamValueMethod.invoke(submitRequest, paramValue);      //給submitRequest設置setCifSeq值
                }
            }
        }
        return pjp.proceed();
    }
}

4.使用Controller進行測試:

package com.cy.controller;

import com.cy.annotation.AddRequestParam;
import com.cy.model.SubmitRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class IndexController {

    @ResponseBody
    @RequestMapping("/testAddRequestParam")
    @AddRequestParam
    public String submit(SubmitRequest request, String str){
        return request.toString();
    }

    @ResponseBody
    @RequestMapping("/testAddRequestParam2")
    @AddRequestParam(paramName = "passWord")
    public String submit2(SubmitRequest request, String str){
        return request.toString();
    }
}

5.瀏覽器訪問測試:

輸入:http://localhost:8080/helloSpring/testAddRequestParam    顯示:SubmitRequest(userName=張三, passWord=null, cifSeq=null)

輸入: http://localhost:8080/helloSpring/testAddRequestParam2  顯示:SubmitRequest(userName=null, passWord=123456, cifSeq=null)

 

6.相關的pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>helloSpringBoot</groupId>
  <artifactId>helloSpringBoot</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>helloSpringBoot</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <lombok.version>1.18.20</lombok.version>
  </properties>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.5</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>


  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>

  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

  

   

  

  

  

 

 

 

 

 

 

 

 

 

 

---

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章