Introducción a los Beans

En este tutorial de Spring Boot, vamos a explicar bastantes conceptos bastantes conceptos como son: Beans, la anotación @Bean, Spring Container, beans scope, etc.

¿Qué son los Beans?

Un Java Bean, también son conocidos un Bean, es una clase simple en Java que cumple con ciertas normas con los nombres de sus propiedades y métodos. Es un componente (similar a una caja) que nos permite encapsular el contenido, con la finalidad de otorgarle una mejor estructura. Que además, permite la reutilización de código mediante a una estructura sencilla.

Se aconseja que un bean cumpla las siguientes condiciones:

  • Constructor sin argumentos: aunque ya existe por defecto (no se ve pero está), se aconseja el declararlo.
  • Atributos privados.
  • Getters&Setters de todos los atributos.
  • El bean puede implementar Serializable.
  • Requieren una anotación o crear un fichero .xml donde se detalle que es un Bean.

Mediante estos JavaBeans, desarrollamos nuestro modelo de objetos (o modelo de dominio) para la aplicación. Nuestros POJOS realmente son Beans siempre y que añadamos una anotación que indique que dicho POJO es un Bean. Un poco más abajo crearemos uno.

Comenzando el proyecto

Suponiendo que partimos de un proyecto de Spring Boot, con un pom.xml como el siguiente:

Y un main.java:

Creando el Bean (POJO)

Necesitamos crear un POJO, en este caso este POJO, que en nuestro caso será Pokemon y tendrá 3 atributos: id, name y type. También, añadiremos sus getters & setters y un método llamado show().

La estructura de paquetes será la siguiente:

Y el POJO Pokemon será:

La primera manera de llamar a un método que se nos pasa por la cabeza es la siguiente.

Que nos dará como resultado:

¿Qué es Spring Container?

El SpringApplication, puede leer Beans mediante a distintas fuentes, esta lectura se guardará en lo que conocemos como Spring Container.

Dentro de la infraestructura de Spring tenemos Spring Container (contendedor)Que vendría siendo el núcleo del framework.

Si no le indicamos la fuente nos encontramos con el siguiente error:

Este error es producido debido a que le hemos indicado que inyecte el POJO que no tiene una anotación que lo defina como un Bean. Por tanto, no puede ser almacenado dentro del Spring container ya que no encuentra el Bean.

Un contenedor crea objetos, los une, los configura y administra su ciclo de vida completamente. Los Beans son objetos que maneja el contendor de spring (Spring Container).

Trabajando con Spring Container y un Bean

Las principales fuentes para gestionar la implementación de Spring container mediante a su Application Context son:

  • @Controller
  • @Service
  • @Component
  • @Configuration

Si le añadimos al POJO que hemos creado anteriormente @Component, podemos comprobar cómo ahora sí que funciona:

Esto se produce debido a que mediante a la anotación indicamos que este POJO, es un Bean.

¿Para qué sirven estos Beans?

Si decimos que solamente son clases de Java, esto nos hace pensar qué sentido tienen. Lo que le da sentido a los Beans es la inyección de dependencias o Injection Dependency de la que vamos a hablar en el siguiente apartado.

¿Qué es la inyección de dependencias?

La Inyección de dependencias es un patrón de diseño orientado a objetos, cuya finalidad es la de suministrar objetos a una clase mediante a Spring Container, sin que la propia clase tenga que crearlos.

Es decir, que mediante a Spring Boot definimos Beans (objetos) y mediante a configuraciones específicas y al trabajo de Spring Container (contenedor) los inyectamos en la clase que lo necesite. Spring tiene muchas anotaciones para ello, algunas son las que hemos visto en el ejemplo anterior. Aunque en este artículo veremos algunas más, que nos proporcionarán una base con la que ya podremos indagar un poco más nosotros mismos.

Singleton VS Prototype

Para explicar este concepto, vamos a ver primeramente a detenernos en un ejemplo práctico. Si creamos dos objectos a partir del bean Pokemon, y mediante a cada una de las formas que hemos visto anteriormente: la tradicional de instanciar un objeto en Java y la de Application Context.

Podemos ver que tenemos resultados distintos. En la forma tradicional, podemos ver que tenemos 2 objetos diferentes, muestra de ello es que si imprimimos sus nombres son distintos, y por tanto, podemos afirmar que son dos instancias independientes.

En cambio, en la que realizamos a partir del contexto de la aplicación, podemos observar que solamente tenemos un objeto y que pese a llamar a dos objetos,

