🚀 Love Spring Framework Tutorials?
Join our community of developers! Subscribe to Ram N Java for more easy-to-follow Java guides.
SUBSCRIBE NOWUnderstanding After Advice in Spring AOP
In this tutorial, we dive into Aspect-Oriented Programming (AOP) specifically focusing on the After Advice. If you are new to AOP, think of Advice as the action taken by an aspect at a particular join point.
What is After Advice?
The "After Advice" is a type of advice that executes regardless of whether the method finishes successfully or throws an exception. It is often referred to as "After (Finally) Advice" because it behaves like a finally block in Java.
Core Components of the Project
- EmployeeService Class: Contains our business logic with methods like
addEmployee(),modifyEmployee(), anddeleteEmployee(). - LoggingAspect Class: This contains our "cross-cutting concern" (the logging logic) that we want to run after our service methods.
- XML Configuration: We use the
applicationContext.xmlfile to link the service and the aspect together using the<aop:config>tag.
How the Configuration Works
To implement this, we define a Pointcut. A pointcut is a set of one or more join points where an advice should be executed. In our example, we target the addEmployee() method. Once configured, Spring will automatically trigger our logging method immediately after the employee is added!
Why Use XML Configuration?
While annotations are popular, XML configuration keeps your Java code clean and decoupled from the AOP logic. It provides a centralized place to manage all your aspects without touching the business logic classes.
Watch More from Ram N Java
Check out these other helpful tutorials from my channel:
Click here to watch on Youtube:
https://www.youtube.com/watch?v=f4ZntT089Ow&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| Spring AOP AspectJ After Advice example using XML configuration | Spring Tutorial |
| Spring AOP AspectJ After Advice example using XML configuration | Spring Tutorial |
| Spring AOP AspectJ After Advice example using XML configuration | Spring Tutorial |
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
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
import org.aspectj.lang.JoinPoint;
public class LoggingAspect
{
public void logAfter(JoinPoint joinPoint)
{
System.out.print("logAfter() is running!");
System.out.println(", after "
+ joinPoint.getSignature().getName() + " method");
System.out.println("******");
}
}
applicationContext.xml
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">
<!-- @After -->
<aop:pointcut id="pointCutAfter"
expression="execution(* com.ram.service.EmployeeService.addEmployee()))" />
<aop:after method="logAfter" pointcut-ref="pointCutAfter" />
</aop:aspect>
</aop:config>
</beans>
App.java
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
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@32709393: startup date [Thu Nov 08 11:12:29 IST 2018]; root of context hierarchy
Nov 08, 2018 11:12:30 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
addEmployee() is called
logAfter() is running!, after addEmployee method
******
modifyEmployee() is called
deleteEmployee() is called
Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_After_advice_XML_Config.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_After_advice_XML_Config
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/0b94f52191c5d2085aabe1f85d3349dd2bf0b474/Spring_2018/SpringDemo_After_advice_XML_Config/?at=master
See also:
No comments:
Post a Comment