Características Clave de los Beans en Spring
1. ¿Qué es un Bean?
Un Bean es un objeto gestionado por el contenedor de Spring. Spring se encarga de su ciclo de vida, configuración e inyección de dependencias.
@Component
public class MyService {
// Este es un Bean gestionado por Spring
}
2. Características Clave
a. Gestión del Ciclo de Vida
Spring crea, inicializa y destruye los Beans automáticamente. Puedes usar @PostConstruct y @PreDestroy para engancharte al ciclo de vida.
@PostConstruct
public void init() {
// Se ejecuta después de la creación del Bean
}
b. Inyección de Dependencias
Spring permite inyectar Beans en otros Beans usando @Autowired o constructor injection.
@Service
public class OrderService {
@Autowired
private PaymentService paymentService;
}
c. Scope (Ámbito)
Define la visibilidad y duración del Bean: singleton, prototype, request, session.
@Scope("prototype")
@Component
public class PrototypeBean {
// Se crea una nueva instancia cada vez
}
d. Configuración Declarativa
Los Beans pueden definirse mediante anotaciones, XML o clases de configuración.
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
e. Autodetección y Escaneo
Spring escanea paquetes automáticamente si se configura con @ComponentScan.
@SpringBootApplication
@ComponentScan(basePackages = "com.moleculax.services")
public class MoleculaxApp { }
f. Testabilidad
Los Beans son fácilmente mockeables e inyectables en pruebas unitarias con @MockBean o @TestConfiguration.
3. Tipos de Beans
| Tipo de Bean | Anotación | Uso principal |
|---|---|---|
| Genérico | @Component | Lógica común |
| Servicio de negocio | @Service | Encapsula lógica de aplicación |
| Acceso a datos | @Repository | Integración con JPA, JDBC, etc. |
| Web MVC | @Controller | Manejo de peticiones HTTP |
4. Buenas Prácticas
- Usar inyección por constructor para mayor claridad y testabilidad.
- Evitar lógica compleja en métodos
@PostConstruct. - Mantener Beans pequeños y con una sola responsabilidad.
- Documentar el propósito y relaciones de cada Bean.
5. Ejemplo Completo
@Component
public class NotificationService {
public void send(String message) {
System.out.println("Sending: " + message);
}
}
@Service
public class UserService {
private final NotificationService notificationService;
@Autowired
public UserService(NotificationService notificationService) {
this.notificationService = notificationService;
}
public void registerUser(String username) {
notificationService.send("Welcome " + username);
}
}