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