Thursday, 22 November 2018

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

🚀 Ready to Master Java Development?

Don't miss out on the latest Spring Framework tutorials! Join thousands of learners today.

SUBSCRIBE NOW

Understanding Spring AOP: Before Advice

In this guide, we break down one of the most powerful features of Spring Aspect-Oriented Programming (AOP): the Before Advice. This allows you to run specific logic right before your main method starts its work.

What is Before Advice?

The "Before Advice" is a piece of code that executes before the actual business logic method is called. It is commonly used for security checks, logging, or setting up prerequisites. In this tutorial, we focus on implementing it using XML Configuration.

Key Project Parts

  • EmployeeService: Our target class containing methods like addEmployee().
  • LoggingAspect: The class where we write the "advice" (the logging code).
  • XML Config: The file where we tell Spring to link the two together.

How It Works in Simple Steps

To set this up, we use the <aop:before> tag inside our XML configuration. We define a Pointcut, which is essentially a rule that tells Spring: "Every time someone calls the addEmployee method, run our logging code first." This keeps your business code clean and focused on just adding employees!

Why Use XML Instead of Annotations?

While modern projects often use annotations, XML configuration is fantastic for legacy systems or when you want to manage your aspects in one single place without modifying your actual Java classes. It's a great skill for any professional Java developer to have.

More Great Content from My Channel


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

Click the below Image to Enlarge:

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

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

Spring AOP AspectJ Before 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 void addEmployee()
    {
        System.out.println("addEmployee() is called");
    }
   
    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 logBefore(JoinPoint joinPoint)
    {

        System.out.print("logBefore() is running!");
        System.out.println(", before "
                + joinPoint.getSignature().getName() + " method");
        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">

            <!-- @Before -->
            <aop:pointcut id="pointCutBefore"
                expression="execution(* com.ram.service.EmployeeService.addEmployee()))" />

            <aop:before method="logBefore" pointcut-ref="pointCutBefore" />

        </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();

        employeeService.modifyEmployee();

        employeeService.deleteEmployee();

    }

}

Output

Nov 07, 2018 9:14:40 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@32709393: startup date [Wed Nov 07 09:14:40 IST 2018]; root of context hierarchy
Nov 07, 2018 9:14:40 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
logBefore() is running!, before addEmployee method
******
addEmployee() is called
modifyEmployee() is called
deleteEmployee() is called

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

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

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/a5cdfdc3da3c676ee6dec77cfdb6b5c635be29d3/Spring_2018/SpringDemo_aspectj_before_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
  • 3 comments:

    Tutorials