Mixins and interceptors often need a reference to their surrounding proxy. The framework will provide this reference at creation time if the mixin or interceptor implements the ProxyAware interface. One example is the subject/observer design pattern. A subject mixin should pass a proxy reference to the observers rather than a "this" reference.
The world is not always perfect. Due to incosistencies in method semantics, a crosscutting concern may not lend itself to being cleanly abstracted into a single interceptor. In some situations, you want to intercept methods with a specific signature. DispatchInterceptor makes this easy. Say for example that we only want to intercept setId() methods:
Example 5.1. dispatch interceptor
public class SetIdInterceptor extends DispatchInterceptor { public void setId(long id) throws Throwable { proceed(); Log.log("ID changed to " + id + "."); } }
DispatchInterceptor also automatically creates our method pointcut for us, matching only public methods implemented by our interceptor class:
It's not necessary to explicitly call the ProxyFactory from our code every time we create an object. Doing so is an example of a crosscutting concern. We can use a method interceptor to abstract out this concern.
Example 5.3. transparent proxy factory hook
/** * Wraps method results using default proxy factory. */ public class ProxyFactoryInterceptor implements Interceptor { public Object intercept(Invocation invocation) throws Throwable { return ProxyFactory.getInstance().wrap(invocation.proceed()); } } /** * Application factory class. Creates domain objects. */ public class Factory { public Person createPerson() { return new PersonImpl(); } public Book createBook() { return new BookImpl(); } static Factory instance = (Factory) ProxyFactory.getInstance().extend(Factory.class); public static Factory getInstance() { return instance; } }
Apply the ProxyFactoryInterceptor advice to the create methods on the factory and the Person and Book instance will get proxied. Now we have one explicit hook instead of three.