Showing posts with label AspectJ. Show all posts
Showing posts with label AspectJ. Show all posts

Saturday, 8 December 2018

Spring AOP AspectJ Around Advice example using XML configuration | Spring Tutorial

🚀 Master Spring Framework!

Join the Ram N Java community for practical, step-by-step tutorials that make complex coding concepts simple.

SUBSCRIBE TO RAM N JAVA

Mastering Spring AOP: Around Advice with XML

Aspect-Oriented Programming (AOP) allows developers to handle "cross-cutting concerns" like logging and security separately from main business logic. Among all advice types, Around Advice is the most powerful and flexible.

What is Around Advice?

Around Advice surrounds a method execution. It gives you full control, allowing you to perform actions both before and after the method runs. You can even decide whether the method should execute at all or provide your own custom return value.

Why Use XML Configuration?

While annotations are popular, XML configuration keeps your Java classes clean and completely decoupled from AOP logic. This is especially useful in legacy systems or when you want a centralized place to manage all your application's aspects without touching the source code.

Practical Use Cases

Around Advice is perfect for performance monitoring. You can start a timer, let the method run, stop the timer, and log the total execution time—all in one place! It’s also ideal for caching and complex security checks.

Key Takeaway: Around Advice provides the ultimate level of control over method execution, making your Spring applications more modular and powerful.


Check Out More From Ram N Java

Keep your momentum going with these top-rated tutorials from my channel:


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

Click the below Image to Enlarge:
Spring AOP AspectJ Around Advice example using XML configuration | Spring Tutorial

Spring AOP AspectJ Around Advice example using XML configuration | Spring Tutorial

Spring AOP AspectJ Around Advice example using XML configuration | 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>

        <!-- Spring AOP + AspectJ -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
       
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.1</version>
        </dependency>
       
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.1</version>
        </dependency>

    </dependencies>

</project>

EmployeeService.java

package com.ram.service;

public class EmployeeService
{
    public String addEmployee(String name)
    {
        System.out
                .println("addEmployee(String name) method is called");
        return "Employee Peter information is added successfully";
    }

    public void modifyEmployee()
    {
        System.out.println("modifyEmployee() is called");
    }

    public void deleteEmployee()
    {
        System.out.println("deleteEmployee() is called");
    }

}

LoggingAspect.java

package com.ram.Aspect;

import java.util.Arrays;

import org.aspectj.lang.ProceedingJoinPoint;

public class LoggingAspect
{
    public void logAround(ProceedingJoinPoint proceedingJoinPoint)
            throws Throwable
    {

        System.out.println("logAround() is running!");
        System.out.println("hijacked method = "
                + proceedingJoinPoint.getSignature().getName());
        System.out.println("hijacked arguments = "
                + Arrays.toString(proceedingJoinPoint.getArgs()));

        System.out.println("Around before is running!");
        proceedingJoinPoint.proceed(); // continue on the intercepted
                                        // method
        System.out.println("Around after is running!");

        System.out.println("******");
    }

}

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"
    xmlns:aop="http://www.springframework.org/schema/aop"
    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
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">


    <bean id="employeeService" class="com.ram.service.EmployeeService"></bean>

    <!-- Aspect -->
    <bean id="logAspect" class="com.ram.Aspect.LoggingAspect" />

    <aop:config>
        <aop:aspect id="aspectLoggging" ref="logAspect">
            <!-- @Around -->
            <aop:pointcut id="pointCutAround"
                expression="execution(* com.ram.service.EmployeeService.addEmployee(..)))" />

            <aop:around method="logAround" pointcut-ref="pointCutAround" />
        </aop:aspect>

    </aop:config>

</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("employeeService", EmployeeService.class);

        employeeService.addEmployee("Peter");

        employeeService.modifyEmployee();

        employeeService.deleteEmployee();

    }

}

Output

