Bird
Raised Fist0
Spring Bootframework~5 mins

@Aspect annotation in Spring Boot

Choose your learning style10 modes available
Introduction

The @Aspect annotation marks a class as an aspect, which helps add extra behavior to your code without changing its core logic.

You want to log method calls across many classes without repeating code.
You need to check security permissions before running certain methods.
You want to measure how long methods take to run for performance checks.
You want to handle errors in a consistent way across multiple methods.
Syntax
Spring Boot
@Aspect
public class MyAspect {
    // advice methods here
}
Use @Aspect on a class to tell Spring it contains advice (extra code to run).
This class usually works with @Before, @After, or @Around annotations to define when the extra code runs.
Examples
This aspect logs a message before any method in com.example.service package runs.
Spring Boot
@Aspect
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore() {
        System.out.println("Method is about to run");
    }
}
This aspect measures and prints how long any method in com.example package takes to run.
Spring Boot
@Aspect
public class TimingAspect {
    @Around("execution(* com.example..*(..))")
    public Object measureTime(org.aspectj.lang.ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        System.out.println("Execution took " + (end - start) + " ms");
        return result;
    }
}
Sample Program

This example shows a simple aspect that prints a message before the sayHello method runs in MyService. When you run the app and call sayHello, you see the aspect's message first, then the service's message.

Spring Boot
package com.example.demo;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SimpleLoggingAspect {

    @Before("execution(* com.example.demo.MyService.sayHello(..))")
    public void beforeSayHello() {
        System.out.println("About to call sayHello method");
    }
}

// Service class
package com.example.demo;

import org.springframework.stereotype.Service;

@Service
public class MyService {
    public void sayHello() {
        System.out.println("Hello from MyService!");
    }
}

// Main application
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        MyService service = context.getBean(MyService.class);
        service.sayHello();
    }
}
OutputSuccess
Important Notes

Remember to add @Component to your aspect class so Spring can find it.

Use pointcut expressions like execution(* package.Class.method(..)) to select where advice runs.

Aspects help keep your code clean by separating extra tasks like logging or security.

Summary

@Aspect marks a class as an aspect to add extra behavior.

Use it with advice annotations like @Before to run code at specific times.

It helps keep your main code simple and clean by handling cross-cutting concerns separately.

Practice

(1/5)
1. What is the primary purpose of the @Aspect annotation in Spring Boot?
easy
A. To schedule tasks to run at fixed intervals
B. To define a REST controller for handling HTTP requests
C. To configure database connections automatically
D. To mark a class as an aspect that can add extra behavior to other parts of the program

Solution

  1. Step 1: Understand the role of @Aspect

    The @Aspect annotation marks a class as an aspect, which means it can add extra behavior to other parts of the program without changing their code.
  2. Step 2: Differentiate from other annotations

    Other options like REST controllers, database configuration, or scheduling are unrelated to @Aspect.
  3. Final Answer:

    To mark a class as an aspect that can add extra behavior to other parts of the program -> Option D
  4. Quick Check:

    @Aspect = marks aspect class [OK]
Hint: Remember: @Aspect marks classes for extra behavior [OK]
Common Mistakes:
  • Confusing @Aspect with @Controller
  • Thinking @Aspect manages database or scheduling
  • Assuming @Aspect runs HTTP endpoints
2. Which of the following is the correct way to declare an aspect class in Spring Boot?
easy
A. @Aspect public class MyAspect {}
B. public class MyAspect @Aspect {}
C. @Aspect() void MyAspect() {}
D. class MyAspect @Aspect public {}

Solution

  1. Step 1: Check correct annotation placement

    The @Aspect annotation must be placed before the class declaration, like @Aspect public class MyAspect {}.
  2. Step 2: Identify invalid syntax

    Options A, B, and D place @Aspect incorrectly or misuse syntax, causing errors.
  3. Final Answer:

    @Aspect public class MyAspect {} -> Option A
  4. Quick Check:

    @Aspect before class name = correct syntax [OK]
Hint: Put @Aspect right before the class keyword [OK]
Common Mistakes:
  • Placing @Aspect after class name
  • Using @Aspect on methods instead of classes
  • Incorrect parentheses or missing class keyword
3. Given this aspect code snippet, what will be printed when someMethod() is called?
@Aspect
public class LoggingAspect {
  @Before("execution(* someMethod())")
  public void logBefore() {
    System.out.println("Before method");
  }
}
medium
A. After method
B. No output
C. Before method
D. Compilation error

Solution

  1. Step 1: Understand @Before advice

    The @Before annotation runs the logBefore() method before someMethod() executes, printing "Before method".
  2. Step 2: Confirm no errors or other outputs

    There is no @After advice or errors, so only "Before method" prints.
  3. Final Answer:

    Before method -> Option C
  4. Quick Check:

    @Before runs before target method [OK]
Hint: @Before prints before method runs [OK]
Common Mistakes:
  • Confusing @Before with @After
  • Expecting no output if unaware of advice
  • Assuming syntax errors without checking code
4. Identify the error in this aspect code:
@Aspect
public class MyAspect {
  @Before("execution(* someMethod())")
  public void logBefore() {
    System.out.println("Before method");
  }

  public void someMethod() {
    System.out.println("Inside someMethod");
  }
}
medium
A. The pointcut expression is incorrect
B. The aspect class must be annotated with @Component or registered as a bean
C. The advice method logBefore() must return a value
D. The someMethod() cannot be inside the aspect class

Solution

  1. Step 1: Check aspect registration

    In Spring Boot, an aspect class must be a Spring bean to work. It needs @Component or manual bean registration.
  2. Step 2: Validate other code parts

    The pointcut expression and advice method are correct. Having someMethod() inside the aspect is allowed but unusual.
  3. Final Answer:

    The aspect class must be annotated with @Component or registered as a bean -> Option B
  4. Quick Check:

    Aspect needs bean registration [OK]
Hint: Aspect classes must be Spring beans to work [OK]
Common Mistakes:
  • Ignoring @Component or bean registration
  • Thinking advice methods must return values
  • Assuming pointcut syntax is wrong without checking
5. You want to log execution time of all methods in a service class using @Aspect. Which approach correctly applies this?
hard
A. Use @Around advice with a pointcut matching all methods in the service class and measure time before and after proceeding
B. Use @Before advice to start timer and @After advice to stop timer separately
C. Add logging code directly inside each service method instead of using @Aspect
D. Use @AfterThrowing advice to log execution time only when exceptions occur

Solution

  1. Step 1: Understand timing with @Around advice

    @Around advice can run code before and after the target method, allowing precise measurement of execution time.
  2. Step 2: Evaluate other options

    @Before and @After separately cannot measure total time easily; direct logging mixes concerns; @AfterThrowing only runs on exceptions, missing normal cases.
  3. Final Answer:

    Use @Around advice with a pointcut matching all methods in the service class and measure time before and after proceeding -> Option A
  4. Quick Check:

    @Around advice best for timing [OK]
Hint: Use @Around to wrap method and measure time [OK]
Common Mistakes:
  • Using separate @Before and @After for timing
  • Mixing logging code inside business methods
  • Logging only on exceptions with @AfterThrowing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard