Monday, 12 November 2018

Spring AOP After Advice Example | 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: After Advice Explained

Aspect-Oriented Programming (AOP) is a powerful way to handle cross-cutting concerns like logging, security, or transaction management. In this guide, we dive deep into one of the most useful types of advice: After Advice.

What is After Advice?

In Spring AOP, After Advice is logic that executes immediately after a "join point" (usually a method execution) finishes. Think of it as a "finally" block in Java—it runs regardless of whether the method completed successfully or threw an exception.

Why Use After Advice?

It’s perfect for cleanup tasks! Whether you need to close a database connection, release a resource, or log that a method attempt has finished, After Advice keeps your business logic clean by separating these repetitive tasks into a single Aspect.

Practical Example

Using the @After annotation, you can target specific methods or entire packages. This tutorial shows you exactly how to set up your pointcuts so your advice triggers exactly when you need it to, making your application more modular and easier to maintain.

Key Takeaway: After Advice ensures your "teardown" logic always runs, providing a safety net for your application's state management.


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=wW-NPP72o5w&list=UUhwKlOVR041tngjerWxVccw

Click the below Image to Enlarge:
Spring AOP After Advice Example | Spring Tutorial

Spring AOP After Advice Example | Spring Tutorial

Spring AOP After Advice 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";
    }
}

LoggingAdvice.java

package com.ram.Advice;

import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;

public class LoggingAdvice implements AfterReturningAdvice
{

    public void afterReturning(Object returnValue, Method method, Object[] args,
            Object target) throws Throwable
    {
        System.out.println("Logging advice is applied after the method "
                + method.getName() + " in the target Object "
                + target.getClass().getName());

        for (Object object : args)
        {
            System.out.println(object);
        }

        System.out.println("returnValue = " + returnValue);

    }

}

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="loggingAdvice" class="com.ram.Advice.LoggingAdvice"></bean>

    <bean id="employeeServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="target" ref="employeeService"></property>
        <property name="interceptorNames">
            <list>
                <value>loggingAdvice</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 12, 2018 8:06:21 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6ebc05a6: startup date [Fri Oct 12 08:06:21 IST 2018]; root of context hierarchy
Oct 12, 2018 8:06:22 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
Get Employee Information
Logging advice is applied after the method getEmployeeName in the target Object com.ram.service.EmployeeService
28
returnValue = Peter

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

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

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