Nov 15, 2018 10:41:50 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@32709393: startup date [Thu Nov 15 10:41:50 IST 2018]; root of context hierarchy
Nov 15, 2018 10:41:50 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
logAround() is running!
hijacked method = addEmployee
hijacked arguments = [Peter]
Around before is running!
addEmployee(String name) method is called
Around after is running!
******
modifyEmployee() is called
deleteEmployee() is called

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

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

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/0989e369f77ed192b0b224588ebfcdeb2019a6a2/Spring_2018/SpringDemo_aspectj_around_advise_XML_Config/?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
  • Spring AOP AspectJ @Around Annotation Example | Spring Tutorial

    Mastering Spring AOP: @Around AspectJ Annotation Explained

    🚀 SUBSCRIBE TO RAM N JAVA FOR MORE TECH GUIDES!

    What is @Around Annotation?

    In Spring Aspect-Oriented Programming (AOP), the @Around annotation is one of the most powerful tools. It allows you to "wrap" a method call. This means you can run custom code before the method starts and after it finishes. It gives you full control over whether the actual method even runs!

    Key Concepts in this Tutorial

    • Employee Service: A simple class with methods like addEmployee, modifyEmployee, and deleteEmployee.
    • Logging Aspect: A special class where we write our @Around logic.
    • ProceedingJoinPoint: This is a special parameter that represents the method being called. We use joinPoint.proceed() to let the original method run.

    How it Works (Step-by-Step)

    1. Before execution: The code before joinPoint.proceed() runs first (perfect for logging or security checks). 2. The Method: The original method (like adding an employee) executes. 3. After execution: The code after joinPoint.proceed() runs last.

    Configuration

    To make this work, you need to enable AspectJ in your Spring configuration using <aop:aspectj-autoproxy /> and define your beans for the service and the aspect classes.


    Check out more Spring Tutorials:


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

    Click the below Image to Enlarge:
    Spring AOP AspectJ @Around Annotation Example | Spring Tutorial

    Spring AOP AspectJ @Around Annotation Example | Spring Tutorial

    Spring AOP AspectJ @Around Annotation 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>

            <!-- Spring AOP + AspectJ -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${spring.version}</version>
            </dependency>
           
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>1.9.1</version>
            </dependency>
           
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.1</version>
            </dependency>

        </dependencies>

    </project>

    EmployeeService.java

    package com.ram.service;

    public class EmployeeService
    {
        public String addEmployee(String name)
        {
            System.out
                    .println("addEmployee(String name) method is called");
            return "Employee Peter information is added successfully";
        }

        public void modifyEmployee()
        {
            System.out.println("modifyEmployee() is called");
        }

        public void deleteEmployee()
        {
            System.out.println("deleteEmployee() method is called");
        }

    }

    LoggingAspect.java

    package com.ram.Aspect;

    import java.util.Arrays;

    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;

    @Aspect
    public class LoggingAspect
    {

        @Around("execution(* com.ram.service.EmployeeService.addEmployee(..))")
        public void logAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
        {

            System.out.println("logAround() is running!");
            System.out.println("hijacked method = " + proceedingJoinPoint.getSignature().getName());
            System.out.println("hijacked arguments = " + Arrays.toString(proceedingJoinPoint.getArgs()));
               
            System.out.println("Around before is running!");
            proceedingJoinPoint.proceed(); //continue on the intercepted method
            System.out.println("Around after is running!");
               
            System.out.println("******");
        }

    }

    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"
        xmlns:aop="http://www.springframework.org/schema/aop"
        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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">


        <aop:aspectj-autoproxy />

        <bean id="employeeService" class="com.ram.service.EmployeeService"></bean>
       
        <!-- Aspect -->
        <bean id="logAspect" class="com.ram.Aspect.LoggingAspect" />

    </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("employeeService", EmployeeService.class);

            employeeService.addEmployee("Peter");

            employeeService.modifyEmployee();

            employeeService.deleteEmployee();

        }

    }

    Output

    Nov 14, 2018 9:27:46 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@32709393: startup date [Wed Nov 14 09:27:46 IST 2018]; root of context hierarchy
    Nov 14, 2018 9:27:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
    ---------------------------------------
    logAround() is running!
    hijacked method = addEmployee
    hijacked arguments = [Peter]
    Around before is running!
    addEmployee(String name) method is called
    Around after is running!
    ******
    modifyEmployee() is called
    deleteEmployee() method is called

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

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

    Bitbucket Link:
    https://bitbucket.org/ramram43210/spring/src/0989e369f77ed192b0b224588ebfcdeb2019a6a2/Spring_2018/SpringDemo_aspectJ_around_annotation/?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
  • Tuesday, 4 December 2018

    Spring AOP AspectJ throws Advice example using XML configuration | Spring Tutorial

    Implementing Spring AOP AspectJ Throws Advice with XML Configuration

    🔔 SUBSCRIBE TO RAM N JAVA FOR DAILY TECH TIPS!

    What is Throws Advice in Spring AOP?

    In Spring Aspect-Oriented Programming (AOP), Throws Advice is a type of "after advice" that only runs if a method exits by throwing an exception. It is incredibly useful for centralized error handling, logging specific failure details, or even triggering notification systems when something goes wrong in your application.

    How to Configure it Using XML

    While modern Spring often uses annotations, many enterprise systems still rely on XML configuration. To implement Throws Advice with XML, you define your aspect as a standard bean and then use the section to map it.

    Step-by-Step Implementation

    • The Target Method: Create a service (like an Employee Service) that purposefully throws an exception under certain conditions.
    • The Aspect Class: Create a Java class with a method designed to catch the exception details.
    • XML Setup: Use the tag. You specify the pointcut (where the advice applies) and the method in your aspect class that should handle the error.

    Why Use Throws Advice?

    Instead of cluttering every single method with try-catch blocks, you can define one "Throws Advice" globally. This keeps your business logic clean and ensures that every error is handled or logged in a consistent way across your entire project.


    Explore More Spring AOP Tutorials from Ram N Java:


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

    Click the below Image to Enlarge:
    Spring AOP AspectJ throws Advice example using XML configuration | Spring Tutorial

    Spring AOP AspectJ throws Advice example using XML configuration | Spring Tutorial

    Spring AOP AspectJ throws Advice example using XML configuration | 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>

            <!-- Spring AOP + AspectJ -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${spring.version}</version>
            </dependency>
           
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>1.9.1</version>
            </dependency>
           
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.9.1</version>
            </dependency>

        </dependencies>

    </project>

    EmployeeService.java

    package com.ram.service;

    public class EmployeeService
    {
        public String addEmployee()
        {
            System.out.println("addEmployee() is called");
            String name = null;
            name.toLowerCase();
            return "Employee Peter information is added successfully";
        }
       
        public void modifyEmployee()
        {
            System.out.println("modifyEmployee() is called");
        }
       
        public void deleteEmployee()
        {
            System.out.println("deleteEmployee() is called");
        }

    }

    LoggingAspect.java

    package com.ram.Aspect;

    import org.aspectj.lang.JoinPoint;

    public class LoggingAspect
    {
        public void logAfterThrowing(JoinPoint joinPoint,
                Throwable exception)
        {

            System.out.print("logAfterThrowing() is running!");
            System.out.println(
                    ", after " + joinPoint.getSignature().getName()
                            + " method throwing exception");
            System.out.println("exception = " + exception);
            System.out.println("******");
        }

    }

    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"
        xmlns:aop="http://www.springframework.org/schema/aop"
        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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">


        <bean id="employeeService" class="com.ram.service.EmployeeService"></bean>

        <!-- Aspect -->
        <bean id="logAspect" class="com.ram.Aspect.LoggingAspect" />

        <aop:config>
            <aop:aspect id="aspectLoggging" ref="logAspect">
                <!-- @AfterThrowing -->
                <aop:pointcut id="pointCutAfterThrowing"
                    expression="execution(* com.ram.service.EmployeeService.addEmployee()))" />

                <aop:after-throwing method="logAfterThrowing"
                    throwing="exception" pointcut-ref="pointCutAfterThrowing" />
            </aop:aspect>
        </aop:config>

    </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("employeeService",
                    EmployeeService.class);

            try
            {
                employeeService.addEmployee();
            }
            catch (Exception exe)
            {
                System.out.println("exception message  = " + exe.getMessage());
            }

            employeeService.modifyEmployee();

            employeeService.deleteEmployee();

        }

    }

    Output

    Nov 13, 2018 9:38:13 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@32709393: startup date [Tue Nov 13 09:38:13 IST 2018]; root of context hierarchy
    Nov 13, 2018 9:38:13 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
    ---------------------------------------
    addEmployee() is called
    logAfterThrowing() is running!, after addEmployee method throwing exception
    exception = java.lang.NullPointerException
    ******
    exception message  = null
    modifyEmployee() is called
    deleteEmployee() is called

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

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

    Bitbucket Link:
    https://bitbucket.org/ramram43210/spring/src/6bb2ff720fe1441184ee161a1a41ebd747f549ef/Spring_2018/SpringDemo_throws_advice_xml_config/?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
  • Tutorials