Spring y sus anotaciones

Hola a todos, desde la versión Spring 3.xx vengo trabajando usando anotaciones del tipo:

@Repository: Para anotar mis clases DAO (persistencia)
@Service: Para anotar mis clases que exponen los servicios

Se que existen otros como: @Component, @Bean, @Configuration, etc. Pero no me queda del todo claro las diferencias que existen entre ellas.

Esto lo pregunto por que quiero implementas un patro (Entity), en donde mis clases de dominio (anotadas con @Entity) contengan metodos del tipo save y get de la misma entidad, creo conveniente que mis clases de dominio puedan persistirse y recuperarse a si mismas sin la necesidad de una capa extra de servicio, pero no se cual de las anotaciones de Spring (@Repository, @Service, ???) es el adecuado para que el "component-scan" las pueda reconocer. Espero sus comentarios, gracias.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de paranoid_android

Algunas anotaciones básicas.

@Component: Esta anotación agrega una clase al contexto de spring. Equivale a agregar un tag bean al application context.
@Autowire: sobre un método o una propiedad Spring buscará un @Component para intentar inyectarlo.
Scan en el application context le indica a spring donde buscar clases para meter a su contexto.

Nota: Es muy importante respetar las convenciones de nombres mayúsculas y minúsculas.

   <!-- Dentro del applicationContext -->
   <!--  Configuración para uso de anotaciones -->
   <context:annotation-config />
    <bean class = "org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

    <!-- Scan -->
    <context:component-scan base-package="com.proyecto.paqueteBase" />

@Component
public class MiBean{
   String nombre;
   
   public void setNombre(String nombre){
        this.nombre=nombre;
   }

   public String getNombre(){
        return  nombre;
   }
}

@Component
public class Acceso{
    @Autowired
    MiBean myBean;
}

Si tienes configurado log4j con spring veras las clases que Spring está cargando en su contexto, se pueden combinar clases con @Component y tag bean no son excluyentes.

Imagen de ezamudio

@Service

Si mal no recuerdo, @Service es como superconjunto de @Component; agrega una instancia de la clase al application context pero además le hace alguna otra cosa (creo que es como para que tengas una clasificación de tus componentes, si le pides al application context sus servicios te dará los que tienen @Service pero no los de @Component, algo así). En la doc oficial viene todo eso.