Realmente, siendo puristas el comportamiento de la forma tradicional por ejemplo de la forma tradicional (POO) aunque sin inyección de dependencias, pero tiene un “comportamiento similar” a lo que sería Prototype. La segunda forma (Beans Singleton), sí que sería mediante a la inyección de beans que si no detallamos nada, como en el caso, por defecto será Singleton. De lo que estamos hablando en realidad al referirnos a Singleton y a Prototype es a dos de los scopes de los Beans de Spring.

El listado total de Spring Bean Scopes es:

  • Singleton: Crea una única  instancia que se almacena dentro de Spring Container del bean para responder a todas las peticiones que recibe. Es el que se aplica por defecto.
  • Prototype: Crea una nueva instancia del bean para cada petición.
  • Request: Crea un nueva instancia del bean para cada petición HTTP.
    Session: Crea una única instancia para cada sesión HTTP.
    Global-Session: Crea una instancia para cada global HTTP sesión.

Aunque la creación de objetos tradicional no es prototype como tal. Tiene un comportamiento similar con la excepción de que no pasamos por nuestro ya conocido Spring Container. Si quisiéramos utilizar prototype, deberíamos de realizar lo siguiente:

Y el main se mantendría muy similar a excepción de modificar el nombre:

De hecho, si le añadimos al constructor un método para que cada vez que cree un objeto nos muestre su creación, al arrancar la aplicación, podemos ver que es justo al arrancar cuando Spring Boot cuando se crearán los objetos.

Ya que realmente, se crean una vez una vez en el Spring Context y desde allí, se crean tantas veces como necesitemos. Pero si nos fijamos, los objetos como tal, solamente se crean una vez los objetos de esta manera.

¿Qué hace la anotación @Configuration y @Bean?

La anotación @Bean, nos sirve para indicar que este bean será administrado por Spring Boot. La administración de estos beans se realiza mediante a anotaciones como @Configuration.

El main será:

El BeanConfig será:

Y si ejecutamos la aplicación vemos:

Otra manera similar sería

Otra manera, será el tener un Pokemon que tenga un Gimnasio. Si lo hacemos con el config

Main.java:

Pokemon.java:

Gimnasio.java:

BeanConfig.java:

Y el resultado será:

2 comentarios

  1. Have you ever considered about adding a little bit more than just your articles?

    I mean, what you say is important and all.
    But imagine if you added some great visuals or videos to give your posts more, “pop”!
    Your content is excellent but with images and
    clips, this blog could certainly be one of the greatest in its niche.
    Good blog!

  2. Interesting blog! Is your theme custom made or did you download it from somewhere?
    A theme like yours with a few simple adjustements would really make
    my blog jump out. Please let me know where
    you got your theme. Thanks a lot

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

La Ley 34/2002 nos obliga a avisarte de que usamos cookies propias y de terceros con objetivos estadísticos y de sesión y para mostrarte la 'publi' que nos da de comer. Tranquilo, este mensaje solo sale una vez. Más información

Java desde 0 comunica a los usuarios, a través de este aviso, que puede utilizar cookies cuando el usuario navega por las diferentes pantallas y páginas del sitio. Durante el uso de nuestra página Web usted acepta y autoriza expresamente el uso de cookies, de acuerdo con nuestra Política de Privacidad. Este sitio web utiliza las siguientes cookies propias: - Cookies de sesión, para garantizar que los usuarios que escriban comentarios en el blog sean humanos y no aplicaciones automatizadas. De esta forma se combate el spam. Este sitio web utiliza las siguientes cookies de terceros: - Google AdManager y AdSense: Utiliza cookies para mejorar la publicidad. Entre otros fines, suelen utilizarse para segmentarla según el contenido que sea relevante para los usuarios o su ubicación, mejorar los informes de rendimiento de las campañas y evitar mostrar anuncios que los usuarios ya hayan visto. Las cookies no contienen información personal identificable. Consulta cómo utiliza Google la información de sitios web o aplicaciones. y cómo bloquear determinados anuncios. - Google Analytics: Almacena cookies para poder elaborar estadísticas sobre el tráfico y volumen de visitas de esta web. Al utilizar este sitio web está consintiendo el tratamiento de información acerca de usted por Google. Por tanto, el ejercicio de cualquier derecho en este sentido deberá hacerlo comunicando directamente con Google. - Redes sociales: Cada red social utiliza sus propias cookies para que usted pueda pinchar en botones del tipo Me gusta o Compartir.

Cerrar