This section describe a proposal, how can you use Crispy in a AspectJ envionment
It are two problems to solve:
First, you can see the abstract aspect AbstractServiceBuilder:
public abstract aspect AbstractServiceBuilder { protected IServiceManager serviceManager = null; /** * Create a configuration for a ServiceManager-Instance (first problem). */ public abstract Properties createProperties(); /** * Find all service interfaces for the ServiceManager to * create the Service-Proxy-Instance (second problem). */ public abstract pointcut findServices(); /** * The Advice. */ Object around() : findServices() { serviceManager = new ServiceManager(createProperties()); FieldSignature fieldSignature = (FieldSignature) thisJoinPoint.getSignature(); Class serviceClass = fieldSignature.getFieldType(); Object serviceProxy = serviceManager.createService(serviceClass); return serviceProxy; } }
Second, you can see the concrete implementation from the AbstractServiceBuilder, the ServiceBuilder:
public aspect ServiceBuilder extends AbstractServiceBuilder { /** * Capture all read access to fields in the * net.sf.crispy.extension.aspectj.AspectJExample class, where * fields from the package test.crispy.example.service. */ public pointcut findServices() : get (test.crispy.example.service.* net.sf.crispy.extension.aspectj.AspectJExample.*); /** * Load Properties from a file, where the class is. */ public Properties createProperties() { String propFileName = "aspect-test.properties"; Class propClass = this.getClass(); PropertiesLoader propertiesLoader = new ClassPropertiesLoader(propClass, propFileName); Properties properties = propertiesLoader.load(); return properties; } }
A example class, where the aspects be effective (this example starts your own MiniServer):
public class AspectJExample { private Echo echo = null; public Calculator calculator = null; public String echo (String echoString) { return echo.echo(echoString); } public static void main(String[] args) { MiniServer miniServer = new MiniRmiServer(1099); miniServer.addService("test.crispy.example.service.Echo", "test.crispy.example.service.EchoImpl"); miniServer.addService("test.crispy.example.service.Calculator", "test.crispy.example.service.CalculatorImpl"); miniServer.start(); try { AspectJExample aspectJExample = new AspectJExample(); System.out.println("Echo: " + aspectJExample.echo("Hello Crispy-AspectJ-Echo ...")); System.out.println("Calculator-add (2+3): " + aspectJExample.calculator.add(2, 3)); } catch (Exception e) { e.printStackTrace(); } finally { miniServer.stop(); } } }
The properties:
crispy.prop.server.url=rmi://localhost:1099 crispy.prop.executor.class=net.sf.crispy.impl.RmiExecutor