📖 Scenario: You are building a Spring Boot application that needs to log method calls in a service class. You want to use Aspect-Oriented Programming (AOP) to intercept method executions using pointcut expressions.
🎯 Goal: Create a Spring Boot aspect that uses pointcut expressions to match all methods in the CalculatorService class and logs a message before each method runs.
📋 What You'll Learn
Create a CalculatorService class with two methods: add and subtract.
Create an aspect class called LoggingAspect.
Define a pointcut expression that matches all methods in CalculatorService.
Add a @Before advice that logs a message before any matched method executes.
💡 Why This Matters
🌍 Real World
Logging method calls is common in real applications to track behavior and debug issues without changing business logic.
💼 Career
Understanding pointcut expressions and AOP is important for backend developers working with Spring Boot to implement cross-cutting concerns like logging, security, and transactions.
Progress0 / 4 steps
1
Create CalculatorService with methods
Create a class called CalculatorService with two public methods: add that takes two integers and returns their sum, and subtract that takes two integers and returns their difference.
Spring Boot
Hint
Define a public class named CalculatorService. Add two public methods named add and subtract with two integer parameters each. Return the sum and difference respectively.
2
Create LoggingAspect class with @Aspect annotation
Create a class called LoggingAspect and annotate it with @Aspect and @Component to make it a Spring-managed aspect.
Spring Boot
Hint
Import @Aspect and @Component. Annotate the class LoggingAspect with both annotations.
3
Define pointcut expression for CalculatorService methods
Inside LoggingAspect, define a pointcut method called allCalculatorMethods annotated with @Pointcut. Use the expression execution(* CalculatorService.*(..)) to match all methods in CalculatorService.
Spring Boot
Hint
Use @Pointcut annotation with the expression execution(* CalculatorService.*(..)). Define an empty method named allCalculatorMethods to hold this pointcut.
4
Add @Before advice to log before method execution
Add a @Before advice method called logBeforeMethod in LoggingAspect that uses the pointcut allCalculatorMethods(). Inside the method, add a simple log statement using System.out.println that prints "Method is about to execute".
Spring Boot
Hint
Use @Before annotation with the pointcut method allCalculatorMethods(). Define a method logBeforeMethod that prints the log message.
Practice
(1/5)
1. What does a pointcut expression in Spring Boot primarily do?
easy
A. Create new methods dynamically at runtime
B. Define the database connection settings
C. Select methods where extra code (advice) should run
D. Replace existing methods with new implementations
Solution
Step 1: Understand the purpose of pointcut expressions
Pointcut expressions specify where additional code, called advice, should be applied in existing methods without changing those methods.
Step 2: Differentiate from other concepts
They do not create or replace methods, nor configure databases. Their role is to select join points (methods) for advice.
Final Answer:
Select methods where extra code (advice) should run -> Option C
Quick Check:
Pointcut expression = Select methods for advice [OK]
Hint: Pointcuts pick methods to add code without changing them [OK]
Common Mistakes:
Confusing pointcuts with method creation
Thinking pointcuts configure databases
Believing pointcuts replace method code
2. Which of the following is the correct syntax to match all methods in package com.example.service using a pointcut expression?
easy
A. execution(* com.example.service..*(..))
B. execution(com.example.service.*.*(..))
C. execution(* com.example.service.*(..))
D. execution(* com.example.service.*.*(..))
Solution
Step 1: Understand the execution syntax
The syntax execution(* com.example.service.*.*(..)) matches any return type, any class in the package com.example.service, and any method with any parameters.
Step 2: Analyze other options
execution(com.example.service.*.*(..)) misses the wildcard for return type. execution(* com.example.service..*(..)) uses double dot .. which matches subpackages, not just the package. execution(* com.example.service.*(..)) misses the class wildcard.
Final Answer:
execution(* com.example.service.*.*(..)) -> Option D
Quick Check:
Use * for any class and method in package [OK]
Hint: Use * for any class and method in a package [OK]
Common Mistakes:
Omitting the return type wildcard *
Using .. instead of * for classes
Missing method wildcard *
3. Given the pointcut expression execution(public * com.example.repo.*Repository.find*(..)), which methods will it match?
medium
A. All methods named 'find' in any class in com.example.repo
B. All public methods starting with 'find' in any class ending with 'Repository' in package com.example.repo
C. All public methods in any class in com.example.repo
D. Only methods named exactly 'find' in any class ending with 'Repository'
Solution
Step 1: Break down the expression
public * means any public return type, com.example.repo.*Repository matches classes ending with 'Repository' in the package, and find*(..) matches methods starting with 'find' with any parameters.
Step 2: Match options to expression meaning
All public methods starting with 'find' in any class ending with 'Repository' in package com.example.repo correctly describes all public methods starting with 'find' in classes ending with 'Repository' in the package. Others are either too broad or too narrow.
Final Answer:
All public methods starting with 'find' in any class ending with 'Repository' in package com.example.repo -> Option B
Quick Check:
execution(public * com.example.repo.*Repository.find*(..)) = All public methods starting with 'find' in any class ending with 'Repository' in package com.example.repo [OK]
Hint: Look for wildcards * and method name patterns carefully [OK]
Common Mistakes:
Ignoring method name prefix 'find*'
Confusing class name pattern *Repository
Missing public modifier effect
4. Identify the error in this pointcut expression: execution(* com.example..service.*(..)
medium
A. Missing closing parenthesis at the end
B. Incorrect use of double dots '..' in package name
C. Wildcard '*' cannot be used for method names
D. Return type '*' is invalid
Solution
Step 1: Check syntax completeness
The expression is missing a closing parenthesis ')' at the end, which is required to close the execution() expression.
Step 2: Validate other parts
Double dots '..' are valid to match subpackages, '*' is valid for method names, and '*' is valid for return type.
Final Answer:
Missing closing parenthesis at the end -> Option A
Quick Check:
Check parentheses balance in execution() [OK]
Hint: Count parentheses carefully in pointcut expressions [OK]
Common Mistakes:
Forgetting closing parenthesis
Misunderstanding '..' usage
Thinking '*' is invalid for methods or return types
5. You want to create a pointcut expression that matches all methods in any class within com.app.service and its subpackages, but only methods that have exactly two parameters of any type. Which expression is correct?
hard
A. execution(* com.app.service..*.*(*, *))
B. execution(* com.app.service.*.*(..))
C. execution(* com.app.service..*.*(.., ..))
D. execution(* com.app.service..*.*(*))
Solution
Step 1: Understand package and subpackage matching
com.app.service..* matches classes in the package and all subpackages.
Step 2: Match method parameters exactly
(* , *) means exactly two parameters of any type. (..) means any number of parameters, so it's incorrect here.
Step 3: Analyze options
execution(* com.app.service..*.*(*, *)) correctly matches all classes in package and subpackages with exactly two parameters. Others either match any number of parameters or wrong parameter counts.
Final Answer:
execution(* com.app.service..*.*(*, *)) -> Option A
Quick Check:
Use (*, *) for exactly two parameters [OK]
Hint: Use (*, *) to match exactly two parameters [OK]
Common Mistakes:
Using (..) to match exact parameter count
Confusing single * with .. for subpackages
Missing commas between parameters
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.