Monday, 12 November 2018

Spring AOP AroundAdvice[applied to all methods of the class] Example | Spring Tutorial

🚀 Want to Master Spring & Java?

Don't miss out on more tutorials! Click below to join our community and level up your coding skills today!

SUBSCRIBE TO RAM N JAVA

Understanding Spring AOP Around Advice

In this tutorial, we dive into Spring AOP (Aspect-Oriented Programming). Specifically, we explore how to use Around Advice to intercept all methods within a class. This is incredibly useful when you want to execute logic both before and after a method runs, such as for logging or performance monitoring.

1. What is Around Advice?

Around Advice is the most powerful type of advice in Spring AOP. It surrounds a method call. You have control over when the actual method executes and can even decide to skip it or return a different value.

2. Implementing MethodInterceptor

To create Around Advice, we implement the MethodInterceptor interface. In the example shown in the video, we provide an implementation for the invoke method, which contains the logic to be applied across our service methods.

3. Configuring the Proxy

To apply this advice to all methods of a class like EmployeeService, we use a ProxyFactoryBean in the Spring configuration. We set the "target" to our service bean and add our advice bean to the "interceptorNames" list.

4. Why Apply to All Methods?

Applying advice to every method in a class ensures consistent behavior. For instance, you can automatically log the start and end of every action in your EmployeeService without writing repetitive code in every single method.


Check Out More From My Channel:


Click here to watch on Youtube:
https://www.youtube.com/watch?v=fkRJL5sNyMk&list=UUhwKlOVR041tngjerWxVccw

Click the below Image to Enlarge:
Spring AOP AroundAdvice[applied to all methods of the class] Example | Spring Tutorial

Spring AOP AroundAdvice[applied to all methods of the class] Example | Spring Tutorial

Spring AOP AroundAdvice[applied to all methods of the class] Example | Spring Tutorial

Spring AOP AroundAdvice[applied to all methods of the class] 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()
    {
        System.out.println("Get Employee Name");
        return "Dave";
    }
   
    public int getEmployeeAge()
    {
        System.out.println("Get Employee Age");
        return 28;
    }
   
    public String getEmployeeAddress()
    {
        System.out.println("Get Employee Address");
        return "A111, East Street";
    }
}

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 = "
                + mi.getMethod().getName());
        obj = mi.proceed();
        System.out.println("obj = " + obj);
        System.out.println("AroundAdvice applied after actual method =  "
                + mi.getMethod().getName());
        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();

        System.out.println("----------------------------------------");

        employeeService.getEmployeeAge();

        System.out.println("----------------------------------------");

        employeeService.getEmployeeAddress();
    }

}

Output

Oct 16, 2018 9:16:55 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@736e9adb: startup date [Tue Oct 16 09:16:55 IST 2018]; root of context hierarchy
Oct 16, 2018 9:16:55 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
AroundAdvice applied before actual method = getEmployeeName
Get Employee Name
obj = Dave
AroundAdvice applied after actual method =  getEmployeeName
----------------------------------------
AroundAdvice applied before actual method = getEmployeeAge
Get Employee Age
obj = 28
AroundAdvice applied after actual method =  getEmployeeAge
----------------------------------------
AroundAdvice applied before actual method = getEmployeeAddress
Get Employee Address
obj = A111, East Street
AroundAdvice applied after actual method =  getEmployeeAddress

Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_around_advise_all_methods.zip?attredirects=0&d=1

Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_around_advise_all_methods

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/e16b8c6ef73a72464fa5812e24080179c4adc913/Spring_2018/SpringDemo_around_advise_all_methods/?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