Auto Scan componentes con Spring

Spring componente Auto scaning

Normalmente se declaran todos los beans o los componentes en el archivo de configuración XML, de modo que el contenedor de Spring puede detectar y registrar sus beans o componentes.

En realidad, Spring es capaz de detectar y crear instancias de los beans del paquete de proyectos pre-definido, no hay declaración de beans más tediosos en el archivo XML.
Lo que sigue es un proyecto simple, incluyendo un servicio al cliente y la capa de DAO. Vamos a explorar las diferencias entre los componentes de declarar de forma manual y declarar de forma automática con Spring.

Declaración manual de un componente

ClienteDAO.java

package com.amalakaky.cliente.dao;

import org.apache.log4j.Logger;

import org.springframework.stereotype.Repository;

@Repository

public
class ClienteDAO {

    

    static
final Logger logger = Logger.getLogger(ClienteDAO.class);    

    @Override

    public String toString() {

        logger.info(“^ Pasamos por el DAO ^”);

        return
” Hola , Este es el ClienteDAO”;

    }    

}

ClienteService.java

package com.amalakaky.customer.services;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import com.amalakaky.customer.dao.ClienteDAO;

@Service

public
class ClienteService

{

    @Autowired

    ClienteDAO clienteDAO;

    @Override

    public String toString() {

        return
“ClienteDAO [ ClienteDAO =” + clienteDAO + “]”;

    }

    }

Añadir este componente al archivo de configuración de beans, es decir, lo haremos de la forma tradicional en Spring.

Clase con la anotación @Repository para la configuración manual.

@Repository

public
class ClienteDAO

{

    @Override

    public String toString() {

        return
” Hola , Este es el ClienteDAO”;

    }    

}

Spring-AutoScan.xml

<beans
xmlns=http://www.springframework.org/schema/beans&#8221;

xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance&#8221;

xmlns:context=http://www.springframework.org/schema/context&#8221;

xsi:schemaLocation=http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-2.5.xsd&#8221;>

<!– Configuracion Manual –>

<bean
id=“clienteService”
class=“com.amalakaky.cliente.services.ClienteService”>

        <property
name=“clienteDAO”
ref=“clienteDAO”
/>

    </bean>

</beans>

Main.java

package com.amalakaky.comun;

import org.apache.log4j.Logger;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.amalakaky.cliente.services.ClienteService;

public
class LanzarAPP {

    

    static
final Logger logger = Logger.getLogger(LanzarAPP.class);


public
static
void main( String[] args )

{

    ApplicationContext context =

        new ClassPathXmlApplicationContext(new String[] {“Spring-AutoScan.xml”});

    ClienteService cliente = (ClienteService)context.getBean(“clienteService”);

    System.out.println(cliente);

    logger.info(cliente);

}

}

Al ejecutarlo nos pinta la consola lo siguiente:

ClienteDAO [ ClienteDAO = Hola , Este es el ClienteDAO ]

Escaneo automático de componentes

Ahora bien, para permitir que Spring escanee las funciones automáticamente de un componente.

Usaremos la anotación @Componet para indicar que la clase es un componente en el escaneo automático.

ClienteDAO.java

package com.amalakaky.cliente.dao;

import org.apache.log4j.Logger;

import org.springframework.stereotype.Component;

//import org.springframework.stereotype.Repository;

//@Repository

@Component

public
class ClienteDAO {

    

    static
final Logger logger = Logger.getLogger(ClienteDAO.class);    

    @Override

    public String toString() {

        logger.info(“^ Pasamos por el DAO ^”);

        return
” Hola , Este es el ClienteDAO”;

    }    

}

ClienteService.java

package com.amalakaky.cliente.services;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

//import org.springframework.stereotype.Service;

import com.amalakaky.cliente.dao.ClienteDAO;

//@Service

@Component

public
class ClienteService {

    

    static
final Logger logger = Logger.getLogger(ClienteService.class);

    @Autowired

    ClienteDAO clienteDAO;

    @Override

    public String toString() {

        logger.info(“^^ Pasamos por el ClienteService ^^”);

        return
“ClienteDAO [ ClienteDAO =” + clienteDAO + “]”;

    }

        

}

