Step 1: Define Loggable annotation
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
}
Step 2: Annotate controller method @Loggable
annotation.
@RestController
@RequestMapping("api/v1/")
public class EmployeeController {
@Loggable
@RequestMapping(value = "employees", method = RequestMethod.GET)
public ResponseEntity<List<Employee>> all() {
return ResponseEntity.ok(emps);
}
}
Step 3: Create an Advice that should be called on all methods that annotated with @Around annotation.
@Configuration
@Aspect
public class LoggingAspect {
@Around("@annotation(com.sample.app.annotations.Loggable)")
public Object executionTime(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Execution started");
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
System.out.println("Total time taken is : " + (endTime-startTime) + " milliseconds");
System.out.println("Execution Finished");
return result;
}
}
As you see LoggingAspect
class is annotated with @Aspect annotation.
Find the
below working application.
package com.sample.app.model;
public class Employee {
private int id;
private String firstName;
private String lastName;
public Employee(int id, String firstName, String lastName) {
super();
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Loggable.java
package com.sample.app.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
}
LoggingAspect.java
package com.sample.app.aspects;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.Configuration;
@Configuration
@Aspect
public class LoggingAspect {
@Around("@annotation(com.sample.app.annotations.Loggable)")
public Object executionTime(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Execution started");
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
System.out.println("Total time taken is : " + (endTime-startTime) + " milliseconds");
System.out.println("Execution Finished");
return result;
}
}
EmployeeController.java
package com.sample.app.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.sample.app.annotations.Loggable;
import com.sample.app.model.Employee;
@RestController
@RequestMapping("api/v1/")
public class EmployeeController {
private static List<Employee> emps = new ArrayList<>();
static {
Employee emp1 = new Employee(1, "ram", "Gurram");
Employee emp2 = new Employee(2, "Sunil", "Dayananda");
Employee emp3 = new Employee(3, "krishna", "Majety");
emps.add(emp1);
emps.add(emp2);
emps.add(emp3);
}
@Loggable
@RequestMapping(value = "employees", method = RequestMethod.GET)
public ResponseEntity<List<Employee>> all() {
return ResponseEntity.ok(emps);
}
}
HomeController.java
package com.sample.app.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@RequestMapping("/")
public String homePage() {
return "Welcome to Spring boot Application Development";
}
}
App.java
package com.sample.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
application.properties
logging.level.root=WARN
Total project
structure looks like below.
Run App.java.
Open the url
'http://localhost:8080/api/v1/employees' in browser, you can see below messages
in console.
Execution
started
Total time
taken is : 16 milliseconds
Execution
Finished
You can
download complete working application from this link.
No comments:
Post a Comment