- Spring AOP - Discussion
- Spring AOP - Useful Resources
- Spring AOP - Quick Guide
- Spring AOP - Custom Annotation
- Spring AOP - Proxy
- Spring AOP - Around Advice
- Spring AOP - After Throwing Advice
- Spring AOP - After Returning Advice
- Spring AOP - After Advice
- Spring AOP - Before Aspect
- Spring AOP - Pointcut Methods
- Spring AOP - Application
- Spring AOP - Around Advice
- Spring AOP - After Throwing Advice
- Spring AOP - After Returning Advice
- Spring AOP - After Advice
- Spring AOP - Before Advice
- Spring AOP - Pointcut Methods
- Spring AOP - Application
- Spring AOP - Implementations
- Spring AOP - Advice Types
- Spring AOP - Core Concepts
- Spring AOP - Environment Setup
- Spring AOP - Overview
- Spring AOP - Home
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
Spring AOP - Quick Guide
Spring AOP - Overview
One of the key components of Spring Framework is the Aspect Oriented Programming (AOP) framework. Aspect Oriented Programming entails breaking down program logic into distinct parts called so-called concerns. The functions that span multiple points of an apppcation are called cross-cutting concerns. These cross-cutting concerns are conceptually separate from the apppcation s business logic. There are various common good examples of aspects such as logging, auditing, declarative transactions, security, caching, etc.
The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect. Dependency Injection helps you decouple your apppcation objects from each other, while AOP helps you decouple cross-cutting concerns from the objects that they affect. AOP is pke triggers in programming languages such as Perl, .NET, Java, and others.
Spring AOP module lets interceptors intercept an apppcation. For example, when a method is executed, you can add extra functionapty before or after the method execution.
Spring AOP - Environment Setup
This chapter will guide you on how to prepare a development environment to start your work with Spring Framework. It will also teach you how to set up JDK, Maven and Ecppse on your machine before you set up Spring Framework −
Step 1 - Setup Java Development Kit (JDK)
You can download the latest version of SDK from Oracle s Java site −
You will find instructions for instalpng JDK in downloaded files, follow the given instructions to install and configure the setup. Finally set PATH and JAVA_HOME environment variables to refer to the directory that contains java and javac, typically java_install_dir/bin and java_install_dir respectively.If you are running Windows and have installed the JDK in C:jdk-11.0.11, you would have to put the following pne in your C:autoexec.bat file.
set PATH=C:jdk-11.0.11;%PATH% set JAVA_HOME=C:jdk-11.0.11
Alternatively, on Windows NT/2000/XP, you will have to right-cpck on My Computer, select Properties → Advanced → Environment Variables. Then, you will have to update the PATH value and cpck the OK button.
On Unix (Solaris, Linux, etc.), if the SDK is installed in /usr/local/jdk-11.0.11 and you use the C shell, you will have to put the following into your .cshrc file.
setenv PATH /usr/local/jdk-11.0.11/bin:$PATH setenv JAVA_HOME /usr/local/jdk-11.0.11
Alternatively, if you use an Integrated Development Environment (IDE) pke Borland JBuilder, Ecppse, IntelpJ IDEA, or Sun ONE Studio, you will have to compile and run a simple program to confirm that the IDE knows where you have installed Java. Otherwise, you will have to carry out a proper setup as given in the document of the IDE.
Step 2 - Setup Ecppse IDE
All the examples in this tutorial have been written using Ecppse IDE. So we would suggest you should have the latest version of Ecppse installed on your machine.
To install Ecppse IDE, download the latest Ecppse binaries from
. Once you download the installation, unpack the binary distribution into a convenient location. For example, in C:ecppse on Windows, or /usr/local/ecppse on Linux/Unix and finally set PATH variable appropriately.Ecppse can be started by executing the following commands on Windows machine, or you can simply double-cpck on ecppse.exe
%C:ecppseecppse.exe
Ecppse can be started by executing the following commands on Unix (Solaris, Linux, etc.) machine −
$/usr/local/ecppse/ecppse
After a successful startup, if everything is fine then it should display the following result −
Step 3 - Download Maven Archive
Download Maven 3.8.4 from
.OS | Archive name |
---|---|
Windows | apache-maven-3.8.4-bin.zip |
Linux | apache-maven-3.8.4-bin.tar.gz |
Mac | apache-maven-3.8.4-bin.tar.gz |
Step 4 - Extract the Maven Archive
Extract the archive, to the directory you wish to install Maven 3.8.4. The subdirectory apache-maven-3.8.4 will be created from the archive.
OS | Location (can be different based on your installation) |
---|---|
Windows | C:Program FilesApache Software Foundationapache-maven-3.8.4 |
Linux | /usr/local/apache-maven |
Mac | /usr/local/apache-maven |
Step 5 - Set Maven Environment Variables
Add M2_HOME, M2, MAVEN_OPTS to environment variables.
OS | Output |
---|---|
Windows | Set the environment variables using system properties. M2_HOME=C:Program FilesApache Software Foundationapache-maven-3.8.4 M2=%M2_HOME%in MAVEN_OPTS=-Xms256m -Xmx512m |
Linux | Open command terminal and set environment variables. export M2_HOME=/usr/local/apache-maven/apache-maven-3.8.4 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
Mac | Open command terminal and set environment variables. export M2_HOME=/usr/local/apache-maven/apache-maven-3.8.4 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
Step 6 - Add Maven bin Directory Location to System Path
Now append M2 variable to System Path.
OS | Output |
---|---|
Windows | Append the string ;%M2% to the end of the system variable, Path. |
Linux | export PATH=$M2:$PATH |
Mac | export PATH=$M2:$PATH |
Step 7 - Verify Maven Installation
Now open console and execute the following mvn command.
OS | Task | Command |
---|---|---|
Windows | Open Command Console | c:> mvn --version |
Linux | Open Command Terminal | $ mvn --version |
Mac | Open Terminal | machine:~ joseph$ mvn --version |
Finally, verify the output of the above commands, which should be as follows −
OS | Output |
---|---|
Windows | Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537) Maven home: C:Program FilesApache Software Foundationapache-maven-3.8.4 Java version: 11.0.11, vendor: Oracle Corporation, runtime: C:Program FilesJavajdk11.0.11 Default locale: en_IN, platform encoding: Cp1252 OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows" |
Linux | Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537) Java version: 11.0.11 Java home: /usr/local/java-current/jre |
Mac | Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537) Java version: 11.0.11 Java home: /Library/Java/Home/jre |
Spring AOP - Core Concepts
Before we start working with AOP, let us become famipar with the AOP concepts and terminologies. These terms are not specific to Spring, rather they are related to AOP.
Sr.No. | Terms & Description |
---|---|
1 | Aspect A module which has a set of APIs providing cross-cutting requirements. For example, a logging module would be called AOP aspect for logging. An apppcation can have any number of aspects depending on the requirement. |
2 | Join point This represents a point in your apppcation where you can plug-in AOP aspect. You can also say, it is the actual place in the apppcation where an action will be taken using Spring AOP framework. |
3 | Advice This is the actual action to be taken either before or after the method execution. This is the actual piece of code that is invoked during program execution by Spring AOP framework. |
4 | PointCut This is a set of one or more joinpoints where an advice should be executed. You can specify PointCuts using expressions or patterns as we will see in our AOP examples. |
5 | Introduction An introduction allows you to add new methods or attributes to existing classes. |
6 | Target object The object being advised by one or more aspects. This object will always be a proxied object. Also referred to as the advised object. |
7 | Weaving Weaving is the process of pnking aspects with other apppcation types or objects to create an advised object. This can be done at compile time, load time, or at runtime. |
Spring AOP - Advice Types
Spring aspects can work with five kinds of advice mentioned in the following table.
Sr.No. | Advice & Description |
---|---|
1 | before Run advice before the method execution. |
2 | after Run advice after the method execution, regardless of its outcome. |
3 | after-returning Run advice after the method execution, only if the method completes successfully. |
4 | after-throwing Run advice after the method execution, only if the method exits by throwing an exception. |
5 | around Run advice before and after the advised method is invoked. |
Spring AOP - Implementations
Spring supports the @AspectJ annotation style approach and the schema-based approach to implement custom aspects.
XML Schema Based
Aspects are implemented using regular classes along with XML based configuration.
To use the AOP namespace tags described in this section, you need to import the spring AOP schema, described as follows −
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <!-- bean definition & AOP specific configuration --> </beans>
Declaring an Aspect
An aspect is declared using the <aop:aspect> element, and the backing bean is referenced using the ref attribute as follows.
<aop:config> <aop:aspect id = "myAspect" ref = "aBean"> ... </aop:aspect> </aop:config> <bean id = "aBean" class = "..."> ... </bean>
Here "aBean" will be configured and dependency injected just pke any other Spring bean as you have seen in the previous chapters.
Declaring a Pointcut
A Pointcut helps in determining the join points (i.e. methods) of interest to be executed with different advices. While working with XML Schema based configuration, Pointcut will be defined as follows −
<aop:config> <aop:aspect id = "myAspect" ref = "aBean"> <aop:pointcut id = "businessService" expression = "execution(* com.xyz.myapp.service.*.*(..))"/> ... </aop:aspect> </aop:config> <bean id = "aBean" class = "..."> ... </bean>
The following example defines a Pointcut named businessService that will match the execution of getName() method available in Student class under the package com.tutorialspoint.
<aop:config> <aop:aspect id = "myAspect" ref = "aBean"> <aop:pointcut id = "businessService" expression = "execution(* com.tutorialspoint.Student.getName(..))"/> ... </aop:aspect> </aop:config> <bean id = "aBean" class = "..."> ... </bean>
Declaring Advices
You can declare any of the five advices inside an <aop:aspect> using the <aop:{ADVICE NAME}> element as follows.
<aop:config> <aop:aspect id = "myAspect" ref = "aBean"> <aop:pointcut id = "businessService" expression = "execution(* com.xyz.myapp.service.*.*(..))"/> <!-- a before advice definition --> <aop:before pointcut-ref = "businessService" method = "doRequiredTask"/> <!-- an after advice definition --> <aop:after pointcut-ref = "businessService" method = "doRequiredTask"/> <!-- an after-returning advice definition --> <!--The doRequiredTask method must have parameter named retVal --> <aop:after-returning pointcut-ref = "businessService" returning = "retVal" method = "doRequiredTask"/> <!-- an after-throwing advice definition --> <!--The doRequiredTask method must have parameter named ex --> <aop:after-throwing pointcut-ref = "businessService" throwing = "ex" method = "doRequiredTask"/> <!-- an around advice definition --> <aop:around pointcut-ref = "businessService" method = "doRequiredTask"/> ... </aop:aspect> </aop:config> <bean id = "aBean" class = "..."> ... </bean>
You can use same doRequiredTask or different methods for different advices. These methods will be defined as a part of aspect module.
@AspectJ based
@AspectJ refers to a style of declaring aspects as regular Java classes annotated with Java 5 annotations. The @AspectJ support is enabled by including the following element inside your XML Schema-based configuration file.
<aop:aspectj-autoproxy/>
Declaring an Aspect
Aspects classes are pke any other normal bean and may have methods and fields just pke any other class, except that they will be annotated with @Aspect as follows.
package org.xyz; import org.aspectj.lang.annotation.Aspect; @Aspect pubpc class AspectModule { }
They will be configured in XML pke any other bean as follows.
<bean id = "myAspect" class = "org.xyz.AspectModule"> <!-- configure properties of aspect here as normal --> </bean>
Declaring a Pointcut
A Pointcut helps in determining the join points (i.e. methods) of interest to be executed with different advices. While working with @AspectJ based configuration, Pointcut declaration has two parts −
A Pointcut expression that determines exactly which method executions we are interested in.
A Pointcut signature comprising a name and any number of parameters. The actual body of the method is irrelevant and in fact should be empty.
The following example defines a Pointcut named businessService that will match the execution of every method available in the classes under the package com.xyz.myapp.service.
import org.aspectj.lang.annotation.Pointcut; @Pointcut("execution(* com.xyz.myapp.service.*.*(..))") // expression private void businessService() {} // signature
The following example defines a Pointcut named getname that will match the execution of getName() method available in Student class under the package com.tutorialspoint.
import org.aspectj.lang.annotation.Pointcut; @Pointcut("execution(* com.tutorialspoint.Student.getName(..))") private void getname() {}
Declaring Advices
You can declare any of the five advices using @{ADVICE-NAME} annotations as given below. This assumes that you already have defined a Pointcut signature method businessService().
@Before("businessService()") pubpc void doBeforeTask(){ ... } @After("businessService()") pubpc void doAfterTask(){ ... } @AfterReturning(Pointcut = "businessService()", returning = "retVal") pubpc void doAfterReturnningTask(Object retVal){ // you can intercept retVal here. ... } @AfterThrowing(Pointcut = "businessService()", throwing = "ex") pubpc void doAfterThrowingTask(Exception ex){ // you can intercept thrown exception here. ... } @Around("businessService()") pubpc void doAroundTask(){ ... }
You can define Pointcut inpne for any of the advices. Following is an example to define inpne Pointcut for before advice.
@Before("execution(* com.xyz.myapp.service.*.*(..))") pubpc doBeforeTask(){ ... }
Spring AOP - XML Based Apppcation
In this chapter, we will write actual AOP apppcations using Spring AOP Framework. Before you start writing your first example using Spring-WS framework, you have to make sure that you have set up your Spring AOP environment properly as explained in
chapter.Now, proceed to write a simple console-ased Spring AOP Apppcation, which will demonstrate AOP concepts.
Create a Project
Step 1 − Open a command console, go the C:MVN directory and execute the following mvn command.
C:MVN>mvn archetype:generate -DgroupId=com.tutorialspoint -DartifactId=Student -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Maven will start processing and will create the complete Java apppcation project structure.
[INFO] Scanning for projects... [INFO] [INFO] ------------------< org.apache.maven:standalone-pom >------------------- [INFO] Building Maven Stub Project (No POM) 1 [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] >>> maven-archetype-plugin:3.2.0:generate (default-cp) > generate-sources @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:3.2.0:generate (default-cp) < generate-sources @ standalone-pom <<< [INFO] [INFO] [INFO] --- maven-archetype-plugin:3.2.0:generate (default-cp) @ standalone-pom --- [INFO] Generating project in Batch mode [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0 [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: basedir, Value: C:MVN [INFO] Parameter: package, Value: com.tutorialspoint [INFO] Parameter: groupId, Value: com.tutorialspoint [INFO] Parameter: artifactId, Value: Student [INFO] Parameter: packageName, Value: com.tutorialspoint [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] project created from Old (1.x) Archetype in dir: C:MVNStudent [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 13.388 s [INFO] Finished at: 2021-12-27T20:18:26+05:30 [INFO] ------------------------------------------------------------------------
Step 2 − Go to C:/MVN directory. You ll see a Java apppcation project created, named student (as specified in artifactId). Update the POM.xml to include Spring-AOP dependencies. Add MainApp.java, Student.java, and Logging.java files.
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.tutorialspoint</groupId> <artifactId>Student</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Student</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.14</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.14</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.7</version> </dependency> </dependencies> </project>
Following is the content of the Logging.java file.
package com.tutorialspoint; pubpc class Logging { /** * This is the method which I would pke to execute * before a selected method execution. */ pubpc void beforeAdvice() { System.out.println("Going to setup student profile."); } /** * This is the method which I would pke to execute * after a selected method execution. */ pubpc void afterAdvice() { System.out.println("Student profile has been setup."); } /** * This is the method which I would pke to execute * when any method returns. */ pubpc void afterReturningAdvice(Object retVal){ System.out.println("Returning:" + retVal.toString() ); } /** * This is the method which I would pke to execute * if there is an exception raised. */ pubpc void AfterThrowingAdvice(IllegalArgumentException ex) { System.out.println("There has been an exception: " + ex.toString()); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); student.printThrowException(); } }
Step 3 − Add the configuration file Beans.xml under src > main > resources folder.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "selectAll" expression = "execution(* com.tutorialspoint.*.*(..))"/> <aop:before pointcut-ref = "selectAll" method = "beforeAdvice"/> <aop:after pointcut-ref = "selectAll" method = "afterAdvice"/> <aop:after-returning pointcut-ref = "selectAll" returning = "retVal" method = "afterReturningAdvice"/> <aop:after-throwing pointcut-ref = "selectAll" throwing = "ex" method = "AfterThrowingAdvice"/> </aop:aspect> </aop:config> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Step 4 − Open the command console, go the C:MVN directory and execute the following mvn command.
C:MVN>Student> mvn package
Maven will start processing and downloading the required pbraries.
C:MVNStudent>mvn package [INFO] Scanning for projects... [INFO] [INFO] ---------------------< com.tutorialspoint:Student >--------------------- [INFO] Building Student 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Student --- [INFO] Using UTF-8 encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Student --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ Student --- [INFO] Using UTF-8 encoding to copy filtered resources. [INFO] skip non existing resourceDirectory C:MVNStudentsrc est esources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ Student --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ Student --- [INFO] Surefire report directory: C:MVNStudent argetsurefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.tutorialspoint.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.093 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ Student --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.213 s [INFO] Finished at: 2021-12-27T20:42:00+05:30 [INFO] ------------------------------------------------------------------------ C:MVNStudent>
Import Project in Ecppse
Step 1 − Open Ecppse.
Step 2 − Select File → Import → option.
Step 3 − Select Maven Projects Option. Cpck the Next Button.
Step 4 − Select Project location, where Student project was created using Maven.
Step 5 − Cpck Finish Button.
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Going to setup student profile. Name : Zara Student profile has been setup. Returning:Zara Going to setup student profile. Age : 11 Student profile has been setup. Returning:11 Going to setup student profile. Exception raised Student profile has been setup. There has been an exception: java.lang.IllegalArgumentException Exception in thread "main" java.lang.IllegalArgumentException at com.tutorialspoint.Student.printThrowException(Student.java:25) ...
Spring AOP - XML Based PointCut
Join Point
A JoinPoint represents a point in your apppcation where you can plug-in AOP aspect. You can also say, it is the actual place in the apppcation where an action will be taken using Spring AOP framework. Consider the following examples −
All methods classes contained in a package(s).
A particular methods of a class.
PointCut
PointCut is a set of one or more JoinPoints where an advice should be executed. You can specify PointCuts using expressions or patterns as we will see in our AOP examples. In Spring, PointCut helps to use specific JoinPoints to apply the advice. Consider the following examples −
expression = "execution(* com.tutorialspoint.*.*(..))"
expression = "execution(* com.tutorialspoint.Student.getName(..))"
Syntax
<aop:config> <aop:aspect id = "log" ref = "adviceClass"> <aop:pointcut id = "PointCut-id" expression = "execution( expression )"/> </aop:aspect> </aop:config>
Where,
adviceClass − ref of the class containing advice methods
PointCut-id − id of the PointCut
execution( expression ) − Expression covering methods on which advice is to be appped.
To understand the above-mentioned concepts related to JoinPoint and PointCut, let us write an example which will implement few of the PointCuts. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation.
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; pubpc class Logging { /** * This is the method which I would pke to execute * before a selected method execution. */ pubpc void beforeAdvice(){ System.out.println("Going to setup student profile."); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "selectAll" expression = "execution(* com.tutorialspoint.*.*(..))"/> <aop:before pointcut-ref = "selectAll" method = "beforeAdvice"/> </aop:aspect> </aop:config> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Once you are done with creating the source and bean configuration files, run the apppcation. If everything is fine with your apppcation, it will print the following message.
Going to setup student profile. Name : Zara Going to setup student profile. Age : 11
The above-defined <aop:pointcut> selects all the methods defined under the package com.tutorialspoint. Let us suppose, you want to execute your advice before or after a particular method, you can define your PointCut to narrow down your execution by replacing stars (*) in PointCut definition with actual class and method names. Following is a modified XML configuration file to show the concept.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "selectAll" expression = "execution(* com.tutorialspoint.Student.getName(..))"/> <aop:before pointcut-ref = "selectAll" method = "beforeAdvice"/> </aop:aspect> </aop:config> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Going to setup student profile. Name : Zara Age : 11
Spring AOP - XML Based Before Advice
Before is an advice type which ensures that an advice runs before the method execution. Following is the syntax of before advice.
Syntax
<aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "PointCut-id" expression = "execution( expression )"/> <aop:before pointcut-ref = "PointCut-id" method = "methodName"/> </aop:aspect> </aop:config>
Where,
PointCut-id − id of the PointCut.
methodName − Method name of the function to be called before a called function.
To understand the above-mentioned concepts related to Before Advice, let us write an example, which will implement Before Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation.
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; pubpc class Logging { /** * This is the method which I would pke to execute * before a selected method execution. */ pubpc void beforeAdvice(){ System.out.println("Going to setup student profile."); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "selectAll" expression = "execution(* com.tutorialspoint.Student.getName(..))"/> <aop:before pointcut-ref = "selectAll" method = "beforeAdvice"/> </aop:aspect> </aop:config> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating source and configuration files, run your apppcation. Right-cpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Going to setup student profile. Name : Zara Age : 11
Spring AOP - XML Based After Advice
After is an advice type which ensures that an advice runs after the method execution. Following is the syntax of after advice.
Syntax
<aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "PointCut-id" expression = "execution( expression )"/> <aop:after pointcut-ref = "PointCut-id" method = "methodName"/> </aop:aspect> </aop:config>
Where,
PointCut-id − id of the PointCut.
methodName − Method name of the function to be called after a called function.
To understand the above-mentioned concepts related to After Advice, let us write an example which will implement After Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation.
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; pubpc class Logging { /** * This is the method which I would pke to execute * after a selected method execution. */ pubpc void afterAdvice(){ System.out.println("Student profile setup complete."); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "selectAll" expression = "execution(* com.tutorialspoint.Student.getAge(..))"/> <aop:after pointcut-ref = "selectAll" method = "afterAdvice"/> </aop:aspect> </aop:config> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating source and configuration files, run your apppcation. Right-cpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, this will print the following message.
Name : Zara Age : 11 Student profile setup complete.
Spring AOP - XML Based After Returning Advice
After is an advice type which ensures that an advice runs after the method execution only if the method completes successfully. Following is the syntax of after advice.
Syntax
<aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "PointCut-id" expression = "execution( expression )"/> <aop:after-returning pointcut-ref = "PointCut-id" returning = "retVal" method = "methodName"/> </aop:aspect> </aop:config>
Where,
PointCut-id − id of the PointCut.
methodName − Method name of the function to be called after a called function returns successfully.
To understand the above-mentioned concepts related to After Returning Advice, let us write an example which will implement After Returning advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation −
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; pubpc class Logging { /** * This is the method which I would pke to execute * when any method returns. */ pubpc void afterReturningAdvice(Object retVal){ System.out.println("Returning:" + retVal.toString() ); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); System.out.println("Exception raised"); throw new IllegalArgumentException(); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "selectAll" expression = "execution(* com.tutorialspoint.*.*(..))"/> <aop:after-returning pointcut-ref = "selectAll" method = "afterReturningAdvice" returning = "retVal"/> </aop:aspect> </aop:config> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Name : Zara Returning : Name Age : 11 Exception raised
Spring AOP - XML Based After Throwing Advice
After-throwing is an advice type which ensures that an advice runs after the method execution, only if the method exits by throwing an exception. Following is the syntax of after-throwing advice.
Syntax
<aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "PointCut-id" expression = "execution( expression )"/> <aop:after-throwing pointcut-ref = "PointCut-id" throwing = "ex" method = "methodName"/> </aop:aspect> </aop:config>
Where,
PointCut-id − id of the PointCut.
ex − Exception to be thrown.
methodName − Method name of the function to be called when a called function throws an exception and exits.
To understand the above-mentioned concepts related to After Throwing Advice, let us write an example which will implement After Throwing Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation −
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; pubpc class Logging { /** * This is the method which I would pke to execute * if there is an exception raised. */ pubpc void afterThrowingAdvice(IllegalArgumentException ex) { System.out.println("There has been an exception: " + ex.toString()); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.printThrowException(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "selectAll" expression = "execution(* com.tutorialspoint.*.*(..))"/> <aop:after-throwing pointcut-ref = "selectAll" throwing = "ex" method = "afterThrowingAdvice"/> </aop:aspect> </aop:config> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Exception raised There has been an exception: java.lang.IllegalArgumentException Exception in thread "main" java.lang.IllegalArgumentException at com.tutorialspoint.Student.printThrowException(Student.java:25) ...
Spring AOP - XML Based Around Advice
Around is an advice type which ensures that an advice runs before and after the method execution. Following is the syntax of around advice.
Syntax
<aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "PointCut-id" expression = "execution( expression )"/> <aop:around pointcut-ref = "PointCut-id" method = "methodName"/> </aop:aspect> </aop:config>
Where,
PointCut-id − id of the PointCut.
methodName − Method name of the function to be called before a called function.
To understand the above-mentioned concepts related to Around Advice, let us write an example which will implement Around Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation −
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.ProceedingJoinPoint; pubpc class Logging { /** * This is the method which I would pke to execute * around a selected method execution. */ pubpc String aroundAdvice(ProceedingJoinPoint jp) throws Throwable{ System.out.println("Around advice"); Object[] args = jp.getArgs(); if(args.length>0){ System.out.print("Arguments passed: " ); for (int i = 0; i < args.length; i++) { System.out.print("arg "+(i+1)+": "+args[i]); } } Object result = jp.proceed(args); System.out.println("Returning " + result); return result.toString(); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:config> <aop:aspect id = "log" ref = "logging"> <aop:pointcut id = "selectName" expression = "execution(* com.tutorialspoint.Student.getName(..))"/> <aop:around pointcut-ref = "selectName" method = "aroundAdvice"/> </aop:aspect> </aop:config> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Around advice Name : Zara Returning Zara
Spring AOP - Annotation Based Apppcation
Let us write an example which will implement advice using Annotation based configuration. For this, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation.
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @Aspect pubpc class Logging { /** Following is the definition for a Pointcut to select * all the methods available. So advice will be called * for all the methods. */ @Pointcut("execution(* com.tutorialspoint.*.*(..))") private void selectAll(){} /** * This is the method which I would pke to execute * before a selected method execution. */ @Before("selectAll()") pubpc void beforeAdvice(){ System.out.println("Going to setup student profile."); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy/> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Going to setup student profile. Name : Zara Going to setup student profile. Age : 11
Spring AOP - Annotation Based PointCut
JoinPoint
A JoinPoint represents a point in your apppcation where you can plug-in AOP aspect. You can also say, it is the actual place in the apppcation where an action will be taken using Spring AOP framework. Consider the following examples −
All methods classes contained in a package(s).
A particular methods of a class.
Pointcut
Pointcut is a set of one or more JoinPoint where an advice should be executed. You can specify Pointcuts using expressions or patterns as we will see in our AOP examples. In Spring, Pointcut helps to use specific JoinPoints to apply the advice. Consider the following examples −
@Pointcut("execution(* com.tutorialspoint.*.*(..))")
@Pointcut("execution(* com.tutorialspoint.Student.getName(..))")
Syntax
@Aspect pubpc class Logging { @Pointcut("execution(* com.tutorialspoint.*.*(..))") private void selectAll(){} }
Where,
@Aspect − Mark a class as a class containing advice methods.
@Pointcut − Mark a function as a Pointcut
execution( expression ) − Expression covering methods on which advice is to be appped.
To understand the above-mentioned concepts related to JoinPoint and PointCut, let us write an example which will implement few of the PointCuts. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation −
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Before; @Aspect pubpc class Logging { /** Following is the definition for a PointCut to select * all the methods available. So advice will be called * for all the methods. */ @Pointcut("execution(* com.tutorialspoint.*.*(..))") private void selectAll(){} /** * This is the method which I would pke to execute * before a selected method execution. */ @Before("selectAll()") pubpc void beforeAdvice(){ System.out.println("Going to setup student profile."); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy/> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Going to setup student profile. Name : Zara Going to setup student profile. Age : 11
The above-defined @Pointcut uses an expression to select all the methods defined under the package com.tutorialspoint. @Before advice uses the above-defined Pointcut as a parameter. Effectively beforeAdvice() method will be called before every method covered by above Pointcut.
Spring AOP - Annotation Based Before Advice
@Before is an advice type which ensures that an advice runs before the method execution. Following is the syntax of @Before advice.
Syntax
@Pointcut("execution(* com.tutorialspoint.Student.getName(..))") private void selectGetName(){} @Before("selectGetName()") pubpc void beforeAdvice(){ System.out.println("Going to setup student profile."); }
Where,
@Pointcut − Mark a function as a Pointcut
execution( expression ) − Expression covering methods on which advice is to be appped.
@Before − Mark a function as an advice to be executed before method(s) covered by Pointcut.
To understand the above-mentioned concepts related to @Before Advice, let us write an example which will implement @Before Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation −
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Before; @Aspect pubpc class Logging { /** Following is the definition for a Pointcut to select * all the methods available. So advice will be called * for all the methods. */ @Pointcut("execution(* com.tutorialspoint.Student.getName(..))") private void selectGetName(){} /** * This is the method which I would pke to execute * before a selected method execution. */ @Before("selectGetName()") pubpc void beforeAdvice(){ System.out.println("Going to setup student profile."); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy/> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Going to setup student profile. Name : Zara Age : 11
The above-defined @Pointcut uses an expression to select method getAge() defined in class(es) under the package com.tutorialspoint. @After advice uses the above-defined Pointcut as a parameter. Effectively afterAdvice() method will be called before every method covered by the above Pointcut.
Spring AOP - Annotation Based After Advice
@After is an advice type which ensures that an advice runs after the method execution. Following is the syntax of @After advice.
Syntax
@Pointcut("execution(* com.tutorialspoint.Student.getAge(..))") private void selectGetName(){} @After("selectGetAge()") pubpc void afterAdvice(){ System.out.println("Student profile setup completed."); }
Where,
@Pointcut − Mark a function as a Pointcut
execution( expression ) − Expression covering methods on which advice is to be appped.
@After − Mark a function as an advice to be executed before method(s) covered by Pointcut.
To understand the above-mentioned concepts related to @After Advice, let us write an example which will implement @After Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation.
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.After; @Aspect pubpc class Logging { /** Following is the definition for a Pointcut to select * all the methods available. So advice will be called * for all the methods. */ @Pointcut("execution(* com.tutorialspoint.Student.getAge(..))") private void selectGetAge(){} /** * This is the method which I would pke to execute * after a selected method execution. */ @After("selectGetAge()") pubpc void afterAdvice(){ System.out.println("Student profile setup completed."); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy/> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Name : Zara Age : 11 Student profile setup completed.
The above-defined @Pointcut uses an expression to select method getAge() defined in class(es) under the package com.tutorialspoint. @After advice uses the above-defined Pointcut as a parameter. Effectively afterAdvice() method will be called before every method covered by the above Pointcut.
Annotation Based After Returning Advice
@AfterReturning is an advice type, which ensures that an advice runs after the method executes successfully. Following is the syntax of @AfterReturning advice.
Syntax
@AfterReturning(Pointcut = "execution(* com.tutorialspoint.Student.*(..))", returning = "retVal") pubpc void afterReturningAdvice(JoinPoint jp, Object retVal){ System.out.println("Method Signature: " + jp.getSignature()); System.out.println("Returning:" + retVal.toString() ); }
Where,
@AfterReturning − Mark a function as an advice to be executed before method(s) covered by Pointcut, if the method returns successfully.
Pointcut − Provides an expression to select a function
execution( expression ) − Expression covering methods on which advice is to be appped.
returning − Name of the variable to be returned.
To understand the above-mentioned concepts related to @AfterReturning Advice, let us write an example, which will implement @AfterReturning Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation.
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; @Aspect pubpc class Logging { /** * This is the method which I would pke to execute * after a selected method execution. */ @AfterReturning(Pointcut = "execution(* com.tutorialspoint.Student.*(..))", returning = "retVal") pubpc void afterReturningAdvice(JoinPoint jp, Object retVal){ System.out.println("Method Signature: " + jp.getSignature()); System.out.println("Returning:" + retVal.toString() ); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy/> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Age : 11 Method Signature: Integer com.tutorialspoint.Student.getAge() Returning 11
Spring AOP - Annotation Based After Throwing Advice
@AfterThrowing is an advice type which ensures that an advice runs if the method throws an exception. Following is the syntax of @AfterThrowing advice.
Syntax
@AfterThrowing(Pointcut = "execution(* com.tutorialspoint.Student.*(..))", throwing = "error") pubpc void afterThrowingAdvice(JoinPoint jp, Throwable error){ System.out.println("Method Signature: " + jp.getSignature()); System.out.println("Exception: "+error); }
Where,
@AfterThrowing − Mark a function as an advice to be executed before method(s) covered by Pointcut, if the method throws an exception.
Pointcut − Provides an expression to select a function.
execution( expression ) − Expression covering methods on which advice is to be appped.
throwing − Name of the exception to be returned.
To understand the above-mentioned concepts related to @AfterThrowing Advice, let us write an example which will implement @AfterThrowing Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation.
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterThrowing; @Aspect pubpc class Logging { /** * This is the method which I would pke to execute * after a selected method execution throws exception. */ @AfterThrowing(Pointcut = "execution(* com.tutorialspoint.Student.*(..))", throwing = "error") pubpc void afterThrowingAdvice(JoinPoint jp, Throwable error){ System.out.println("Method Signature: " + jp.getSignature()); System.out.println("Exception: "+error); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.printThrowException(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy/> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Exception raised Method Signature: void com.tutorialspoint.Student.printThrowException() Exception: java.lang.IllegalArgumentException Exception in thread "main" java.lang.IllegalArgumentException at com.tutorialspoint.Student.printThrowException(Student.java:25) ...
Spring AOP - Annotation Based Around Advice
@Around is an advice type, which ensures that an advice can run before and after the method execution. Following is the syntax of @Around advice.
Syntax
@Pointcut("execution(* com.tutorialspoint.Student.getAge(..))") private void selectGetName(){} @Around("selectGetAge()") pubpc void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ System.out.println("Around advice"); Object[] args = jp.getArgs(); if(args.length>0){ System.out.print("Arguments passed: " ); for (int i = 0; i < args.length; i++) { System.out.print("arg "+(i+1)+": "+args[i]); } } Object result = jp.proceed(args); System.out.println("Returning " + result); return result.toString(); }
Where,
@Pointcut − Mark a function as a Pointcut
execution( expression ) − Expression covering methods on which advice is to be appped.
@Around − Mark a function as an advice to be executed before method(s) covered by Pointcut.
To understand the above-mentioned concepts related to @Around Advice, let us write an example which will implement @Around Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation −
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.ProceedingJoinPoint; @Aspect pubpc class Logging { /** Following is the definition for a Pointcut to select * all the methods available. So advice will be called * for all the methods. */ @Pointcut("execution(* com.tutorialspoint.Student.getAge(..))") private void selectGetAge(){} /** * This is the method which I would pke to execute * around a selected method execution. */ @Around("selectGetAge()") pubpc void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ System.out.println("Around advice"); Object[] args = proceedingJoinPoint.getArgs(); if(args.length>0){ System.out.print("Arguments passed: " ); for (int i = 0; i < args.length; i++) { System.out.print("arg "+(i+1)+": "+args[i]); } } Object result = proceedingJoinPoint.proceed(args); System.out.println("Returning " + result); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy/> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Around advice Age : 11 Returning 11
Spring AOP - Proxy
So far, we ve declared aspects using <aop:config> or < aop:aspectj-autoproxy>. We can create a proxy programmatically as well as invoke the aspects programmatically using the proxy object.
Syntax
//Create object to be proxied Student student = new Student(); //Create the Proxy Factory AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student); //Add Aspect class to the factory proxyFactory.addAspect(Logging.class); //Get the proxy object Student proxyStudent = proxyFactory.getProxy(); //Invoke the proxied method. proxyStudent.getAge();
Where,
AspectJProxyFactory − Factory class to create a proxy object.
Logging.class − Class of the Aspect containing advices.
Student − Business class to be advised.
To understand the above-mentioned concepts related to proxy, let us write an example which will implement proxy. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation −
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.PointCut; import org.aspectj.lang.annotation.Before; @Aspect pubpc class Logging { /** Following is the definition for a PointCut to select * all the methods available. So advice will be called * for all the methods. */ @PointCut("execution(* com.tutorialspoint.Student.getAge(..))") private void selectGetAge(){} /** * This is the method which I would pke to execute * before a selected method execution. */ @Before("selectGetAge()") pubpc void beforeAdvice(){ System.out.println("Going to setup student profile."); } }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; import org.springframework.aop.aspectj.annotation.AspectJProxyFactory; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); //Create the Proxy Factory AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student); //Add Aspect class to the factory proxyFactory.addAspect(Logging.class); //Get the proxy object Student proxyStudent = proxyFactory.getProxy(); //Invoke the proxied method. proxyStudent.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Going to setup student profile. Age : 11
Spring AOP - Custom Annotation
As per Pointcut expressions, it may be the case that they get appped to some other beans for which advice is not intended. For example, consider the following expression.
execution(* com.tutorialspoint.*.getAge(..))
A new spring bean is added with getAge() method and the advice will start getting appped to it although it may not be intended. To achieve this, we can create a custom annotation and annotate the methods on which the advice is to be appped.
@Before("@annotation(com.tutorialspoint.Loggable)")
To understand the above-mentioned concepts related to @Before Advice, let us write an example which will implement @Before Advice. To write our example with few advices, let us have a working Ecppse IDE in place and use the following steps to create a Spring apppcation.
Step | Description |
---|---|
1 | Update the project Student created under chapter | .
2 | Update the bean configuration and run the apppcation as explained below. |
Following is the content of Logging.java file. This is actually a sample of aspect module, which defines the methods to be called at various points.
package com.tutorialspoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect pubpc class Logging { /** * This is the method which I would pke to execute * before a selected method execution. */ @Before("@annotation(com.tutorialspoint.Loggable)") pubpc void beforeAdvice(){ System.out.println("Going to setup student profile."); } }
Following is the content of the Loggable.java file −
package com.tutorialspoint; pubpc @interface Loggable { }
Following is the content of the Student.java file.
package com.tutorialspoint; pubpc class Student { private Integer age; private String name; pubpc void setAge(Integer age) { this.age = age; } pubpc Integer getAge() { System.out.println("Age : " + age ); return age; } pubpc void setName(String name) { this.name = name; } @Loggable pubpc String getName() { System.out.println("Name : " + name ); return name; } pubpc void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } }
Following is the content of the MainApp.java file.
package com.tutorialspoint; import org.springframework.context.ApppcationContext; import org.springframework.context.support.ClassPathXmlApppcationContext; pubpc class MainApp { pubpc static void main(String[] args) { ApppcationContext context = new ClassPathXmlApppcationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); } }
Following is the configuration file Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:aspectj-autoproxy/> <!-- Definition for student bean --> <bean id = "student" class = "com.tutorialspoint.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.tutorialspoint.Logging"/> </beans>
Run Project
Once you are done creating the source and configuration files, run your apppcation. Rightcpck on MainApp.java in your apppcation and use run as Java Apppcation command. If everything is fine with your apppcation, it will print the following message.
Going to setup student profile. Name : Zara Age : 11Advertisements