public aspect AutoLog
{
pointcut publicMethods() : execution( public * org.apache.cactus..*(..));
pointcut logObjectCalls() : execution(* Logger.*(..));
pointcut loggableCalls() : publicMethods() && ! logObjectCalls();
before() : loggableCalls()
{
Logger.entry(thisJoinPoint.getSignature().toString());
}
after() : loggableCalls()
{
Logger.exit(thisJoinPoint.getSignature().toString());
}
}
{
pointcut publicMethods() : execution( public * org.apache.cactus..*(..));
pointcut logObjectCalls() : execution(* Logger.*(..));
pointcut loggableCalls() : publicMethods() && ! logObjectCalls();
before() : loggableCalls()
{
Logger.entry(thisJoinPoint.getSignature().toString());
}
after() : loggableCalls()
{
Logger.exit(thisJoinPoint.getSignature().toString());
}
}
AspectJ语言:
before() : loggableCalls()
{
Logger.entry(thisJoinPoint.getSignature().toString());
}
{
Logger.entry(thisJoinPoint.getSignature().toString());
}
AspectJ语言:
public aspect Timestamp
{
private long ValueObject.timestamp;
public long ValueObject.getTimestamp()
{
return timestamp;
}
public void ValueObject.timestamp()
{
this.timestamp = System.currentTimeMillis();
}
}
{
private long ValueObject.timestamp;
public long ValueObject.getTimestamp()
{
return timestamp;
}
public void ValueObject.timestamp()
{
this.timestamp = System.currentTimeMillis();
}
}
AspectJ语言:
public
interface
TimestampedObject
{
long getTimestamp();
void timestamp();
}
public aspect Timestamp
{
private long TimestampedObject.timestamp;
public long TimestampedObject.getTimestamp()
{
return timestamp;
}
public void TimestampedObject.timestamp()
{
this.timestamp = System.currentTimeMillis();
}
}
{
long getTimestamp();
void timestamp();
}
public aspect Timestamp
{
private long TimestampedObject.timestamp;
public long TimestampedObject.getTimestamp()
{
return timestamp;
}
public void TimestampedObject.timestamp()
{
this.timestamp = System.currentTimeMillis();
}
}
AspectJ语言:
declare parents: ValueObject || BigValueObject
implements TimestampedObject;
Java语言:
public
interface
Interceptor
{
public String getName();
public InvocationResponse invoke(Invocation invocation) throws Throwable;
}
{
public String getName();
public InvocationResponse invoke(Invocation invocation) throws Throwable;
}
Java语言:
import org.jboss.aop.*;
import java.lang.reflect.*;
public class TracingInterceptor implements Interceptor
{
public String getName()
{
return TracingInterceptor;
}
public InvocationResponse invoke(Invocation invocation) throws Throwable
{
String message = null;
if (invocation.getType() == InvocationType.METHOD)
{
Method method = MethodInvocation.getMethod(invocation);
message = method: + method.getName();
}
else
{
if (invocation.getType() == InvocationType.CONSTRUCTOR)
{
Constructor c = ConstructorInvocation.getConstructor(invocation);
message = constructor: + c.toString();
}
else
{
// 不对字段作处理,太繁琐;
return invocation.invokeNext();
}
System.out.println(Entering + message);
}
// 继续。调用真正的方法或者构造函数
InvocationResponse rsp = invocation.invokeNext();
System.out.println(Leaving + message);
return rsp;
}
}
import java.lang.reflect.*;
public class TracingInterceptor implements Interceptor
{
public String getName()
{
return TracingInterceptor;
}
public InvocationResponse invoke(Invocation invocation) throws Throwable
{
String message = null;
if (invocation.getType() == InvocationType.METHOD)
{
Method method = MethodInvocation.getMethod(invocation);
message = method: + method.getName();
}
else
{
if (invocation.getType() == InvocationType.CONSTRUCTOR)
{
Constructor c = ConstructorInvocation.getConstructor(invocation);
message = constructor: + c.toString();
}
else
{
// 不对字段作处理,太繁琐;
return invocation.invokeNext();
}
System.out.println(Entering + message);
}
// 继续。调用真正的方法或者构造函数
InvocationResponse rsp = invocation.invokeNext();
System.out.println(Leaving + message);
return rsp;
}
}
<?xml version="1.0" encoding="UTF-8">
<aop>
<interceptor-pointcut class= "BusinessObject">
<interceptors>
<interceptor class= "TracingInterceptor" />
</interceptors>
</interceptor-pointcut>
</aop>
<aop>
<interceptor-pointcut class= "BusinessObject">
<interceptors>
<interceptor class= "TracingInterceptor" />
</interceptors>
</interceptor-pointcut>
</aop>
<?xml version="1.0" encoding="UTF-8">
<aop>
<class-metadata group= "tracing" class= " BusinessObject ">
<method name= "(get.*)|(set.*)">
<filter>true</filter>
</method>
<method name= "main">
<filter>true</filter>
</method>
</class-metadata>
</aop>
<aop>
<class-metadata group= "tracing" class= " BusinessObject ">
<method name= "(get.*)|(set.*)">
<filter>true</filter>
</method>
<method name= "main">
<filter>true</filter>
</method>
</class-metadata>
</aop>
Java语言:
public
class
TracingInterceptor
implements Interceptor
{
//getName()方法略;
public InvocationResponse invoke(Invocation invocation) throws Throwable
{
String filter=(String)invocation.getMetaData(tracing, filter);
if (filter != null && filter.equals( true))
return invocation.invokeNext();
//后面的代码略;
}
}
{
//getName()方法略;
public InvocationResponse invoke(Invocation invocation) throws Throwable
{
String filter=(String)invocation.getMetaData(tracing, filter);
if (filter != null && filter.equals( true))
return invocation.invokeNext();
//后面的代码略;
}
}
Java语言:
public
interface
Tracing
{
void enableTracing();
void disableTracing();
}
{
void enableTracing();
void disableTracing();
}
Java语言:
import org.jboss.aop.Advised;
public class TracingMixin implements Tracing
{
Advised advised;
Public TracingMixin(Object obj)
{
this.advised = (Advised)obj;
}
public void enableTracing()
{
advised._getInstanceAdvisor().getMetaData().addMetaData( "tracing", "filter", true);
}
public void disableTracing()
{
advised._getInstanceAdvisor().getMetaData().addMetaData( "tracing", "filter", false);
}
}
public class TracingMixin implements Tracing
{
Advised advised;
Public TracingMixin(Object obj)
{
this.advised = (Advised)obj;
}
public void enableTracing()
{
advised._getInstanceAdvisor().getMetaData().addMetaData( "tracing", "filter", true);
}
public void disableTracing()
{
advised._getInstanceAdvisor().getMetaData().addMetaData( "tracing", "filter", false);
}
}
XML语言:
<?xml version="1.0" encoding="UTF-8">
<aop>
<introduction-pointcut class= "BusinessObject">
<mixin>
<interfaces>Tracing</interfaces>
<class>TracingMixin</class>
<construction>new TracingMixin(this)</construction>
</mixin>
</introduction-pointcut>
</aop>
<aop>
<introduction-pointcut class= "BusinessObject">
<mixin>
<interfaces>Tracing</interfaces>
<class>TracingMixin</class>
<construction>new TracingMixin(this)</construction>
</mixin>
</introduction-pointcut>
</aop>
Java语言:
public
class
BusinessObject
{
public BusinessObject () {}
public void helloWorld() { System.out.println(Hello World!); }
public static void main(String[] args)
{
BusinessObject bo = new BusinessObject ();
Tracing trace = (Tracing) this;
bo.helloWorld();
System.out.println( "Turn off tracing.");
trace.disableTracing();
bo.helloWorld();
System.out.println( "Turn on tracing.");
trace.enableTracing();
bo.helloWorld();
}
}
{
public BusinessObject () {}
public void helloWorld() { System.out.println(Hello World!); }
public static void main(String[] args)
{
BusinessObject bo = new BusinessObject ();
Tracing trace = (Tracing) this;
bo.helloWorld();
System.out.println( "Turn off tracing.");
trace.disableTracing();
bo.helloWorld();
System.out.println( "Turn on tracing.");
trace.enableTracing();
bo.helloWorld();
}
}
Tracing trace = (Tracing)
this;
Java语言:
public
interface
Pointcut
{
ClassFilter getClassFilter();
MethodMatcher getMethodMatcher();
}
{
ClassFilter getClassFilter();
MethodMatcher getMethodMatcher();
}
Java语言:
public
interface
ClassFilter
{
boolean matches(Class clazz);
}
{
boolean matches(Class clazz);
}
Java语言:
public
interface
MethodMatcher
{
boolean matches(Method m, Class targetClass);
boolean matches(Method m, Class targetClass, Object[] args);
boolean isRuntime();
}
{
boolean matches(Method m, Class targetClass);
boolean matches(Method m, Class targetClass, Object[] args);
boolean isRuntime();
}
XML语言:
<bean id=
"settersAndAbsquatulatePointcut"
class= "org.springframework.aop.support.RegexpMethodPointcut">
<property name= "patterns">
<list>
<value>.*get.*</value>
<value>.*absquatulate</value>
</list>
</property>
</bean>
class= "org.springframework.aop.support.RegexpMethodPointcut">
<property name= "patterns">
<list>
<value>.*get.*</value>
<value>.*absquatulate</value>
</list>
</property>
</bean>
XML语言:
<bean id=
"myPointcutAdvisor"class=
"org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name= "advice">
<ref local= "MyInterceptor" />
</property>
<property name= "patterns">
<list>
<value>.*save.*</value>
<value>.*do.*</value>
</list>
</property>
</bean>
<property name= "advice">
<ref local= "MyInterceptor" />
</property>
<property name= "patterns">
<list>
<value>.*save.*</value>
<value>.*do.*</value>
</list>
</property>
</bean>
Java语言:
public
interface
BusinessObject
{
public void save();
}
public class BusinessObjectImpl implements BusinessObject
{
public void save()
{
System.out.println( "saving domain object......");
}
}
{
public void save();
}
public class BusinessObjectImpl implements BusinessObject
{
public void save()
{
System.out.println( "saving domain object......");
}
}
Java语言:
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class LockInterceptor implements MethodInterceptor
{
public Object invoke(MethodInvocation invocation) throws Throwable
{
// TODO Auto-generated method stub
lock();
Object ret= invocation.proceed();
unlock();
return ret;
}
private void lock()
{
System.out.println( "lock domain object...");
}
private void unlock()
{
System.out.println( "unlock domain object...");
}
}
import org.aopalliance.intercept.MethodInvocation;
public class LockInterceptor implements MethodInterceptor
{
public Object invoke(MethodInvocation invocation) throws Throwable
{
// TODO Auto-generated method stub
lock();
Object ret= invocation.proceed();
unlock();
return ret;
}
private void lock()
{
System.out.println( "lock domain object...");
}
private void unlock()
{
System.out.println( "unlock domain object...");
}
}
XML语言:
<bean id=
"MyInterceptor" class=
"test.aop.spring.LockInterceptor"/>
XML语言:
<bean id=
"myAOPProxy" class=
"org.springframework.aop.framework.ProxyFactoryBean">
<property name= "proxyInterfaces">
<value>test.aop.spring.BusinessObject</value>
</property>
<property name= "target">
<ref local= "impl" />
</property>
<property name= "interceptorNames">
<value>myPointcutAdvisor</value>
</property>
</bean>
<bean id= "impl" class= "test.aop.spring.BusinessObjectImpl"/>
<property name= "proxyInterfaces">
<value>test.aop.spring.BusinessObject</value>
</property>
<property name= "target">
<ref local= "impl" />
</property>
<property name= "interceptorNames">
<value>myPointcutAdvisor</value>
</property>
</bean>
<bean id= "impl" class= "test.aop.spring.BusinessObjectImpl"/>
Java语言:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class App
{
private BusinessObject bo = null;
public static void main(String[] args)
{
ApplicationContext ctx= new FileSystemXmlApplicationContext( "Bean.xml");
bo= (BusinessObject) ctx.getBean( "myAOPProxy");
bo.save();
}
}
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class App
{
private BusinessObject bo = null;
public static void main(String[] args)
{
ApplicationContext ctx= new FileSystemXmlApplicationContext( "Bean.xml");
bo= (BusinessObject) ctx.getBean( "myAOPProxy");
bo.save();
}
}
Java语言:
public
interface
IntroductionInterceptor
extends MethodInterceptor
{
boolean implementsInterface(Class intf);
}
{
boolean implementsInterface(Class intf);
}
Java语言:
public
interface
InterceptionIntroductionAdvisor
extends InterceptionAdvisor
{
ClassFilter getClassFilter();
IntroductionInterceptor getIntroductionInterceptor();
Class[] getInterfaces();
}
{
ClassFilter getClassFilter();
IntroductionInterceptor getIntroductionInterceptor();
Class[] getInterfaces();
}
Java语言:
public
interface
Tracing
{
void enableTracing();
void disableTracing();
boolean enabled();
}
{
void enableTracing();
void disableTracing();
boolean enabled();
}
Java语言:
public
class
TracingMixin
extends DelegatingIntroductionInterceptor
implements Tracing
{
private boolean enabled;
public void enableTracing ()
{
this.enabled = true;
}
public void disableTracing ()
{
this. enabled = false;
}
public boolean enabled()
{
return this.enabled;
}
public Object invoke(MethodInvocation invocation) throws Throwable
{
return super.invoke(invocation);
}
}
{
private boolean enabled;
public void enableTracing ()
{
this.enabled = true;
}
public void disableTracing ()
{
this. enabled = false;
}
public boolean enabled()
{
return this.enabled;
}
public Object invoke(MethodInvocation invocation) throws Throwable
{
return super.invoke(invocation);
}
}
Java语言:
public
class
TracingMixinAdvisor
extends DefaultIntroductionAdvisor
{
public TracingMixinAdvisor() {
super( new TracingMixin(),Tracing.class);
}
}
{
public TracingMixinAdvisor() {
super( new TracingMixin(),Tracing.class);
}
}