Thursday, 15 November 2018

Spring AOP Example – How to apply AroundAdvice using RegexpMethodPointcutAdvisor | Spring Tutorial

🚀 Level Up Your Java Skills!

Don't miss out on the latest Spring Framework tutorials from Ram N Java.

🌟 SUBSCRIBE NOW

Mastering Spring AOP with Regex

Welcome back! In this tutorial, we are exploring one of the most flexible ways to apply Around Advice in Spring: using the RegexpMethodPointcutAdvisor. This allows you to target specific methods based on name patterns rather than just applying it to every method in a class.

What is a RegexpMethodPointcutAdvisor?

Normally, when we use Spring AOP, we might want to intercept methods like getEmployeeName or saveCustomerData. Instead of writing complex logic, we can use Regular Expressions (Regex) to tell Spring exactly which method names to look for.

How it Works in This Example

In this video, we have an EmployeeService class with several methods. We want to apply our Around Advice logic only to methods that match a specific pattern. By using the advisor, we can easily filter out the methods we don't want to affect.

  • The Benefit: You don't have to change your Java code.
  • The Logic: You simply define the pattern in your XML configuration.
  • The Result: Your advice runs exactly where it's needed!

Step-by-Step Implementation

1. We define our Around Advice class which handles the logic before and after method execution.
2. We set up the RegexpMethodPointcutAdvisor bean in our configuration.
3. We provide a "pattern" (like .*getName.*) to match specific method names.
4. We use a ProxyFactoryBean to bring everything together.


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

Click the below Image to Enlarge:
Spring AOP Example – How to apply AroundAdvice using RegexpMethodPointcutAdvisor | Spring Tutorial

Spring AOP Example – How to apply AroundAdvice using RegexpMethodPointcutAdvisor | Spring Tutorial

Spring AOP Example – How to apply AroundAdvice using RegexpMethodPointcutAdvisor | Spring Tutorial

Spring AOP Example – How to apply AroundAdvice using RegexpMethodPointcutAdvisor | 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>employeeAdvisor</value>
            </list>
        </property>
    </bean>

    <bean id="employeeAdvisor"
        class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="patterns">
            <list>
                <value>.*getEmployeeA.*</value>
            </list>
        </property>
        <property name="advice" ref="aroundAdvice" />
    </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 24, 2018 10:21:08 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6ebc05a6: startup date [Wed Oct 24 10:21:08 IST 2018]; root of context hierarchy
Oct 24, 2018 10:21:09 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
Get Employee Name
----------------------------------------
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_RegexpMethodPointcutAdvisor.zip?attredirects=0&d=1

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

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