Tuve la misma sensación ugh, ick, yuck de @ImplementedBy PERO, al mismo tiempo, es muy útil. Spring tiene que analizar todas las clases en la lista de paquetes que le proporcione. En Guice no tiene que configurar esa lista de paquetes para escanear y @ImplementedBy es la clave para eso (si no usa el Binder para enlazar eso). A medida que baja la jerarquía de objetos en el primer Injector.getInstance, y acierta una interfaz, luego usa @ImplementedBy para encontrar la implementación predeterminada (siempre que no haya nada en el Binder anulando ese valor predeterminado).
Usamos @ImplementedBy también. Nos parece extremadamente agradable de usar, es un poco ugh, pero simplemente funciona y funciona muy bien y, dado que es DI, en realidad no depende de la implementación, ya que puedes anular las vinculaciones con las nuevas de todos modos.
Al mismo tiempo, las interfaces generalmente se utilizan cada vez menos con marcos DI. Todas las interfaces DAO se fueron en nuestro proyecto Y todavía podemos intercambiar objetos simulados para el DAO. Las clases de Java son interfaces implícitas para empezar que se pueden burlar sin necesidad de la interfaz. Ahora reservamos el uso de la interfaz para apis principales para que sea muy claro y no se complique con el código de implementación. Para DAO ya no necesitamos esto.
Eso sería incompatible con el lema "no hagas mal" de Google, ¿no? – skaffman