Añadir este componente al archivo de configuración de beans, es decir, activar la función de auto escaneo en Spring. La base del paquete es indicar dónde se almacenan los componentes, Spring va a escanear esta carpeta y encontrar el Bean (con la anotación @Component o en nuestro caso @Repository) y lo registrara en el contenedor de Spring.


<!– Configuracion Automatica –>


<context:component-scan
base-package=“com.amalakaky.cliente”
/>

Ejecutamos el main:

package com.amalakaky.comun;

import org.apache.log4j.Logger;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.amalakaky.cliente.services.ClienteService;

public
class LanzarAPP {

    

    static
final Logger logger = Logger.getLogger(LanzarAPP.class);


public
static
void main( String[] args )

{

    ApplicationContext context =

        new ClassPathXmlApplicationContext(new String[] {“Spring-AutoScan.xml”});

    ClienteService cliente = (ClienteService)context.getBean(“clienteService”);

    System.out.println(cliente);

    logger.info(cliente);

}

}

Resultado en la consola:

ClienteDAO [ ClienteDAO = Hola , Este es el ClienteDAO ]

Análisis personalizado de auto componente por nombre

De forma predeterminada, Spring hará caso de que el primer carácter del componente – de ” ClienteServicio ” a ” clienteServicio. Y se puede recuperar este componente con el nombre de clienteServicio.

ClienteService cliente = (ClienteService)context.getBean(“clienteService”);

Para crear un nombre personalizado para el componente, se puede poner el nombre personalizado de esta manera:

@Service(“XXX”)

public
class ClienteService {

Ahora, usted puede recuperar con este nombre de ‘XXX’.

ClienteDAO [ ClienteDAO = Hola , Este es el ClienteDAO ] – [com.amalakaky.comun.LanzarAPP: main: 21]

Componentes Auto Scan tipos de anotaciones

En Spring 2.5, hay 4 tipos de componentes Auto scan para buscar tipos de anotaciones

@Component – Indica un componente de exploración automática.

@Repository     – Indica los componentes DAO en la capa de persistencia.

@Servicio     – Indica un componente de servicio en la capa de negocio.

@Controller     – Indica un componente de controlador en la capa de presentación.

Entonces, ¿cuál usar? Vamos a ver el código fuente

@Repository, @Service or @Controller.

    @Target({ElementType.TYPE})

    @Retention(RetentionPolicy.RUNTIME)

    @Documented

    @Component

    public
@interface
Repository {

        String value() default
“”;

    

    }

Se dio cuenta de que todo @Repository, @Controller o @Service se usan con el @. Por lo tanto, ¿podemos utilizar sólo @Component para todos los componentes de escaneo automático? Sí, puede hacerlo, y Spring analizara todos los componentes con la anotación @Component.
Esto funcionando muy bien, pero no es una buena práctica, para facilitar su lectura, usted siempre debe declarar @Repository y @Servicio o @Controller para una capa específica para hacer que su código sea más fácil de leer, de la siguiente manera:

ClienteDAO.java

package com.amalakaky.cliente.dao;

import org.apache.log4j.Logger;

//import org.springframework.stereotype.Component;

import org.springframework.stereotype.Repository;

@Repository

//@Component

public
class ClienteDAO {

    

    static
final Logger logger = Logger.getLogger(ClienteDAO.class);    

    @Override

    public String toString() {

        logger.info(“^ Pasamos por el DAO ^”);

        return
” Hola , Este es el ClienteDAO”;

    }    

}

ClienteService.java

package com.amalakaky.cliente.services;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;

//import org.springframework.stereotype.Component;

import org.springframework.stereotype.Service;

import com.amalakaky.cliente.dao.ClienteDAO;

@Service

//@Component

//@Service(“XXX“)

public
class ClienteService {

    

    static
final Logger logger = Logger.getLogger(ClienteService.class);

    @Autowired

    ClienteDAO clienteDAO;

    @Override

    public String toString() {

        logger.info(“^^ Pasamos por el ClienteService ^^”);

        return
“ClienteDAO [ ClienteDAO =” + clienteDAO + “]”;

    }

}

Main:

ClienteService cliente = (ClienteService)context.getBean(“clienteService”);

Salida:

ClienteDAO [ ClienteDAO = Hola , Este es el ClienteDAO ] – [com.amalakaky.comun.LanzarAPP: main: 21]

Para descargar el ejemplo :

Spring Filtros Componentes Auto Scan

En este tutorial el componente auto escaneo de Spring, aprenderá acerca de cómo hacer que Spring escanee sus componentes de forma automática. Mostramos cómo hacer el Filtrado de los componentes en el proceso de auto escaneo.

Incluir el Filtro de Componente

En la siguiente clase vamos a utilizar el “filtro” para escanear y registrar el nombre de los componentes de los cuales corresponde definir “regex”, aunque la clase no está utilizando la anotación @Component.

ClienteDAO.java

package com.amalakaky.cliente.dao;

import org.apache.log4j.Logger;

public
class ClienteDAO {

    

    static
final Logger logger = Logger.getLogger(ClienteDAO.class);    

    @Override

    public String toString() {

        logger.info(“^ Pasamos por el DAO ^”);

        return
” Hola , Este es el ClienteDAO”;

    }    

}

ClienteService.java

package com.amalakaky.cliente.services;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;

import com.amalakaky.cliente.dao.ClienteDAO;

public
class ClienteService {

    

    static
final Logger logger = Logger.getLogger(ClienteService.class);

    @Autowired

    ClienteDAO clienteDAO;

    @Override

    public String toString() {

        logger.info(“^^ Pasamos por el ClienteService ^^”);

        return
“ClienteDAO [ ClienteDAO =” + clienteDAO + “]”;

    }

}

Ahora nuestra configuración del Filtro en el xml.

<beans
xmlns=http://www.springframework.org/schema/beans&#8221;

xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance&#8221;

xmlns:context=http://www.springframework.org/schema/context&#8221;

xsi:schemaLocation=http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-2.5.xsd&#8221;>


<!– Filtros –>


<context:component-scan
base-package=“com.amalakaky”
>

        

        <context:include-filter
type=“regex”
expression=“com.amalakaky.cliente.dao.*DAO.*”
/>

        

        <context:include-filter
type=“regex”
expression=“com.amalakaky.cliente.services.*Service.*”
/>

        

    </context:component-scan>

    

</beans>

Nuestra clase para lanzar la aplicación.

package com.amalakaky.comun;

import org.apache.log4j.Logger;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.amalakaky.cliente.services.ClienteService;

public
class LanzarAPP {

    

    static
final Logger logger = Logger.getLogger(LanzarAPP.class);


public
static
void main( String[] args )

{

    ApplicationContext context =

        new ClassPathXmlApplicationContext(new String[] {“Spring-AutoScan.xml”});

    ClienteService cliente = (ClienteService)context.getBean(“clienteService”);

    System.out.println(cliente);

    logger.info(cliente);

}

}

La salida por consola es la misma que en los ejemplos anteriores.

ClienteDAO [ ClienteDAO = Hola , Este es el ClienteDAO] – [com.amalakaky.comun.LanzarAPP: main: 21]

Excluir Filtros de componentes

Por otro lado, también se puede excluir a componentes específicos, para evitar que Spring lo detecte y lo registre en el contenedor de Spring.
Excluir los archivos anotados con @Service.

    <!– Excluir Anotaciones @Services –>

    <context:component-scan
base-package=“com.amalakaky.cliente”
>

        <context:exclude-filter
type=“annotation”

            expression=“org.springframework.stereotype.Service”
/>        

    </context:component-scan>

Excluir a los nombre de los archivos contiene la palabra de DAO.

<!– Excluir todos los archivos que contengan la palabra DAO –>

    <context:component-scan
base-package=“com.amalakaky”
>

        <context:exclude-filter
type=“regex”

            expression=“com.amalakaky.cliente.dao.*DAO.*”
/>        

    </context:component-scan>

Para descargar el ejemplo :

Anuncios
Minientrada | Esta entrada fue publicada en Spring y etiquetada . Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s