[seam-dev] Automatic proxying of interfaces in weld extensions

Stuart Douglas stuart at baileyroberts.com.au
Mon Jun 28 03:54:39 EDT 2010


After some discussions with Walter White I have added some experimental code to weld extensions to enable the automatic proxying of interfaces. 

To demonstrate how this works, here is a sample:

@AutoProxy(QueryInvocationHandler.class)
public interface QueryService<T> {};

public interface UserQuery extends QueryService<User>
{
  
  @Query("select u from user u where u.username=:1")
  public User findUserByUsername(String username);

}

public class QueryInvocationHandler implements InvocationHandler
{

  @Inject EntityManager entityManager;

public Object invoke(Object proxy, Method method, Object[] args)
	throws Throwable
{
  //run the query based on the annotations on the method
}

}

Any interface that extends QueryService will be automatically proxied by the container, using the InvocationHander specified in the @AutoProxy annotation. This proxy is registered as a bean, and if any qualifiers are present on the Interface being proxied these are added to the bean. It is also possible to inject into the InvocationHandler. 
I also plan to make @AutoProxy a meta annotation, so the above could also be represented as: 


@AutoProxy(QueryInvocationHandler.class)
public @interface QueryService{}

@QueryService 
public interface UserQuery 
{
  
  @Query("select u from user u where u.username=:1")
  public User findUserByUsername(String username);

}

Does all this sound ok, or does it not have a strong enough use case to include it in Weld Extensions?

Stuart


More information about the seam-dev mailing list