Comecei a estudar Spring Boot recentemente e percebi que em muitos tutoriais,
inclusive em alguns exemplos oficiais, é mostrado o uso de Bean
da
seguinte forma:
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class MyApp {
public static void main(String... args) {
SpringApplication.run(MyApp.class, args);
}
@Bean
public String message() {
return "Hello!!!";
}
@Bean
public CommandLineRunner print() {
return args -> System.out.println(message());
}
}
O Bean
message
é definido e usado dentro da mesma classe e até aí tudo bem.
Mas percebeu que ele é explícitamente invocado em print
?
Da forma como entendo isso é errado, pois o propósito de um Bean
é ser gerenciado
pelo container, logo, eu não deveria invocá-lo “manualmente” como no exemplo acima.
A forma correta, na minha opinião, é injetá-lo como uma dependência, seguem 2 exemplos:
Exemplo 1: Injetando por parametro no método print
@SpringBootApplication
public class MyApp {
public static void main(String... args) {
SpringApplication.run(MyApp.class, args);
}
@Bean
public String message() {
return "Hello!!!";
}
@Bean
public CommandLineRunner print(final String message) {
return args -> System.out.println(message);
}
}
Exemplo 2: Usando @Autowired
@SpringBootApplication
public class MyApp {
public static void main(String... args) {
SpringApplication.run(MyApp.class, args);
}
@Autowired
private String message;
@Bean
public String message() {
return "Hello!!!";
}
@Bean
public CommandLineRunner print() {
return args -> System.out.println(this.message);
}
}
Aí eu te pergunto:
- Qual é sua opinião sobre a invocação explícita de
Bean
s? - Fazer isto é, de alguma forma, prejudicial ou tanto faz?
- Vc também já isso acontecer?
- Há casos de uso em que esta prática é justificavél?