- 1 1. Introducción | Qué son los JavaBeans y por qué importan
- 2 2. Los fundamentos de JavaBeans | Definición, características y diferencias con POJO
- 3 3. Especificaciones y reglas de JavaBeans | Fundamentos de Getter/Setter y Serializable
- 3.1 ¿Cuáles son las especificaciones básicas requeridas para JavaBeans?
- 3.2 Un Constructor Público sin Argumentos
- 3.3 Propiedades Privadas y Getter/Setter Públicos
- 3.4 Implementación de la Interfaz Serializable
- 3.5 Generación Automática de Código en Eclipse o IntelliJ
- 3.6 La Importancia de Seguir las Convenciones de Nomenclatura
- 3.7 Resumen: La Estructura de los JavaBeans es un “Conjunto de Convenciones”
- 4 4. Ejemplos Básicos de Implementación de JavaBeans | Explicados con Código de Muestra
- 4.1 Veamos la Estructura de un JavaBean en la Práctica
- 4.2 Un Ejemplo Simple de JavaBean: UserBean
- 4.3 Ej: Operando con las Propiedades del JavaBean
- 4.4 Ejemplo de manejo de múltiples JavaBeans
- 4.5 Asistencia de codificación: generación automática en Eclipse
- 4.6 Resumen rápido: primero, intenta escribirlo tú mismo
- 5 5. Uso aplicado de JavaBeans | Uso en JSP, Servlets y Spring
- 5.1 Los JavaBeans son más que “solo clases de datos”
- 5.2 Uso de JavaBeans en JSP | Intercambio de datos con <jsp:useBean>
- 5.3 Integración con Servlets | Gestión de datos de solicitud usando JavaBeans
- 5.4 Integración con Spring Framework | DI y Vinculación Automática de Propiedades
- 5.5 Uso como DTO (Objeto de Transferencia de Datos)
- 5.6 Resumen rápido: los JavaBeans aumentan la “conectividad” entre tecnologías
- 6 6. Ventajas y desventajas de los JavaBeans | Decidiendo cuándo utilizarlos
- 7 7. Preguntas Frecuentes (FAQ)
- 7.1 Q1. ¿No son los JavaBeans y los POJO lo mismo?
- 7.2 Q2. ¿Se siguen usando los JavaBeans en el desarrollo real hoy en día?
- 7.3 Q3. Hay tantos setters y getters que el código se vuelve desordenado. ¿Cómo puedo manejar esto?
- 7.4 Q4. ¿Cómo debo implementar la validación (comprobaciones de entrada) en JavaBeans?
- 7.5 Q5. ¿Pueden los JavaBeans usarse en APIs REST?
- 7.6 Q6. ¿En qué se diferencian los JavaBeans de las clases Entity?
- 8 8. Resumen | Qué Obtienes al Aprender JavaBeans
1. Introducción | Qué son los JavaBeans y por qué importan
Los JavaBeans son fundamentales en el desarrollo de Java
Los JavaBeans son un conjunto de reglas de diseño para componentes reutilizables ampliamente utilizados en la programación de Java. Se trata de clases de Java escritas según especificaciones específicas, y se utilizan para manejar de manera eficiente el intercambio de datos y la gestión del estado de los objetos. Por ejemplo, en aplicaciones web, es muy común usar JavaBeans como un “contenedor” para almacenar temporalmente la información ingresada por los usuarios en formularios.
La conveniencia habilitada por la especificación de JavaBeans
Los JavaBeans no son solo clases de Java ordinarias: al seguir varias reglas, se convierten en fáciles de integrar con diversos frameworks y bibliotecas. Tecnologías como Spring Framework y JavaServer Pages (JSP) están diseñadas basadas en JavaBeans, y simplemente ser compatibles con JavaBeans permite beneficiarse automáticamente de muchas características. Además, entender la estructura básica de los JavaBeans —como los métodos getter/setter que permiten el acceso automático a propiedades y la serialización para guardar/transferir datos— es una habilidad práctica que se conecta directamente con el desarrollo real de Java.
Qué cubre este artículo
Este artículo explica paso a paso —desde la definición fundamental de los JavaBeans, hasta las reglas de implementación, ejemplos de código y uso práctico—. Mientras se cubren los tropiezos comunes para principiantes, el objetivo es eliminar la pregunta fundamental de “¿Qué son exactamente los JavaBeans?” y ayudarte a adquirir conocimientos que puedas aplicar en el trabajo de desarrollo real.
2. Los fundamentos de JavaBeans | Definición, características y diferencias con POJO
¿Cuál es la definición de JavaBeans?
Un JavaBean se refiere a un componente de software reutilizable desarrollado en Java. Formalmente, es una clase de Java definida según especificaciones establecidas por Sun Microsystems (ahora Oracle), e implementada según reglas sintácticas específicas. Los JavaBeans se utilizan principalmente para fines como:
- Transferencia de datos (rol similar a DTO)
- Integración con componentes de GUI
- Construcción de la capa de modelo en aplicaciones web
De esta manera, los JavaBeans se usan a menudo como “contenedores (objetos) que almacenan datos y los intercambian con el exterior de manera segura y eficiente”.
Características representativas de JavaBeans
Los JavaBeans tienen las siguientes características:
- Un constructor público sin argumentos → Permite la instanciación libre de la clase
- Propiedades privadas y métodos getter/setter públicos correspondientes → Habilita la encapsulación y el control de acceso
- Implementación de la interfaz Serializable → Permite que los objetos se conviertan en flujos de bytes para almacenamiento y transmisión
- Métodos que siguen convenciones de nomenclatura Ejemplo:
getName(),setName(),isAvailable(), etc.
Estas características hacen que los JavaBeans sean fáciles de integrar automáticamente con herramientas y frameworks.
¿En qué se diferencia de POJO?
Un concepto que se compara frecuentemente es “POJO (Plain Old Java Object)”. POJO es un concepto más amplio que JavaBeans, y las diferencias son las siguientes:
| Comparison Item | JavaBeans | POJO (Plain Old Java Object) |
|---|---|---|
| Naming conventions | Requires specific naming rules such as getter/setter | Free naming |
| Constructor | Requires a public no-argument constructor | Constructor definition is optional |
| Field exposure | Private fields + public methods recommended | Field exposure is free |
| Interfaces | Serializable implementation is recommended | Not required |
| Main usage | Framework integration based on JavaBeans conventions | Generic class structure (e.g. data classes) |
En resumen, POJO es un objeto de Java puro sin restricciones, mientras que los JavaBeans son POJOs con reglas diseñadas para la integración con herramientas.
¿Cuándo debes usar JavaBeans?
Los JavaBeans son particularmente efectivos en escenarios como:
- Intercambio de datos en frameworks principales de Java como Spring o JSP
- Serialización de objetos y gestión de sesiones
- Reconocimiento automático de propiedades por bibliotecas externas y herramientas de desarrollo
Al escribir código que sigue las convenciones, también contribuyes a la automatización del desarrollo y la mantenibilidad.
3. Especificaciones y reglas de JavaBeans | Fundamentos de Getter/Setter y Serializable
¿Cuáles son las especificaciones básicas requeridas para JavaBeans?
JavaBeans no son “simples clases Java ordinarias”. Deben seguir ciertas convenciones. Estas convenciones permiten que los IDE y los frameworks reconozcan automáticamente las propiedades y métodos de un JavaBean, facilitando la estructuración y reutilización de la aplicación.
A continuación se presentan las especificaciones principales que una clase debe cumplir para funcionar correctamente como JavaBean.
Un Constructor Público sin Argumentos
Los JavaBeans a menudo se instancian de forma dinámica, por lo que siempre deben contar con un constructor público sin argumentos. Sin él, frameworks como JSP no pueden instanciarlos, lo que provocará errores.
public class UserBean {
public UserBean() {
// empty constructor is fine
}
}
Propiedades Privadas y Getter/Setter Públicos
En los JavaBeans, las variables miembro (campos) están encapsuladas como privadas, y los métodos getter y setter correspondientes se declaran como públicos. Esto permite un acceso externo controlado a los datos y mejora la mantenibilidad y la seguridad.
public class UserBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Implementación de la Interfaz Serializable
Los JavaBeans suelen almacenarse en sesiones o escribirse en archivos en aplicaciones web, por lo que se recomienda implementar la interfaz java.io.Serializable.
import java.io.Serializable;
public class UserBean implements Serializable {
private String name;
private int age;
// getter/setter omitted
}
Al hacerlo, los JavaBeans quedan disponibles para su uso en sesiones o transferencias, facilitando la integración con aplicaciones web, RMI, EJB, etc.
Generación Automática de Código en Eclipse o IntelliJ
Los IDE modernos ofrecen funcionalidades que generan automáticamente getters/setters, constructores, serialVersionUID, entre otros.
Por ejemplo, en Eclipse, usar Clic derecho → “Source” → “Generate Getters and Setters” permite generar en bloque los métodos para múltiples propiedades. Esto evita errores manuales y mejora la productividad.
La Importancia de Seguir las Convenciones de Nomenclatura
En los JavaBeans, seguir estrictamente las convenciones de nomenclatura es fundamental para la integración con frameworks/herramientas. Por ejemplo, Spring Framework invoca internamente setXxx() o getXxx() según el nombre de la propiedad, de modo que cualquier violación de la convención provocará fallos.
Resumen: La Estructura de los JavaBeans es un “Conjunto de Convenciones”
Las especificaciones de los JavaBeans pueden parecer restrictivas, pero son simplemente “convenciones para trabajar cooperativamente con herramientas y entornos de desarrollo”. Como lenguaje común para equipos de desarrollo y frameworks, las especificaciones de los JavaBeans desempeñan un papel muy importante.
4. Ejemplos Básicos de Implementación de JavaBeans | Explicados con Código de Muestra
Veamos la Estructura de un JavaBean en la Práctica
Aunque comprendas la teoría y las reglas de los JavaBeans, muchas personas no lo interiorizan realmente hasta que escriben código. Esta sección recorre una implementación típica de un JavaBean y muestra la estructura concreta y el estilo de escritura.
Un Ejemplo Simple de JavaBean: UserBean
Este ejemplo utiliza una clase UserBean que tiene dos propiedades: name y age.
import java.io.Serializable;
public class UserBean implements Serializable {
private String name;
private int age;
// No-argument constructor
public UserBean() {
}
// getter/setter for name
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// getter/setter for age
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Esta clase cumple con las siguientes especificaciones de JavaBean:
- Implementa la interfaz
Serializable - Posee un constructor público sin argumentos
- Campos privados con sus correspondientes métodos getter/setter públicos
Ej: Operando con las Propiedades del JavaBean
A continuación hay un ejemplo sencillo que muestra cómo instanciar este JavaBean y establecer/obtener sus propiedades.
public class Main {
public static void main(String[] args) {
UserBean user = new UserBean();
user.setName("Sato");
user.setAge(28);
System.out.println("Name: " + user.getName());
System.out.println("Age: " + user.getAge());
}
}
Resultado de la ejecución:
Name: Sato
Age: 28
De esta manera, los JavaBeans proporcionan una estructura que permite un acceso externo seguro de lectura/escritura a las propiedades.
Ejemplo de manejo de múltiples JavaBeans
Los JavaBeans también se manejan con frecuencia en arreglos o colecciones. Por ejemplo, mantener una lista de usuarios puede hacerse de la siguiente forma:
import java.util.ArrayList;
import java.util.List;
public class UserListExample {
public static void main(String[] args) {
List<UserBean> users = new ArrayList<>();
UserBean user1 = new UserBean();
user1.setName("Tanaka");
user1.setAge(30);
UserBean user2 = new UserBean();
user2.setName("Takahashi");
user2.setAge(25);
users.add(user1);
users.add(user2);
for (UserBean user : users) {
System.out.println(user.getName() + " (" + user.getAge() + " years old)");
}
}
}
De esta manera, los JavaBeans son extremadamente útiles no solo en aplicaciones web sino también en estructuración y gestión de datos. 
Asistencia de codificación: generación automática en Eclipse
Al usar un IDE como Eclipse, puedes generar automáticamente getters/setters, constructores, serialVersionUID, etc.
Ejemplo de procedimiento (Eclipse):
- Haz clic derecho en el archivo de clase → [Source] → [Generate Getters and Setters]
- Selecciona propiedades mediante casillas de verificación
- Haz clic en [Generate] para insertar el código automáticamente
Usar un IDE ayuda a evitar errores y aumenta significativamente la eficiencia de codificación.
Resumen rápido: primero, intenta escribirlo tú mismo
Aunque los JavaBeans pueden parecer que tienen una estructura simple, son extremadamente comunes en el desarrollo Java del mundo real. Una vez que te acostumbras a la estructura básica, comprender tecnologías más avanzadas como Spring será mucho más fluido.
5. Uso aplicado de JavaBeans | Uso en JSP, Servlets y Spring
Los JavaBeans son más que “solo clases de datos”
Como se ha visto hasta ahora, los JavaBeans son componentes reutilizables que almacenan y recuperan propiedades. Su valor real, sin embargo, reside en “integración con frameworks”. En muchas tecnologías relacionadas con Java —JSP, Servlets, Spring Framework, etc.— seguir la estructura de JavaBean permite la automatización de la configuración y el procesamiento, lo que conduce a una productividad de desarrollo significativamente mayor.
Uso de JavaBeans en JSP | Intercambio de datos con <jsp:useBean>
En JSP, los JavaBeans se utilizan frecuentemente para contener datos de entrada del usuario o almacenar datos destinados a la visualización.
<jsp:useBean id="user" class="com.example.UserBean" scope="request" />
<jsp:setProperty name="user" property="name" value="Sato" />
<jsp:setProperty name="user" property="age" value="28" />
<p>Name: <jsp:getProperty name="user" property="name" /></p>
<p>Age: <jsp:getProperty name="user" property="age" /></p>
<jsp:useBean>: Crea u obtiene la instancia del JavaBean<jsp:setProperty>: Establece valores de propiedades<jsp:getProperty>: Muestra valores de propiedades
Integración con Servlets | Gestión de datos de solicitud usando JavaBeans
Los JavaBeans también son extremadamente eficaces para el intercambio de datos entre Servlets y JSP. A continuación se muestra un proceso típico donde los parámetros de la solicitud se almacenan en un JavaBean y se pasan a un JSP.
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
UserBean user = new UserBean();
user.setName(name);
user.setAge(age);
request.setAttribute("user", user);
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
Con este enfoque, en el lado JSP, acceder al JavaBean user permite manejar múltiples campos de datos de forma simplificada.
Integración con Spring Framework | DI y Vinculación Automática de Propiedades
En Spring, los JavaBeans se utilizan comúnmente como objetivos de DI y como destinos de vinculación de formularios.
Ejemplo de Vinculación de Formulario en un Controlador (Spring MVC):
@PostMapping("/register")
public String register(@ModelAttribute("user") UserBean user) {
// Form values are automatically bound to user
System.out.println(user.getName());
System.out.println(user.getAge());
return "result";
}
- Cuando los nombres de las propiedades coinciden con el atributo
namede los formularios,@ModelAttributeenlaza automáticamente los valores. - Esto funciona porque se siguen las convenciones de nomenclatura de los JavaBeans.
Uso de applicationContext.xml como objetivo de DI:
<bean id="userBean" class="com.example.UserBean">
<property name="name" value="Yamada" />
<property name="age" value="35" />
</bean>
Con XML o anotaciones, la inyección de propiedades se vuelve posible.
Uso como DTO (Objeto de Transferencia de Datos)
Los JavaBeans también se emplean frecuentemente como DTOs en APIs web o procesos por lotes. Mapear datos JSON a JavaBeans facilita la gestión estructurada de la información.
Ejemplo con Spring Boot + Jackson:
public class UserBean {
private String name;
private int age;
// getter, setter omitted
}
@PostMapping("/api/user")
public ResponseEntity<?> receiveUser(@RequestBody UserBean user) {
// JSON → JavaBeans automatic conversion
return ResponseEntity.ok("Received: " + user.getName());
}
Resumen rápido: los JavaBeans aumentan la “conectividad” entre tecnologías
Los JavaBeans actúan menos como clases independientes y más como “pegamento” entre otras tecnologías. Al seguir convenciones, la automatización y simplificación del desarrollo se vuelve posible, y la mantenibilidad y reutilización mejoran considerablemente.
6. Ventajas y desventajas de los JavaBeans | Decidiendo cuándo utilizarlos
Ventajas de los JavaBeans
Los JavaBeans son un patrón de diseño muy usado en el desarrollo Java, y adoptarlos brinda numerosos beneficios. A continuación se presentan las principales ventajas.
1. Mejor mantenibilidad y reutilización
Los JavaBeans operan objetos mediante propiedades y métodos de acceso claramente definidos (getter/setter). Por ello, las estructuras de datos se entienden fácilmente a simple vista, lo que facilita que otros desarrolladores comprendan y modifiquen el código. Además, el mismo Bean puede reutilizarse en múltiples lugares, lo que incrementa la reutilización y evita código redundante.
2. Fácil integración con frameworks
Muchos frameworks y herramientas Java —Spring, JSP, JavaFX, etc.— soportan la especificación JavaBean. Simplemente siguiendo las convenciones de nombres, es posible la vinculación automática de datos de formularios y la carga automática de valores desde archivos de configuración.
3. Protección de datos mediante encapsulamiento
Los JavaBeans definen sus propiedades como privadas y exponen el acceso mediante métodos públicos getter/setter. Esto impide que código externo modifique directamente los campos y garantiza la consistencia de los datos. Los métodos setter también pueden incluir lógica de validación, lo que permite introducir fácilmente verificaciones de entrada para evitar valores inválidos.
Desventajas de los JavaBeans
Por otro lado, los JavaBeans también presentan aspectos que requieren precaución, casos en los que no son adecuados según el propósito.
1. El código tiende a volverse verboso
En JavaBeans, la cantidad de getters/setters aumenta en proporción al número de propiedades. Por lo tanto, los Beans con decenas de propiedades requieren muchos bloques de código repetitivo, lo que hace que los archivos de clase estén más saturados.
2. Mezclar Lógica de Negocio Desdibuja la Responsabilidad
Los JavaBeans están diseñados específicamente para “almacenar y transferir datos”.
Cuando se incrusta lógica de negocio en ellos, se desvían de su función original.
Mezclar responsabilidades dificulta las pruebas y complica el mantenimiento futuro.
3. Difícil Mantener la Inmutabilidad de los Objetos
Los JavaBeans asumen mutabilidad (cambios de estado) porque proporcionan métodos setter. Para arquitecturas que enfatizan la programación funcional o la seguridad en hilos, esto puede entrar en conflicto con la necesidad de mantener la inmutabilidad.
Cuándo Usar JavaBeans / Cuándo Evitarlos
Situaciones de Uso Recomendado:
- Al integrarse con frameworks como Spring, JSP, JavaFX
- Intercambio de datos de formularios web / solicitudes
- Objetos de datos de alcance de sesión o destinados a serialización
- Uso como DTO (Objeto de Transferencia de Datos)
Situaciones para Evitarlos:
- Modelos de dominio complejos con lógica y estado fuertemente integrados
- Casos que requieran estado fijo en procesamiento paralelo
- Situaciones de pequeña escala donde la definición de getters/setters resulte excesiva (considerar Records o Lombok en su lugar)
Resumen: Los JavaBeans Son “Herramientas para Usar Correctamente”
Los JavaBeans están muy extendidos en el desarrollo Java como algo que se da por sentado.
Por eso, la capacidad de escribir “JavaBeans diseñados adecuadamente” conduce directamente a una comunicación más fluida con otros desarrolladores.
En otras palabras, los JavaBeans son “un formato para expresar tus intenciones con precisión mediante código”.
Al valorar los fundamentos, puedes aprovecharlos para el desarrollo de habilidades futuras.
7. Preguntas Frecuentes (FAQ)
Q1. ¿No son los JavaBeans y los POJO lo mismo?
R1. Son conceptos similares, pero no idénticos.
Un POJO (Plain Old Java Object) se refiere a una clase Java regular que no está sujeta a especificaciones especiales y simplemente contiene propiedades y métodos.
Los JavaBeans, por otro lado, son componentes basados en ciertas convenciones de nomenclatura y reglas estructurales (como getters/setters y un constructor sin argumentos).
Q2. ¿Se siguen usando los JavaBeans en el desarrollo real hoy en día?
R2. Sí, están muy extendidos.
Son altamente compatibles con frameworks relacionados con Java como JSP, Servlet, Spring Framework, y se utilizan frecuentemente como DTOs, objetivos de DI, etc.
Q3. Hay tantos setters y getters que el código se vuelve desordenado. ¿Cómo puedo manejar esto?
R3. Usa IDEs o herramientas de asistencia como Lombok.
Eclipse e IntelliJ disponen de funcionalidad de generación automática, y Lombok permite generar getters/setters y constructores mediante anotaciones.
import lombok.Data;
@Data
public class UserBean {
private String name;
private int age;
}
Q4. ¿Cómo debo implementar la validación (comprobaciones de entrada) en JavaBeans?
R4. Escribe la lógica dentro de los setters, o utiliza Bean Validation.
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age must be 0 or greater");
}
this.age = age;
}
En Spring, JSR‑380 (Bean Validation) permite realizar comprobaciones basadas en anotaciones.
public class UserBean {
@NotBlank
private String name;
@Min(0)
private int age;
}
Q5. ¿Pueden los JavaBeans usarse en APIs REST?
R5. Sí, es extremadamente común en entornos como Spring Boot.
@RequestBody mapea datos JSON a JavaBeans y los utiliza como DTOs.
@PostMapping("/user")
public ResponseEntity<String> addUser(@RequestBody UserBean user) {
return ResponseEntity.ok("Received name: " + user.getName());
}
Q6. ¿En qué se diferencian los JavaBeans de las clases Entity?
R6. Diferen en propósito y responsabilidad.
Las clases Entity se mapean a tablas de base de datos en JPA y están diseñadas para operaciones de BD mediante anotaciones.
Los JavaBeans se usan como DTOs o para pasar datos hacia/desde la capa de presentación.
8. Resumen | Qué Obtienes al Aprender JavaBeans
Los JavaBeans Son la “Fundación de las Fundaciones” en el Desarrollo de Java
Los JavaBeans son extremadamente fundamentales en el desarrollo de aplicaciones Java, y sin embargo tienen una amplia gama de casos de uso prácticos. Son especialmente poderosos en escenarios como:
- Intercambio de datos de formularios web (JSP / Servlet)
- Gestión de datos en estructuras DI / MVC (Spring Framework)
- Mapeo de JSON (REST API / DTO)
- Guardado en sesiones o archivos (Serializable)
Para principiantes, los JavaBeans pueden parecer “solo un montón de getters y setters”, pero es esta simplicidad la que soporta un diseño robusto y altamente reutilizable.
Lo Que Has Aprendido en Este Artículo
En este artículo, procedimos a través del siguiente flujo de aprendizaje respecto a los JavaBeans:
- Definición y propósito de los JavaBeans
- Estructura y reglas de los JavaBeans
- Diferencias con POJO y ámbito de aplicación
- Integración con JSP, Servlet, Spring
- Resumen de ventajas / desventajas y juicio de casos de uso apropiados
- Fortalecimiento de la comprensión a través de FAQs comunes
Estos conceptos forman una base para avanzar hacia tecnologías Java más avanzadas.
¿Qué Aprender a Continuación?
Después de profundizar tu comprensión de los JavaBeans, se recomiendan los siguientes pasos:
- Relación entre DI del Spring Framework (Inyección de Dependencias) y JavaBeans
- Diferenciación clara entre DTO y Entity
- Simplificación de código usando Lombok o Java Records
- Implementación de validación de entrada segura usando Bean Validation
Al aprender estos, podrás tratar los JavaBeans no meramente como “clases de datos”, sino como una interfaz poderosa para la integración con frameworks y tecnologías circundantes.
Nota Final: Los JavaBeans Son un Lenguaje Común Entre Desarrolladores
Los JavaBeans se usan tan comúnmente en el desarrollo de Java que a menudo se dan por sentados. Por eso, la capacidad de escribir “JavaBeans diseñados correctamente” contribuye directamente a una comunicación fluida con otros desarrolladores. En otras palabras, los JavaBeans son “un formato para expresar tu intención con precisión a través del código”. Al mantener los fundamentos en mente, puedes aplicarlos efectivamente a tu crecimiento técnico futuro.