Tengo métodos generadores de códigos de barras a los que llamo desde Controller en mi proyecto Java (Spring Boot). La clase de generador es como se muestra a continuación:
@Component @NoArgsConstructor public class QRCodeGenerator { private static final int LABEL_X_POS = 45; private static final int LABEL_Y_POS = 20; @Value("${qr-code.margin}") private int margin; @Value("${qr-code.fontSize}") private int fontSize; public ResponseEntity<Resource> getQRCode(String data) throws IOException { // code omitted for brevity addLabel(image, label); final ByteArrayResource resource = new ByteArrayResource(toByteArray(image)); return ResponseEntity.ok().body(resource); } private static byte[] toByteArray(BufferedImage image) throws IOException { // code omitted for brevity } private void addLabel(BufferedImage source, String text) { int x = LABEL_X_POS; int y = LABEL_Y_POS; // code omitted for brevity } } Primero comencé a usar esta clase como estática, pero luego eliminé la estática para leer los datos en application.yml correctamente.
Aquí hay algunos puntos que necesito que me aclaren:
1. Soy nuevo en Spring y, por lo que veo, los servicios de Spring generalmente se usan para proporcionar datos de la base de datos o cualquier otro servicio, puntos finales, etc. ¿Es eso cierto?
2. ¿Debo crear un servicio para la clase anterior (no necesito acceder a la base de datos en esa clase)? ¿O es mejor el enfoque (crear como un componente y luego inyectarlo en mi controlador)?
3. Hay muchas opiniones diferentes con respecto a las clases Util estáticas. Entonces, ¿qué hay de convertir esta clase en una clase Util estática? ¿Es mejor que ahora o usarlo como un servicio de primavera?
Conviértalo en un servicio de primavera y podrá sustituirlo fácilmente por un simulacro cuando escriba una prueba para el controlador. De lo contrario, no podrá burlarse de él (a menos que use cosas como Powernock). Dado que ya está inyectando valores en él, es mucho más fácil mantenerlo como un componente de Spring.
En general, es una optimización prematura usar clases útiles estáticas y puede interferir con las pruebas. Usaría clases de utilidad estáticas solo si contienen solo métodos estáticos que no tienen efectos secundarios, que no necesitan acceso a los datos de configuración y que no me importa no poder simular. Los métodos que uso en el código de validación de entrada serían un ejemplo de algo para lo que podría usar métodos estáticos. Pero tiene la mayor flexibilidad, por ejemplo, para poder inyectar configuraciones, si las mantiene como componentes Spring.
Aquí hay algunas opiniones sobre sus preguntas: