Hoy se anuncio que los desarrolladores de Google Juice y SpringSource, están trabajando en un estándar para un conjunto de anotaciones que permitan la inyección de dependencias de forma consistente en varios frameworks.
El anuncio lo hizo Google en el blog de Google Code:
"Hace cinco años, Spring 1.0 trajo la inyección de dependencias al mainstream. Tres años después, Google Guice 1.0 introdujo la inyección de dependencias basada en anotaciones e hizo la programación java un poco más fácil. Desde entonces, los desarrolladores han tenido que elegir entre a) escribir la configuración de forma externa o b) importar anotaciones específicas de un proveedor.
Hoy, pensamos darle a los desarrolladores lo mejor de ambos mundos: Google Guice y SpringSource se han asociado para estandarizar un conjunto de anotaciones probadas y no controversiales que hagan que las clases inyectadas sean portables entre frameworks. Por ahora, las anotaciones estandarizadas son:"
@Inject. Identifica constructores, métodos y campos inyectables.
@Qualifier. Identifica anotaciones que especifican el tipo de implementación a inyectar en un campo marcado como @inject
@Scope: Scope del bean anotado
@Named: Un Qualifier para nombres ( por ejemplo si se anota un campo como @Named("miDao"), la implementación de DI que uses, buscará entre los objetos que ha instanciado uno llamado miDao y lo inyectará al campo).
@Singleton: Especifica que el recurso anotado se instanciará solamente una vez.
Por ahora, el JSR está en fase de aprobación, puedes revisar el draft en este enlace y la especificación preliminar.
Algunas de estas anotaciones ya se usan en Spring, ignoro cuales de ellas son tomadas de GoogleGuice. Antes de esto, un trabajo similar en el área de los ORM llevó a la especificación de las anotaciones de JPA que puedes usar con cualquier proveedor de ORM lo que ha ayudado a estandarizar lo que antes era un mundo heterogéneo de implementaciones.
Además, ya existen algunas anotaciones de JEE para inyección de dependencias (por ejemplo, en vez de @Named("miDao"), se usa @Resource(name="miDao") ) y el proyecto WebBeans introduce otras nuevas con fines similares. ¿Como veis esta nueva especificación, era necesaria?