🚀 Elevate Your Java Skills!
Join thousands of developers on Ram N Java. Subscribe for the best Spring & Java tutorials!
CLICK TO SUBSCRIBESpring AOP Around Advice Simplified
Welcome! If you are learning the Spring Framework, you have likely come across AOP (Aspect-Oriented Programming). Today, we are breaking down the most powerful type of advice: Around Advice.
1. What Exactly is Around Advice?
In simple terms, "Around" advice surrounds a method call. It is like a bodyguard for your function. It can perform actions before the method starts and after it finishes. This makes it perfect for things like measuring how long a method takes to run (performance monitoring) or managing database transactions.
2. How Does It Work in Java?
To use Around Advice, we implement the MethodInterceptor interface from the AOP alliance. The core logic happens inside the invoke() method. Within this method, you have a MethodInvocation object which allows you to proceed with the actual method execution whenever you are ready.
3. Why Use "Around" Instead of Others?
While Before and After advice are great, they are limited. Around Advice gives you full control. You can decide to not execute the method at all, or you can catch exceptions and return a custom value instead. It is the "Swiss Army Knife" of Spring AOP!
4. Real-World Example
Think about logging. Instead of writing System.out.println at the start and end of 100 different methods, you write it once in your Around Advice class. Spring will then automatically apply it to all the methods you specify. Clean, efficient, and professional!
Click here to watch on Youtube:
https://www.youtube.com/watch?v=Dch_arO7q8Y&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| Spring AOP AroundAdvice Example | Spring Tutorial |
| Spring AOP AroundAdvice Example | Spring Tutorial |
| Spring AOP AroundAdvice Example | Spring Tutorial |
| Spring AOP AroundAdvice Example | Spring Tutorial |
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ram.core</groupId>
<artifactId>SpringDemo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringDemo</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>5.0.5.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring 5 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</project>
EmployeeService.java
public class EmployeeService
{
public String getEmployeeName(int age)
{
System.out.println("Get Employee Information");
if(age == 28)
{
return "Peter";
}
return "Dave";
}
}
AroundAdvice.java
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class AroundAdvice implements MethodInterceptor
{
public Object invoke(MethodInvocation mi) throws Throwable
{
Object obj;
System.out.println("AroundAdvice applied before actual method");
obj = mi.proceed();
System.out.println("obj = "+ obj);
System.out.println("AroundAdvice applied after actual method");
return obj;
}
}
applicationContext.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id="employeeService" class="com.ram.service.EmployeeService"></bean>
<bean id="aroundAdvice" class="com.ram.Advice.AroundAdvice"></bean>
<bean id="employeeServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="employeeService"></property>
<property name="interceptorNames">
<list>
<value>aroundAdvice</value>
</list>
</property>
</bean>
</beans>
App.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ram.service.EmployeeService;
public class App
{
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
System.out.println("---------------------------------------");
EmployeeService employeeService = context.getBean("employeeServiceProxy",
EmployeeService.class);
employeeService.getEmployeeName(28);
}
}
Output
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6ebc05a6: startup date [Sun Oct 14 10:06:18 IST 2018]; root of context hierarchy
Oct 14, 2018 10:06:18 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
AroundAdvice applied before actual method
Get Employee Information
obj = Peter
AroundAdvice applied after actual method
Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_around_advise.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_around_advise
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/e16b8c6ef73a72464fa5812e24080179c4adc913/Spring_2018/SpringDemo_around_advise/?at=master
See also:
No comments:
Post a Comment