In this article, we will implement Aspect-Oriented Programming with Spring boot. To know complete detail on Spring Boot AOP check this article Introduction to Spring Boot AOP
Spring AOP @Before and @After Advice type Example in Spring Boot
In this example, we will learn @Before and @After annotation of the Spring AOP module.
Tools and Technologies used:
- Spring Boot
- Spring Tool Suite 4
- JDK8
- POSTMAN
Implement Spring AOP Advice in Spring Boot
Let’s create a simple spring boot application to implement Spring AOP advice. below are the steps to create simple Spring boot application.
Step 1: Open IDE STS- Spring Tool Suite
Step 2: Go to File > Spring Starter Project.
Step 3: Now, fill all the fields as shown below and click Next.
Step 4: Now, Add the dependencies of spring web.
Now, wait for some time and your project structure will be ready. Go to the pom.xml file and add the following Spring AOP dependency.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
Configure application. properties file
change the port number server.port=8888
Create an Entity Class
In this class, we took 3 fields namely id, accHolerName, and balance. Generate Getters and setters and also generate default and parameterized constructors.
Account.java
package com.abc.example.model; public class Account { private long id; private String accHolderName; private long balance; public Account() { super(); // TODO Auto-generated constructor stub } public Account(long id, String accHolderName, long balance) { super(); this.id = id; this.accHolderName = accHolderName; this.balance = balance; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getAccHolderName() { return accHolderName; } public void setAccHolderName(String accHolderName) { this.accHolderName = accHolderName; } public long getBalance() { return balance; } public void setBalance(long balance) { this.balance = balance; } }
Create a Service Layer
This layer is responsible for business logic. This class has two methods depositMoney() & withdrawMoney()
AccountService
package com.abc.example.service; import org.springframework.stereotype.Service; import com.abc.example.model.Account; @Service public class AccountService { public Account depositMoney(long id, String accHolderName, long balance) { // TODO Auto-generated method stub Account account = new Account(); System.out.println("hello service"); account.setId(id); account.setAccHolderName(accHolderName); account.setBalance(5000); return account; } public Account withdrawMoney(long balance) { // TODO Auto-generated method stub //Withdraw... return null; } }
Create a Controller class
The request will be handle by the handler methods in the controller class using @GetMapping. In this class, we define two mapping- one for deposit and another for withdrawal.
package com.abc.example.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.abc.example.model.Account; import com.abc.example.service.AccountService; @RestController public class AccountController { @Autowired private AccountService accountService; @RequestMapping(value = "/add/money",method = RequestMethod.GET, produces = "application/json") public @ResponseBody Account deposit(@RequestParam("id") long id,@RequestParam("accHolderName") String accHolderName,@RequestParam("balance") long balance) { System.out.println("in"); return accountService.depositMoney(id,accHolderName,balance); } @RequestMapping(value = "/withdraw/money",method = RequestMethod.GET, produces = "application/json") public @ResponseBody String withdraw(@RequestParam("balance") long balance) { accountService.withdrawMoney(balance); return "Balance Withdrawn.."; } }
- Mark this class as @RestController(It is used to simplify the creation of REST APIs).
- The @GETMapping is used to map HTTP GET requests on specific handler methods.
- The @RequestBody is used to convert JSON to Java objects.
- The @ResponseEntity represents an HTTP response.
- Here, @RequestParam is used to extract query parameter
Next, the important part is the Aspect class to define advice and implement AOP.
Create Aspect Class
AccountServiceAspect
package com.abc.example.aspectpkg; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Aspect @Component public class AccountServiceAspect { //Write a Pointcut @Pointcut("execution(public * com.abc.example.service.AccountService.depositMoney(..))") public void h1() { } @Before("h1()") //<-- Links advice + Pointcuts = Advice public void beginTransaction() { System.out.println("BEGIN TRANSACTION..."); } @After("h1()") //<-- Links advice + Pointcuts = Advice public void commitTransaction() { System.out.println("END TRANSACTION..."); } }
- @Aspect is used to mark the class as Aspect class.
- @Pointcut annotation is used to define the expression that will select the business method.
- @Before annotation specifies that the advice should be executed before the joinpoint.
- @After annotation specifies that the advice should be executed after the joinpoint.
Now, Go to the Application class and annotate it with @EnableAspectJAutoProxy. It enables support for handling components marked with AspectJ’s @AspectJ annotation.
package com.abc.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.EnableAspectJAutoProxy; @SpringBootApplication @EnableAspectJAutoProxy public class SpringBootAopPractice2Application { public static void main(String[] args) { SpringApplication.run(SpringBootAopPractice2Application.class, args); } }
Run the Application class and test it using POSTMAN.
See the console window of your STS and you will see the following advice:
In this way, we have implemented AOP in spring boot.