Action taken by an aspect at a particular join point. Different types of advice include “around,” “before” and “after” advice. Advice types are discussed below. Many AOP frameworks, including Spring, model an advice as an interceptor, maintaining a chain of interceptors “around” the join point.
We’ll learn about the After Advice types: After (finally), AfterReturning and AfterThrowing.
package com.dineshonjava.Spring.Aop; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.dineshonjava.Spring.Aop.service.ShapeService; public class AopTest { public static void main(String args[]) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); ShapeService service=context.getBean("shapeService",ShapeService.class); service.getCircle().setNameAndReturning("Dummy Circle return"); } }
package com.dineshonjava.Spring.Aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import com.dineshonjava.Spring.Aop.model.Circle; @Aspect public class LoggingAspect { public void loggingAdvice(JoinPoint joinpoint) { System.out.println("Run Advice..... get method Executed"); System.out.println(joinpoint.toString()); Circle c=(Circle)joinpoint.getTarget(); System.out.println(c.getName()); } @AfterReturning(pointcut="args(name)",returning="returnString") public void allStringMethodArguments(String name, String returnString){ System.out.println("A setter method has been executed............"+name); } @AfterThrowing(pointcut="args(name)",throwing="ex") public void exceptionAdvice(String name, Exception ex){ System.out.println("Exception is thrown ............"+ex); } @After("args(String)") public void afterAdvice(){ System.out.println("After Advice is executed..........."); } }
package com.dineshonjava.Spring.Aop; public class Circle { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; System.out.println("Setter method is called....."); throw(new RuntimeException()); } public String setNameAndReturning(String name) { this.name = name; System.out.println("Setter Method and return the value method executed...."); return name; } }
package com.dineshonjava.Spring.Aop; public class Triangle { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.dineshonjava.Spring.Aop; import com.dineshonjava.Spring.Aop.model.Circle; import com.dineshonjava.Spring.Aop.model.Triangle; public class ShapeService { private Triangle triangle; private Circle circle; public Triangle getTriangle() { return triangle; } public void setTriangle(Triangle triangle) { this.triangle = triangle; } public Circle getCircle() { return circle; } public void setCircle(Circle circle) { this.circle = circle; } }
<beans xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <aop:aspectj-autoproxy> <bean class="com.dineshonjava.Spring.Aop.model.Triangle" name="triangle"> <property name="name" value="triangle name"> </property></bean> <bean class="com.dineshonjava.Spring.Aop.model.Circle" name="circle"> <!-- <property name="name" value="circle name"/> --> </bean> <bean class="com.dineshonjava.Spring.Aop.service.ShapeService" name="shapeService"> <property name="triangle" ref="triangle"> <property name="circle" ref="circle"> </property></property></bean> <bean class="com.dineshonjava.Spring.Aop.Aspect.LoggingAspect" name="loggingAdvice"> </bean></aop:aspectj-autoproxy></beans>
package com.dineshonjava.Spring.Aop; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.dineshonjava.Spring.Aop.service.ShapeService; public class AopTest { public static void main(String args[]) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); ShapeService service=context.getBean("shapeService",ShapeService.class); service.getCircle(); } }
package com.dineshonjava.Spring.Aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import com.dineshonjava.Spring.Aop.model.Circle; @Aspect public class LoggingAspect { public void loggingAdvice(JoinPoint joinpoint) { System.out.println("Run Advice..... get method Executed"); System.out.println(joinpoint.toString()); Circle c=(Circle)joinpoint.getTarget(); System.out.println(c.getName()); } @AfterReturning(pointcut="args(name)",returning="returnString") public void allStringMethodArguments(String name, String returnString){ System.out.println("A setter method has been executed............"+name); } @AfterThrowing(pointcut="args(name)",throwing="ex") public void exceptionAdvice(String name, Exception ex){ System.out.println("Exception is thrown ............"+ex); } @After("args(String)") public void afterAdvice(){ System.out.println("After Advice is executed..........."); } @Pointcut("execution(* get*())") public void allGetters(){} @Around("allGetters()") public Object myAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) { Object returnValue=null; try { System.out.println("Before method Executed"); returnValue=proceedingJoinPoint.proceed(); System.out.println("After Method Executed...."); } catch (Throwable e) { System.out.println("Around Advice throws exception"); } System.out.println("After Finally executed........"); return returnValue; } }
package com.dineshonjava.Spring.Aop; public class Circle { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; System.out.println("Setter method is called....."); throw(new RuntimeException()); } public String setNameAndReturning(String name) { this.name = name; System.out.println("Setter Method and return the value method executed...."); return name; } }
package com.dineshonjava.Spring.Aop; public class Triangle { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
<beans xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <aop:aspectj-autoproxy> <bean class="com.dineshonjava.Spring.Aop.model.Triangle" name="triangle"> <property name="name" value="triangle name"> </property></bean> <bean class="com.dineshonjava.Spring.Aop.model.Circle" name="circle"> <!-- <property name="name" value="circle name"/> --> </bean> <bean class="com.dineshonjava.Spring.Aop.service.ShapeService" name="shapeService"> <property name="triangle" ref="triangle"> <property name="circle" ref="circle"> </property></property></bean> <bean class="com.dineshonjava.Spring.Aop.Aspect.LoggingAspect" name="loggingAdvice"> </bean></aop:aspectj-autoproxy></beans>
Strategy Design Patterns We can easily create a strategy design pattern using lambda. To implement…
Decorator Pattern A decorator pattern allows a user to add new functionality to an existing…
Delegating pattern In software engineering, the delegation pattern is an object-oriented design pattern that allows…
Technology has emerged a lot in the last decade, and now we have artificial intelligence;…
Managing a database is becoming increasingly complex now due to the vast amount of data…
Overview In this article, we will explore Spring Scheduler how we could use it by…