Spring Framework - AOP

analizator 8,716 views 44 slides Aug 03, 2011
Slide 1
Slide 1 of 44
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44

About This Presentation

Aspect oriented programming with Spring Framework.
AspectJ support.


Slide Content

SPRING FRAMEWORK 3.0
Aspect Oriented Programming with Spring Dmitry Noskov
Spring Framework - AOP

Aspect Oriented Programming
Dmitry Noskov Spring Framework - AOP

What is AOP?
Dmitry Noskov Spring Framework - AOP
is a programming paradigm
extends OOP
enables modularization of crosscutting concerns
is second heart of Spring Framework

A simple service method
Dmitry Noskov Spring Framework - AOP




public Order getOrder(BigDecimal orderId) {
return (Order) factory.openSession()
.get(Order.class, orderId);
}

Add permissions check
Dmitry Noskov Spring Framework - AOP



public Order getOrder(BigDecimal orderId) {
if (hasOrderPermission(orderId)) {
return (Order) factory.openSession()
.get(Order.class, orderId);
} else {
throw new SecurityException("Access Denied");
}
}

Add transaction management
Dmitry Noskov Spring Framework - AOP

public Order getOrder(BigDecimal orderId) {
if (hasOrderPermission(orderId)) {
Order order;
Session session = factory.openSession();
Transaction tx = session.beginTransaction ();

try {
order = (Order) session.get(Order.class, orderId);
tx.commit();
} catch (RuntimeException e) {if (tx!=null) {tx.rollback();}
} finally {session.close();}

return order;
} else { throw new SecurityException("Access Denied");}
}

Add cache
Dmitry Noskov Spring Framework - AOP

public Order getOrder(BigDecimal orderId) {
if (hasOrderPermission(orderId)) {
Order order = (Order)cache.get(orderId);
if (order==null) {
Session session = factory.openSession();
Transaction tx = session.beginTransaction ();

try {
order = (Order) session.get(Order.class, orderId);
tx.commit();
cache.put(orderId, order);
} catch (RuntimeException e) {if (tx!=null) {tx.rollback();}
} finally {session.close();}
}

return order;
} else { throw new SecurityException("Access Denied");}
}

A similar problem at enterprise level
Dmitry Noskov Spring Framework - AOP

What does AOP solve?
Dmitry Noskov Spring Framework - AOP
Logging
Validation
Caching
Security
Transactions
Monitoring
Error Handling
Etc…

AOP concepts
Dmitry Noskov Spring Framework - AOP
aspect
advice
pointcut
join point

AOP and OOP
1.Aspect – code unit that
encapsulates pointcuts, advice,
and attributes
2.Pointcut – define the set of
entry points (triggers) in which
advice is executed
3.Advice – implementation of
cross cutting concern
4.Weaver – construct code
(source or object) with advice
1.Class – code unit that
encapsulates methods and
attributes
2.Method signature – define the
entry points for the execution of
method bodies
3.Method bodies –implementation
of the business logic concerns
4.Compiler – convert source code
to object code
Dmitry Noskov Spring Framework - AOP
AOP OOP

AOP concepts(2)
Dmitry Noskov Spring Framework - AOP
introduction
target object
AOP proxy
weaving
compile time
load time
runtime

Spring AOP
Dmitry Noskov Spring Framework - 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

@AspectJ
Dmitry Noskov Spring Framework - AOP

Declaring aspect
Dmitry Noskov Spring Framework - AOP

@Aspect
public class EmptyAspect {
}

<!--<context:annotation-config />-->
<aop:aspectj-autoproxy proxy-target-class="false | true"/>

<bean
class="org.springframework.aop.aspectj.annotation .AnnotationAwareAspectJAutoProxyCreator ">
</bean>

<bean class="example.EmptyAspect"/>

Declaring pointcut
Dmitry Noskov Spring Framework - AOP

Pointcut designators
Dmitry Noskov Spring Framework - AOP
code based
execution
within
target
this
args
bean

Pointcut designators(2)
Dmitry Noskov Spring Framework - AOP
annotation based
@annotation
@within
@target
@args

Format of an execution expression
Dmitry Noskov Spring Framework - AOP
execution(
modifiers-pattern
returning-type-pattern
declaring-type-pattern
name-pattern(param-pattern)
throws-pattern
)

Simple pointcut expressions
Dmitry Noskov Spring Framework - AOP
@Aspect
public class ItemStatusTracker {

@Pointcut("execution(* approve(..))")
public void ifApprove() {}

@Pointcut("execution(* reject(..))")
public void ifReject() {}

@Pointcut("ifApprove() || ifReject()")
public void ifStateChange() {}
}

Execution examples
Dmitry Noskov Spring Framework - AOP
any public method
execution(public * * (..))"
any method with a name beginning with "get"
execution(* get*(..))
any method defined by the appropriate interface
execution(* bank.BankService.*(..))
any method defined in the appropriate package
execution(* com.epam.pmc.service .*.*(..))
other examples
http://static.springsource.org/spring/docs/3.0.x/spring-framework-
reference/html/aop.html#aop-pointcuts-examples

