@Before advice lets you run some code right before a specific method runs. It helps you add extra steps like checking or logging without changing the main method.
You want to log a message every time a method starts.
You need to check user permissions before running a method.
You want to validate input before the main method runs.
You want to measure how long a method takes by starting a timer before it runs.
Syntax
Spring Boot
@Before("pointcutExpression")
public void adviceMethod() {
// code to run before target method
}
The pointcutExpression defines which methods the advice applies to.
The advice method runs before the matched method but cannot change its arguments or result.
Examples
This runs before any method in the com.example.service package.
Spring Boot
@Before("execution(* com.example.service.*.*(..))")
public void logBefore() {
System.out.println("Method is about to run");
}
This runs only before the createUser method in UserService.
Spring Boot
@Before("execution(public void com.example.service.UserService.createUser(..))")
public void checkBeforeCreate() {
System.out.println("Checking before creating user");
}
Sample Program
This Spring Boot app uses @Before advice to print a log message before the sayHello method runs. When you run the app, it calls sayHello which triggers the advice first.
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 LoggingAspect {
@Before("execution(* com.example.demo.GreetingService.sayHello(..))")
public void beforeSayHello() {
System.out.println("[LOG] sayHello method is about to run");
}
}
package com.example.demo;
import org.springframework.stereotype.Service;
@Service
public class GreetingService {
public void sayHello(String name) {
System.out.println("Hello, " + name + "!");
}
}
package com.example.demo;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@SpringBootApplication
@EnableAspectJAutoProxy
public class DemoApplication implements CommandLineRunner {
private final GreetingService greetingService;
public DemoApplication(GreetingService greetingService) {
this.greetingService = greetingService;
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) {
greetingService.sayHello("Alice");
}
}
OutputSuccess
Important Notes
Make sure to enable AspectJ auto proxy with @EnableAspectJAutoProxy in your Spring Boot app.
@Before advice cannot stop or change the method it runs before; it only adds extra steps.
Summary
@Before advice runs code right before a matched method starts.
It is useful for logging, checking, or preparing before the main method.
You define which methods to target using pointcut expressions.
Practice
(1/5)
1. What is the main purpose of the @Before advice in Spring AOP?
easy
A. To replace the matched method entirely
B. To run code right before the matched method executes
C. To run code after the matched method completes
D. To handle exceptions thrown by the matched method
Solution
Step 1: Understand the role of @Before advice
@Before advice is designed to execute code just before the target method runs.
Step 2: Compare with other advice types
@After runs after method completion, @Around can replace, and @AfterThrowing handles exceptions.
Final Answer:
To run code right before the matched method executes -> Option B
Quick Check:
@Before advice = runs before method [OK]
Hint: Remember: @Before means before method starts [OK]
Common Mistakes:
Confusing @Before with @After or @Around advice
Thinking @Before replaces the method
Assuming @Before handles exceptions
2. Which of the following is the correct syntax to define a @Before advice method in Spring AOP?
easy
A. @Before("execution(* com.example.service.*.*(..))") public void logBefore() {}
B. @Before public void logBefore() { execution(* com.example.service.*.*(..)); }
C. @Before public void logBefore() execution(* com.example.service.*.*(..)) {}
D. @Before("logBefore()") public void execution(* com.example.service.*.*(..)) {}
Solution
Step 1: Identify correct @Before annotation usage
The @Before annotation requires a pointcut expression as a string parameter inside parentheses and quotes.
Step 2: Check method signature and placement
The method should be public void with no parameters or with JoinPoint if needed, and the pointcut is inside @Before("...").
Final Answer:
@Before("execution(* com.example.service.*.*(..))") public void logBefore() {} -> Option A
Quick Check:
@Before("pointcut") public void method() {} [OK]
Hint: Look for @Before with pointcut string in parentheses [OK]
Common Mistakes:
Placing pointcut expression outside quotes
Missing parentheses after @Before
Incorrect method signature or missing public
3. Given the following code snippet, what will be printed when service.process() is called?
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.Service.process(..))")
public void beforeProcess() {
System.out.println("Before process");
}
}
@Service
public class Service {
public void process() {
System.out.println("Processing");
}
}
@Before advice runs before the matched method, so "Before process" prints first.
Step 2: Analyze method call output
Then the actual method prints "Processing" after the advice.
Final Answer:
Before process\nProcessing -> Option A
Quick Check:
@Before prints first, then method output [OK]
Hint: @Before prints before method output [OK]
Common Mistakes:
Assuming method prints before advice
Thinking advice replaces method output
Ignoring advice execution order
4. Identify the error in this @Before advice definition:
@Before("execution(* com.example..*(..))")
public void beforeMethod() {
System.out.println("Before method");
}
medium
A. Advice method cannot have a body
B. Pointcut expression syntax is invalid
C. Method must return a value
D. Missing @Aspect annotation on the class
Solution
Step 1: Check class-level annotations
For @Before advice to work, the class must be annotated with @Aspect to mark it as an aspect.
Step 2: Validate pointcut and method
The pointcut expression is valid, and advice methods can have bodies and return void.
Final Answer:
Missing @Aspect annotation on the class -> Option D
Quick Check:
@Aspect missing = advice won't run [OK]
Hint: Always add @Aspect on the class with advice [OK]
Common Mistakes:
Forgetting @Aspect on the aspect class
Assuming advice methods must return values
Misreading pointcut syntax errors
5. You want to log a message before any method in com.example.repository package is called, but only for methods starting with save. Which @Before pointcut expression correctly matches this?
hard
A. @Before("execution(* com.example.repository.save*(..))")
B. @Before("execution(* com.example.repository.*save*(..))")
C. @Before("execution(* com.example.repository..save*(..))")
D. @Before("execution(* com.example.repository.*.save*(..))")
Solution
Step 1: Understand pointcut syntax for package, class, and method
To match methods starting with 'save' in any class of the com.example.repository package, use execution(* com.example.repository.*.save*(..)). However, if you want to include subpackages as well, use '..' instead of a single '*'.
Step 2: Analyze each option
A matches only methods named save* in the package directly (no class wildcard), B is invalid syntax, C matches methods in any class in the package but not subpackages, D matches methods starting with save in the package and all subpackages.
Final Answer:
@Before("execution(* com.example.repository..save*(..))") -> Option C
Quick Check:
package..save*(..) = matches package and subpackages [OK]
Hint: Use package..save* to include subpackages and methods starting with save [OK]
Common Mistakes:
Using incorrect wildcards or dots in method name
Matching subpackages unintentionally
Misplacing wildcards in pointcut expression
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.