This document provides an overview of Spring AOP and Aspect-Oriented Programming (AOP). It discusses basic AOP concepts like joinpoints, pointcuts, advice, and aspects. It also covers how to get started with Spring AOP, including using @Aspect annotations and pointcut expressions to define aspects and apply advice. The document includes examples of logging and transaction management aspects. It concludes with information on AOP technologies like Spring AOP and AspectJ and links to additional resources.
5. 5 | GEEK ACADEMY 2013
Intro to AOP
• Why worrying about Crosscutting Concerns?
• What AOP Does?
• Crosscutting Concerns
• Example
6. 6 | GEEK ACADEMY 2013
Why worrying about Crosscutting Concerns?
public void withdraw(long accId, int amount) {
Account account = (Account)session.get(Account.class, accId);
double balance = account.getBalance();
balance = balance - amount;
account.setBalance(balance);
session.save(balance);
}
Business
7. 7 | GEEK ACADEMY 2013
Why worrying about Crosscutting Concerns?
public void withdraw(long accId, int amount) {
if (hasPermission(accId)) {
Account account = (Account)session.get(Account.class, accId);
double balance = account.getBalance();
balance = balance - amount;
account.setBalance(balance);
session.save(balance);
} else {
throw new SecurityException("Access Denied");
}
}
Business
Permission
8. 8 | GEEK ACADEMY 2013
Why worrying about Crosscutting Concerns?
public void withdraw(long accId, int amount) {
if (hasPermission(accId)) {
bankLogger.info(accId + " withdrow amount " + amount);
Account account = (Account)session.get(Account.class, accId);
double balance = account.getBalance();
balance = balance - amount;
account.setBalance(balance);
session.save(balance);
} else {
throw new SecurityException("Access Denied");
}
}
Business
Permission
Logger
9. 9 | GEEK ACADEMY 2013
Why worrying about Crosscutting Concerns?
public void withdraw(long accId, int amount) {
if (hasPermission(accId)) {
bankLogger.info(accId + " withdrow amount " + amount);
Transaction tx = null;
try {
Transaction tx = session.beginTransaction();
Account account = (Account)session.get(Account.class, accId);
double balance = account.getBalance();
balance = balance - amount;
account.setBalance(balance);
session.save(balance);
tx.commit();
} catch(RuntimeException ex) {
if (tx!=null) tx.rollback;
}
} else {
throw new SecurityException("Access Denied");
}
}
Business
Permission
Logger
Transaction
10. 10 | GEEK ACADEMY 2013
Why worrying about Crosscutting Concerns?
Business
Permission
Logger
Transaction
Service A
Service B
Service C
11. 11 | GEEK ACADEMY 2013
Why worrying about Crosscutting Concerns?
• Too many relationship to the crosscutting objects
• Code is still required in all methods
• Cannot all be changed at one
12. 12 | GEEK ACADEMY 2013
What AOP Does?
• AOP will separate the Crosscutting concerns from the
System
16. 16 | GEEK ACADEMY 2013
Basic AOP Concepts
• What is AOP?
• AOP Terminology
• Advice
• How Spring AOP Works
• AOP and OOP
• Leading AOP Technologies
17. 17 | GEEK ACADEMY 2013
What is AOP?
• is a programming paradigm
• extends OOP
• enables modularization of crosscutting concerns
• is second heart of
Spring Framework
19. 19 | GEEK ACADEMY 2013
AOP Terminology
• Joinpoint – Defines A Point During the Execution of a
program. We can insert Additional logics at Joinpoints
• Advice – Action taken(Functionality) at a Joinpoint.
• Pointcut – Combination of Joinpoints where the Advice
need to be Applied.
20. 20 | GEEK ACADEMY 2013
AOP Terminology
• Aspect – a modularization of a Crosscutting concern.
• Target object - object being advised by one or more aspects.
• AOP proxy – Will manage the way of Applying Aspects at
particular Pointcuts.
PointCut
Advice
PointCut
Advice
PointCut
Advice
Aspect
Target Object
Proxy
Call
21. 21 | GEEK ACADEMY 2013
AOP Weaving
• Process of applying aspects to a target object
• Will create a proxied object
22. 22 | GEEK ACADEMY 2013
How AOP Works
• Write your mainline application logic (Solve core problem)
• Write aspects to implement cross-cutting concerns (Write aspects)
• Bind it all together (Weave at runtime)
23. 23 | GEEK ACADEMY 2013
AOP and OOP
• Aspect – code unit that encapsulates
pointcuts, advice, and attributes
• Pointcut – define the set of entry points
(triggers) in which advice is executed
• Advice – implementation of cross
cutting concern
• Weaver – construct code (source or
object) with advice
• Class – code unit that encapsulates
methods and attributes
• Method signature – define the entry
points for the execution of method bodies
• Method bodies – implementation of the
business logic concerns
• Compiler – convert source code to object
code
AOP OOP
24. 24 | GEEK ACADEMY 2013
Leading AOP Technologies
• AspectJ
– 1995, original AOP technology
– Offers a full Aspect Oriented Programming language
– Modifies byte code to add aspects into your application!
• Spring AOP
– Uses dynamic proxies to add aspects into your application
– Only spring beans can be advised
– Uses some of AspectJ expression syntax
26. 26 | GEEK ACADEMY 2013
Getting Started with Spring AOP
• Spring AOP
• Aspect
• Pointcut
• Advice
• Bean in Spring container
• How it really works
• Additional
• Spring AOP vs AspectJ
• @AspectJ vs XML
27. 27 | GEEK ACADEMY 2013
Spring AOP
• Implemented in pure java
• No need for a special compilation process
• Supports only method execution join points
• Only runtime weaving is available
• AOP proxy
– JDK dynamic proxy
– CGLIB proxy
• Configuration
– @AspectJ annotation-style
– Spring XML configuration-style
28. 28 | GEEK ACADEMY 2013
@Aspect
@Aspect
public class LoggingAspect {
...
}
<aop:aspectj-autoproxy />
<bean class="mypackage.LoggingAspect" />
30. 30 | GEEK ACADEMY 2013
Pointcut
• @Pointcut
• Pointcut expression
• Pointcut designators
• Example
31. 31 | GEEK ACADEMY 2013
@Pointcut
@Aspect
public class LoggingAspect {
@Pointcut("execution(* mypackage.service..*.*(..))")
public void ifService() {}
@Pointcut("execution(* mypackage.repository..*.*(..))")
public void ifRepository() {}
...
}
32. 32 | GEEK ACADEMY 2013
Pointcut expression
• PCD - Pointcut designators.
• method scope
– Advice will be applied to all the methods having this scope.
For e.g., public, private, etc. Spring AOP only supports
advising public methods.
• return type
– Advice will be applied to all the methods having this return
type.
PCD(<method scope> <return type> <declaring type>.<name(param)> <throw>)
33. 33 | GEEK ACADEMY 2013
Pointcut expression(2)
• declaring type
– Advice will be applied to all the methods of this type. If the class
and advice are in the same package then package name is not
required
• name(param)
– Filter the method names and the argument types.
Two dots(..) means any number(0-more) and type of parameters.
• throw
PCD(<method scope> <return type> <declaring type>.<name(param)> <throw>)
34. 34 | GEEK ACADEMY 2013
Pointcut designators
• Code based
– execution (Method Patterns)
• the primary pointcut designator you will use when working with Spring AOP
– within (Type Patterns)
• within certain types (simply the execution of a method declared within a
matching type when using Spring AOP)
– target
• where the target object (application object being proxied) is an instance of
the given type
35. 35 | GEEK ACADEMY 2013
Pointcut designators(2)
• Code based(2)
– this
• where the bean reference (Spring AOP proxy) is an instance of the given
type
– args
• where the arguments are instances of the given types
– bean (Bean Name Patterns)
• to a particular named Spring bean, or to a set of named Spring beans (when
using wildcards)
36. 36 | GEEK ACADEMY 2013
Pointcut designators(3)
• Annotation based
– @annotation
• where the subject of the join point (method being executed in Spring AOP)
has the given annotation
– @within
• within types that have the given annotation (the execution of methods
declared in types with the given annotation when using Spring AOP)
37. 37 | GEEK ACADEMY 2013
Pointcut designators(4)
• Annotation based(2)
– @target
• where the class of the executing object has an annotation of the given type
– @args
• where the runtime type of the actual arguments passed have annotations of
the given type(s)
38. 38 | GEEK ACADEMY 2013
Pointcut example
• the execution of any public method:
execution(public * *(..))
• the execution of any method with a name beginning with “set”:
execution(* set*(..))
• the execution of any method defined by the MyService interface
execution(* com.xyz.service.MyService.*(..))
• the execution of any method defined in the service package:
execution(* com.xyz.service.*.*(..))
• the execution of any method defined in the service package or a
sub-package:
execution(* com.xyz.service..*.*(..))
39. 39 | GEEK ACADEMY 2013
Pointcut example(2)
• any join point (method execution only in Spring AOP) WITHIN the
service package:
within(com.xyz.service.*)
• any join point (method execution only in Spring AOP) within the
service package or a sub-package:
within(com.xyz.service..*)
• any join point (method execution only in Spring AOP) where the
proxy implements the AccountService interface:
this(com.xyz.service.AccountService)
40. 40 | GEEK ACADEMY 2013
Pointcut example(3)
• Other example
– Pointcut example - Spring Framework Reference
43. 43 | GEEK ACADEMY 2013
Advice
• Action teken at particular Joinpoint is called as an Advice
• Defines What needs to be Applied and When
– What – Functionality
– When – Advice Type
44. 44 | GEEK ACADEMY 2013
Advice types
• Before
• After
• After Returning
• After Throwing
• Around
Method
Return Throw
Success call
Call
45. 45 | GEEK ACADEMY 2013
@Before
@Aspect
public class LoggingAspect {
@Pointcut("execution(* *(..))")
public void ifService() {}
@Before("ifService()")
public void logBefore(JoinPoint joinPoint) {
...
}
...
}
46. 46 | GEEK ACADEMY 2013
@After
@Aspect
public class LoggingAspect {
@Pointcut("execution(* *(..))")
public void ifService() {}
@After("ifService()")
public void logAfter(JoinPoint joinPoint) {
...
}
...
}
47. 47 | GEEK ACADEMY 2013
@AfterReturning
@Aspect
public class LoggingAspect {
@Pointcut("execution(* *(..))")
public void ifService() {}
@AfterReturning(pointcut = "ifService()", returning = "result")
public void logAfterReturning(JoinPoint joinPoint, Object result) {
...
}
...
}
48. 48 | GEEK ACADEMY 2013
@AfterThrowing
@Aspect
public class LoggingAspect {
@Pointcut("execution(* *(..))")
public void ifService() {}
@AfterThrowing(pointcut = "ifService()", throwing = "error")
public void logAfterThrowing(JoinPoint joinPoint, Throwable error) {
...
}
...
}
49. 49 | GEEK ACADEMY 2013
@Around
@Aspect
public class LoggingAspect {
@Pointcut("execution(* *(..))")
public void ifService() {}
@Around("ifService()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
...
Object result = joinPoint.proceed();
...
return result;
}
...
}
50. 50 | GEEK ACADEMY 2013
Security
Bean in Spring container
Logging
Caching
Target
Object
51. 51 | GEEK ACADEMY 2013
How it really works (TX example)