Declaring advice
Dmitry Noskov Spring Framework - AOP

Advice
Dmitry Noskov Spring Framework - AOP
associated with a pointcut expression
a simple reference to a named pointcut
a pointcut expression declared in place
runs
before
after returning
after throwing
after (finally)
around

Before advice
Dmitry Noskov Spring Framework - AOP

@Aspect
public class BankAspect {

@Pointcut("execution(public * * (..))")
public void anyPublicMethod() {}

@Before("anyPublicMethod()")
public void logBefore(JoinPoint joinPoint) {
//to do something
}
}

After returning advice
Dmitry Noskov Spring Framework - AOP

@Aspect
public class BankAspect {

@AfterReturning(
pointcut="execution(* get*(..))",
returning="retVal")
public void logAfter(JoinPoint joinPoint, Object retVal) {
//to do something
}
}

After throwing advice
Dmitry Noskov Spring Framework - AOP

@Aspect
public class BankAspect {

@AfterThrowing(
pointcut = "execution(* bank..*ServiceImpl.add*(..))",
throwing = "exception")
public void afterThrowing(Exception exception) {
//to do something
}
}

After finally advice
Dmitry Noskov Spring Framework - AOP

@Aspect
public class BankAspect {

@Pointcut("execution(public * * (..))")
public void anyPublicMethod() {}

@After(value="anyPublicMethod() && args(from, to)")
public void logAfter(JoinPoint jp, String from, String to) {
//to do something
}
}

Around advice
Dmitry Noskov Spring Framework - AOP

@Aspect
public class BankCacheAspect {

@Around("@annotation(bank.Cached)")
public Object aroundCache(ProceedingJoinPoint joinPoint){
//to do something before
Object retVal = joinPoint.proceed();
//to do something after
}
}

Aspect and advice ordering
Dmitry Noskov Spring Framework - AOP
order of advice in the same aspect
before
around
after finally
after returning or after throwing
Spring interface for ordering aspects
org.springframework.core.Ordered
Spring annotation
org.springframework.core.annotation.Order

XML based AOP
Dmitry Noskov Spring Framework - AOP

Declaring an aspect
Dmitry Noskov Spring Framework - AOP
<?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="…">

<aop:config>
<aop:aspect id="bankAspectId" ref="bankAspect">
<aop:pointcut id="anyPublicMethod"
expression="execution(public * * (..))"/>

<aop:before pointcut-ref="anyPublicMethod" method="logBefore"/>
</aop:aspect>
</aop:config>

<bean id="bankAspect" class="bank.BankAspect"/>
</beans>

How it all works
Dmitry Noskov Spring Framework - AOP

Bean in Spring container
Dmitry Noskov Spring Framework - AOP
Standard OOP implementation Implementation with AOP

AOP proxies
Dmitry Noskov Spring Framework - AOP
Invoke directly Invoke via proxy

How it really works
Dmitry Noskov Spring Framework - AOP

Introductions
Dmitry Noskov Spring Framework - AOP

Introduction behaviors to bean
Dmitry Noskov Spring Framework - AOP

@Aspect
public class CalculatorIntroduction {

@DeclareParents(
value = "calculator.ArithmeticCalculatorImpl ",
defaultImpl = MaxCalculatorImpl.class)
public MaxCalculator maxCalculator;

@DeclareParents(
value = "calculator.ArithmeticCalculatorImpl ",
defaultImpl = MinCalculatorImpl.class)
public MinCalculator minCalculator;
}

Introduction states to bean
Dmitry Noskov Spring Framework - AOP

@Aspect
public class BankServiceIntroductionAspect {
@DeclareParents(
value="bank.BankServiceImpl ",
defaultImpl=DefaultCounterImpl.class)
public Counter mix;

@Before("execution(* get*(..)) && this(auditable )")
public void useBusinessService(Counter auditable) {
auditable.increment();
}
}

Spring AOP vs AspectJ
no need for a special
compilation process
support only method
execution pointcuts
advise the execution
of operations on
Spring beans



need AspectJ compiler
or setup LTW
support all pointcuts

advice all domain
objects
Dmitry Noskov Spring Framework - AOP
Spring AOP AspectJ

@AspectJ vs XML
has more opportunities,
such as combine named
pointcuts
encapsulate the
implementation of the
requirement it addresses
in a single place
can be used with any
JDK level

good choice to
configure enterprise
services
Dmitry Noskov Spring Framework - AOP
@AspectJ XML

Links
Dmitry Noskov Spring Framework - AOP
Useful links
Wiki: Aspect-oriented programming
http://en.wikipedia.org/wiki/Aspect-oriented_programming
Spring Reference
http://static.springsource.org/spring/docs/3.0.x/spring-
framework-reference/html/aop.html
AspectJ home site
http://www.eclipse.org/aspectj/

Books
Dmitry Noskov Spring Framework - AOP

Questions
Dmitry Noskov Spring Framework - AOP

The end
http://www.linkedin.com/in/noskovd
http://www.slideshare.net/analizator/presentations