1
Spring & AOP
Margus JägerLauri Tulmin
2
Sissejuhatus
• 3. peatükk raamatus Spring in Action• 4. peatükk raamatus Professional Java
Development with the Spring Framework• Spring• Spring AOP• Võrdlus AspectJ’ga
3
Spring
4
Spring
• Kergekaaluline (Lightweight)• Kontrolli ümberpööramine (Inversion of
control)• Aspektidele orienteeritud (Aspect-oriented)• Konteiner• Raamistik (Framework)
5
Hello World näide 1public interface IHello {
public void sayHello();}
public class Hello implements IHello {private IGreeting greeting;
public void setGreeting(IGreeting greeting) {this.greeting = greeting;
}
public void sayHello() {System.out.println(greeting.getGreeting());
}}
6
Hello World näide 2public interface IGreeting {
public String getGreeting(); }
public class Greeting implements IGreeting {private String greeting;
public String getGreeting() {return greeting;
}
public void setGreeting(String greeting) {this.greeting = greeting;
}}
7
Hello World näide 3<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans> <bean id="hello" class="Hello"> <property name="greeting"> <ref local="greeting" /> </property> </bean> <bean id="greeting" class="Greeting"> <property name="greeting"> <value>hello world</value> </property> </bean></beans>
8
Hello World näide 4public class Main {
public static void main(String[] args) {Resource res = new FileSystemResource("beans.xml");XmlBeanFactory factory = new XmlBeanFactory(res);IHello hello = (IHello)factory.getBean("hello");
hello.sayHello();}
}
9
Spring & AOP
10
Spring AOP
• Aspektid kirjutatakse javas• Ühendpunktideks on meetodid• Aspektide rakendamine programselt või
deklaratiivselt Springi konfiguratsioonifailis
11
AOP Alliance
• http://aopalliance.sourceforge.net/
• Kõik Springis kasutatavad juhised realiseerivad AOP Alliance’i spetsifitseeritud või neist päritud liideseid
12
Juhised
• Before• After returning• Around• Throws• Introduction
13
Around juhispublic interface MethodInterceptor extends Interceptor {
Object invoke(MethodInvocation invocation) throws Throwable;
}
14
public class PerformanceInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation method) throws Throwable {
long start = System.currentTimeMillis();try {
Object result = method.proceed();return result;
}finally {
long end = System.currentTimeMillis();long timeMs = end - start;System.out.println("Method: " + method.toString() +
" took: " + timeMs +"ms.");}
}}
15
Before juhispublic interface MethodBeforeAdvice extends BeforeAdvice { void before(Method m, Object[] args, Object target) throws
Throwable;}
16
public class CountingBeforeAdvice implements MethodBeforeAdvice {
private int count;
public void before(Method m, Object[] args, Object target) { ++count; } public int getCount() { return count; }}
Before juhise näide
17
After Returning juhispublic interface AfterReturningAdvice extends Advice { void afterReturning(Object returnValue, Method m, Object[] args, Object
target) throws Throwable;}
18
public class CountingAfterReturningAdvice implements AfterReturningAdvice {
private int count;
public void afterReturning(Object returnValue, Method m, Object[] args, Object target) { ++count; } public int getCount() { return count; }}
After Returning juhise näide
19
Throws juhis
org.springframework.aop.ThrowsAdvice
afterThrowing([Method, args, target,] Throwable)
20
public static class ServletThrowsAdviceWithArguments implements ThrowsAdvice { public void afterThrowing
(Method m, Object[] args, Object target,ServletException ex) {
// Do something with all arguments } public void afterThrowing(RemoteException ex) throws Throwable { // Do something with remote exception }}
Throws juhise näide
21
Lõikepunktid
• Ühendpunktid (JoinPoints) on Springis alati meetodid
• Lõikepunktid (Pointcuts) defineerivad, millistele meetoditele juhiseid rakendatakse
22
Lõikepunktid Springis
• org.springframework.aop.support.NameMatchMethodPointcut
• org.springframework.aop.support.DynamicMethodMatcherPointcut
• org.springframework.aop.StaticMethodMatcherPointcut
• org.springframework.aop.support.JdkRegexpMethodPointcut
• org.springframework.aop.support.Perl5RegexpMethodPointcut
• org.springframework.aop.support.ControlFlowPointcut
• org.springframework.aop.support.ComposablePointcut
23
NameMatchMethodPointcut klass
• NameMatchMethodPointcut addMethodName(String methodName)
• void setMappedName(String methodName) • void setMappedNames(String methodName)
24
NameMatchMethodPointcuti kasutamise näide Javas
Pointcut pc = new NameMatchMethodPointcut().addMethodName("setAge").addMethodName("setName");
25
Regulaaravaldistega lõikepunktid<bean id="settersAndAbsquatulatePointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"> <property name="patterns"> <list> <value>.*get.*</value> <value>.*absquatulate</value> </list> </property></bean>
26
Staatiline (ei sõltu argumentidest)public class MyBeanPointcut extends StaticMethodMatcherPointcut {
public boolean matches(Method theMethod, Class theClass) {
return (MyBean.class.isAssignableFrom(theClass) && theMethod.equals(...));
}
}
27
Dünaamiline (arvestab argumente)public class MyBeanPointcut extends DynamicMethodMatcherPointcut {
public boolean matches(Method theMethod, Class theClass, Object[] arguments) {
boolean matches = false;
if (MyBean.class.isAssignableFrom(theClass) && theMethod.equals(...)) {
if (arguments[0].equals("Joe Smith")) { matches = true; }
}return matches;
}}
28
ControlFlowPointcut
<bean id="servletPointcut"class="org.springframework.aop.support.ControlFlowPointcut">
<constructor-arg><value>javax.servlet.http.HttpServlet</value>
</constructor-arg>
</bean>
29
Tehted lõikepunktidega
public static Pointcut union(Pointcut a, Pointcut b)
kas a või b
public static Pointcut intersection(Pointcut a, Pointcut b)
nii a kui b
30
Juhtpunktid - Advisors
• (pakkuge hea tõlge)• Ühendavad Springis lõikepunktid ja
juhised aspektiks• Võivad sisaldada lõikepunktide
defineerimiseks vajalikke meetodeid (pole vaja lõikepunktide jaoks eraldi klasse defineerida)
31
DefaultPointcutAdvisorpublic class DefaultPointcutAdvisor {
private Pointcut pointcut;
private Advice advice;
public Pointcut getPointcut() { return pointcut; }
public Advice getAdvice() { return advice; }
public void setPointcut(Pointcut pc) { pointcut = pc; }
public void setAdvice(Advice a) { advice = a; }
}
32
DefaultPointcutAdvisor (2)
<bean name ="myAdvisor“ class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="pointcut">
<ref local="myPointcut"/> </property> <property name="advice">
<ref local="myAdvice"/> </property></bean>
33
NameMatchMethodPointcutAdvisor
<bean name="advisor1" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <property name="advice" ref="beforeAdviceA"/> <property name="mappedName" value=“myMethod"/></bean>
34
RegexpMethodPointcutAdvisor<bean id=“advisor2" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice">
<ref local="myAdvice"/> </property>
<property name="patterns"> <list> <value>.*set.*</value> <value>.*getName</value> </list> </property></bean>
35
AOP realiseerimine
• Kompileerimisel (AspectJ)• Klassi laadimisel• Programmi käimisel (Spring)
36
Staatiline vs dünaamiline• Statiline AOP- Kompileerimisel põimitakse aspektid java
klassidesse- AspectJ• Dünaamiline AOP- Aspektid põimitakse programmi töö ajal- Klasse pole vaja uuesti kompileerida- Aspektide jaoks vahendaja (proxy)- Spring
37
Vahendajad (Proxy)
• JDK Dynamic Proxy- Rakendatav objektidele, mille klassid
realiseerivad liideseid• CGLIB Proxy- Lennult genereeritakse antud klassi
laiendav klass
38
ProxyFactoryBean
• Loob vahendaja-objeti, millele rakendatakse aspekte
• Saab siduda objektiga nii juhiseid (advice) kui juhtpunkte (advisor)
39
<bean id="myDependency1"class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"><ref local="myDependencyTarget"/>
</property><property name="interceptorNames">
<list><value>myAdvice</value><value>myAdvisor</value>
</list></property>
</bean>
40
Automaatsed vahendajad
• BeanNameAutoProxyCreator• DefaultAdvisorAutoProxyCreator
41
<bean id="proxyCreator"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames"><list>
<value>foo*</value><value>barBean</value>
</list></property>
<property name="interceptorNames"><list>
<value>advice</value></list>
</property></bean>
42
DefaultAdvisorAutoProxyCreator
• Juhtpunkte rakendatakse kõikidele objektidele
<bean id="aapc" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/ >
43
Spring AOP vs AspectJ
44
Spring ja AspectJ võrdlus
Spring AOP• Lihtne seadistada• Käimise ajal• AOP Alliance’i
liidesed• Vähem võimalusi
AspectJ• Väheke keerulisem• Kompileerimisel• Eraldi
programmeerimiskeel• Rohkem võimalusi
45
Süntaks- Spring AOP (AOP Alliance)public class SimpleMethodInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation)throws Throwable {...return invocation.proceed();
}}- AspectJpublic aspect SimpleServiceAroundAspect {
pointcut serviceExecution():execution(public * ee.bus.*Service.*(..));
Object around(): serviceExecution() {...return proceed();
}}
46
Spring AOP piirangud
• Ühenduspunktideks ainult meetodid• Ilma CgLibita aspektid ainult liideste
meetoditel• private, final, static meetoditele ei saa
aspekte panna• Aspektid rakendatakse ainult konteineri
poolt loodud objektidele
47
Valmis aspektid
• Transaktsioonid• Puulimine• ACEGI security
48
Jõudlus
49
Spring AOP ja AspectJ jõudlus
autor: Rein Raudjärv
1 2 3 4 5
410 470 530 590 650
411
27 40 52
24 6 8 10
1
10
100
1000
Invocation Time [ms]
Number of Aspects
1 Million Method Invocations (Adding Numbers)
AspectJ (Before/After) AspcetJ (Around) Spring AOP
50
Küsimused
Top Related