Around advice
- Around advice combination of all three advices i.e. beforeAdvice, AfterReturningAdvice and afterThrowing advice, and execute them corresponding to method execution.
- Around Advice is not provided by spring framework.It is provided by AOP alliance as Open Source implementation.
- We should implement an interface named MethodInterceptor and we have to override invoke () method in order to create a implementation class for Around advice. For the segregation of business logic from before and after advice services, in the middle we will call proceed () method.
Syntax
Of AroundAdvice— invoke () Method
public Object
invoke(MethodInvocation methodInvocation) throws
Throwable{
}
Steps for creating implementation
for AroundAdvice :-
1)
Create a java file in com.gaurav.aop.advices package and name it as TraceLogAroundMethodExecution.
2)
Place the below code in that java file.
3)
Create a java bean MovieService in the com.gaurav.aop.services
package and place the below code in the bean file.
4)
Create a xml bean file named spring-movie-service-beans-aroundadvice.xml inside
src folder and place the below available code in that file
5)
Create a java file TraceLogMethodAroundAdviceClient.java in the package
com.gaurav.aop.advices.client inside src folder.Place the below available code
in that file.
TraceLogAroundMethodExecution.java
package com.gaurav.aop.advices;
import java.util.Arrays;
import
org.aopalliance.intercept.MethodInterceptor;
import
org.aopalliance.intercept.MethodInvocation;
import
org.springframework.transaction.IllegalTransactionStateException;
public class
TraceLogAroundMethodExecution implements MethodInterceptor {
@Override
public Object
invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("Invoked Method name : "
+
methodInvocation.getMethod().getName());
System.out.println("Invoked Method Parameters : "
+
Arrays.toString(methodInvocation.getArguments()));
// Call for the before Advice
System.out
.println("~~~~~~~~~~ TraceLogAroundMethodExecution : Method beforeAdvice
invoked ~~~~~~~~~~");
try {
// invoking the business method call
Object result =
methodInvocation.proceed();
// Call for the AfterReturningAdvice
System.out
.println("~~~~~~~~~~ TraceLogAroundMethodExecution : Method
AfterReturningAdvice invoked ~~~~~~~~~~");
return result;
} catch (IllegalTransactionStateException e) {
// Call for the afterThrowing advice.
System.out
.println("~~~~~~~~~~ TraceLogAroundMethodExecution : Method
afterThrowingAdvice invoked ~~~~~~~~~~");
System.out.println("afterThrowingAdvice is invoked due to Execption :-
"+e.getMessage());
throw e;
}
}
}
MovieService.java
package com.gaurav.aop.services;
import org.springframework.transaction.IllegalTransactionStateException;
public class MovieService {
private String
movieName;
private String
theatreName;
private String
theatreLocation;
private String
message;
public void
setMovieName(String movieName) {
this.movieName = movieName;
}
public void
setTheatreName(String theatreName) {
this.theatreName = theatreName;
}
public void
setTheatreLocation(String theatreLocation) {
this.theatreLocation = theatreLocation;
}
public void
setMessage(String message) {
this.message = message;
}
public void
displayMovieName() {
System.out.println("Movie Name : " +
this.movieName);
}
public void
displayTheatreName() {
System.out.println("Theatre Name : " +
this.theatreName);
}
public void
displayTheatreLocation() {
System.out.println("Theatre Location : " +
this.theatreLocation);
}
public void
throwError() {
throw new IllegalTransactionStateException(message);
}
}
spring-movie-service-beans-aroundadvice.xml
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean
id="movieService"
class="com.gaurav.aop.services.MovieService">
<property name="movieName"
value="Titanic" />
<property name="theatreName"
value="Prasads IMAX" />
<property name="theatreLocation"
value="Necklace Road, Hyderabad" />
<property name="message" value="movie
ticket not found" />
</bean>
<bean id="traceLogAroundMethodBean"
class="com.gaurav.aop.advices.TraceLogAroundMethodExecution" />
<bean
id="movieServiceProxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"
ref="movieService" />
<property name="interceptorNames">
<list>
<value>traceLogAroundMethodBean</value>
</list>
</property>
</bean>
</beans>
TraceLogMethodAroundAdviceClient.java
package
com.gaurav.aop.advices.client;
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import
com.gaurav.aop.services.MovieService;
public class
TraceLogMethodAroundAdviceClient {
public static
void main(String[] args) {
ApplicationContext appContext = new
ClassPathXmlApplicationContext(
new String[] {
"spring-movie-service-beans-aroundadvice.xml" });
MovieService movieService = (MovieService) appContext
.getBean("movieServiceProxy");
System.out
.println("\n#####
Movie Name in client application is as below ");
movieService.displayMovieName();
System.out
.println("\n\n##### Theatre Name in client application is as below
");
movieService.displayTheatreName();
System.out
.println("\n\n##### Theatre Location in client application is as below
");
movieService.displayTheatreLocation();
try {
System.out.println("\n\n");
movieService.throwError();
} catch (Exception e) {
}
}
}
Result:-
No comments:
Post a Comment