[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