Monday, 12 November 2018

Spring AOP AroundAdvice Example | Spring Tutorial

🚀 Elevate Your Java Skills!

Join thousands of developers on Ram N Java. Subscribe for the best Spring & Java tutorials!

CLICK TO SUBSCRIBE

Spring 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
pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    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

package com.ram.service;

public class EmployeeService
{
    public String getEmployeeName(int age)
    {
        System.out.println("Get Employee Information");
        if(age == 28)
        {
            return "Peter";
        }
        return "Dave";
    }
}

AroundAdvice.java

package com.ram.Advice;

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

<beans xmlns="http://www.springframework.org/schema/beans"
    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

package com.ram.core;

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

Oct 14, 2018 10:06:18 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
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:

  • All JavaEE Videos Playlist
  • All JavaEE Videos
  • All JAVA EE Links
  • Spring Tutorial
  • Servlets Tutorial
  • All Design Patterns Links
  • JDBC Tutorial
  • Java Collection Framework Tutorial
  • JAVA Tutorial
  • Kids Tutorial
  • Cooking Tutorial
  • No comments:

    Post a Comment

    Tutorials