Uma comparação entre Spring e Spring Boot
1. Visão geral
Neste artigo, veremos as diferenças entre os frameworks Spring padrão e Spring Boot.
Vamos nos concentrar e discutir como os módulos do Spring, como MVC e Segurança, diferem quando usados no Spring principal e quando usados com Boot.
Leitura adicional:
Configurar um aplicativo Web de inicialização Spring
Algumas das configurações mais úteis para um aplicativo Spring Boot.
Migrando do Spring para o Spring Boot
Veja como migrar corretamente de uma inicialização Spring para Spring.
2. O que é a primavera?
Simply put, the Spring framework provides comprehensive infrastructure support for developing Java applications.
É embalado com alguns recursos interessantes, como injeção de dependência e módulos prontos para o uso, como:
-
Spring JDBC
-
Spring MVC
-
Spring Security
-
Spring AOP
-
Spring ORM
-
Teste de mola
Esses módulos podem reduzir drasticamente o tempo de desenvolvimento de um aplicativo.
Por exemplo, nos primeiros dias do desenvolvimento da Web Java, precisávamos escrever muito código padrão para inserir um registro em uma fonte de dados. Mas, usandoJDBCTemplate do módulo Spring JDBC, podemos reduzi-lo a algumas linhas de código com apenas algumas configurações.
3. O que é o Spring Boot?
O Spring Boot é basicamente uma extensão da estrutura Spring, que eliminou as configurações necessárias para a instalação de um aplicativo Spring.
It takes an opinionated view of the Spring platform which paved the way for a faster and more efficient development eco-system.
Aqui estão apenas alguns dos recursos do Spring Boot:
-
Dependências "iniciantes" opinativas para simplificar a configuração de compilação e aplicativos
-
Servidor incorporado para evitar complexidade na implantação de aplicativos
-
Métricas, verificação de segurança e configuração externa
-
Configuração automática da funcionalidade Spring - sempre que possível
Vamos nos familiarizar com essas duas estruturas passo a passo.
4. Dependências do Maven
Em primeiro lugar, vamos dar uma olhada nas dependências mínimas necessárias para criar um aplicativo da web usando Spring:
org.springframework
spring-web
5.1.0.RELEASE
org.springframework
spring-webmvc
5.1.0.RELEASE
Diferentemente do Spring, o Spring Boot requer apenas uma dependência para ativar e executar um aplicativo Web:
org.springframework.boot
spring-boot-starter-web
2.0.5.RELEASE
Todas as outras dependências são adicionadas automaticamente ao arquivo final durante o tempo de compilação.
Outro bom exemplo é o teste de bibliotecas. Geralmente usamos o conjunto de bibliotecas Spring Test, JUnit, Hamcrest e Mockito. Em um projeto Spring, devemos adicionar todas essas bibliotecas como dependências.
Mas no Spring Boot, precisamos apenas da dependência inicial para testar para incluir automaticamente essas bibliotecas.
Spring Boot provides a number of starter dependencies for different Spring modules. Alguns dos mais comumente usados são:
-
spring-boot-starter-data-jpa
-
spring-boot-starter-security
-
spring-boot-starter-test
-
primavera-boot-starter-web
-
spring-boot-starter-thymeleaf
Para a lista completa de iniciantes, verifique também oSpring documentation.
5. Configuração MVC
Vamos explorar a configuração necessária para criar um aplicativo da web JSP usando Spring e Spring Boot.
Spring requires defining the dispatcher servlet, mappings, and other supporting configurations. Podemos fazer isso usando o arquivoweb.xml ou uma classeInitializer:
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.example");
container.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
Também precisamos adicionar a anotação@EnableWebMvc a uma classe@Configuration e definir um resolvedor de visualização para resolver as visualizações retornadas dos controladores:
@EnableWebMvc
@Configuration
public class ClientWebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver bean
= new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/view/");
bean.setSuffix(".jsp");
return bean;
}
}
Em comparação com tudo isso,Spring Boot only needs a couple of properties to make things work, once we’ve added the web starter:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
Toda a configuração do Spring acima é incluída automaticamente adicionando o boot web starter, através de um processo chamadoauto-configuration.
O que isso significa é que o Spring Boot examinará as dependências, propriedades e beans existentes no aplicativo e habilitará a configuração com base neles.
Obviamente, se queremos adicionar nossa própria configuração personalizada, a configuração automática do Spring Boot será retirada.
5.1. Configurando o mecanismo de modelo
Vamos agora aprender como configurar um motor de templateThymeleaf tanto no Spring quanto no Spring Boot.
No Spring, precisamos adicionar a dependênciathymeleaf-spring5 e algumas configurações para o resolvedor de visualização:
@Configuration
@EnableWebMvc
public class MvcWebConfig implements WebMvcConfigurer {
@Autowired
private ApplicationContext applicationContext;
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver =
new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(applicationContext);
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
registry.viewResolver(resolver);
}
}
Spring Boot 1 exigia apenas a dependência despring-boot-starter-thymeleaf para ativar o suporteThymeleaf em um aplicativo da web. Mas, devido aos novos recursos emThymeleaf3.0, , swe precisa adicionarthymeleaf-layout-dialect also como uma dependência em um aplicativo da web Spring Boot 2.
Assim que as dependências estiverem definidas, podemos adicionar os modelos à pastasrc/main/resources/templates e o Spring Boot os exibirá automaticamente.
6. Configuração de segurança da primavera
Para fins de simplicidade, veremos como a autenticação HTTP Basic padrão é habilitada usando essas estruturas.
Vamos começar examinando as dependências e a configuração de que precisamos para habilitar a segurança usando Spring.
Spring requires both the standard the spring-security-web and spring-security-config dependencies para configurar a segurança em um aplicativo.
A seguir, anotaçãowe need to add a class that extends the WebSecurityConfigurerAdapter and makes use of the @EnableWebSecurity:
@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1")
.password(passwordEncoder()
.encode("user1Pass"))
.authorities("ROLE_USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Aqui, estamos usandoinMemoryAuthentication para configurar a autenticação.
Da mesma forma, o Spring Boot também requer essas dependências para fazê-lo funcionar. Mas precisamos definir apenas a dependência despring-boot-starter-security as this will automatically add all the relevant dependencies to the classpath.
A configuração de segurança no Spring Boot é a mesma acima.
Se você precisa saber como a configuração JPA pode ser obtida tanto no Spring quanto no Spring Boot, consulte nosso artigoA Guide to JPA with Spring.
7. Bootstrap de aplicativo
A diferença básica no bootstrap de um aplicativo no Spring e no Spring Boot está no servlet. O Spring usaweb.xml ouSpringServletContainerInitializer como seu ponto de entrada de bootstrap.
Por outro lado, o Spring Boot usa apenas os recursos do Servlet 3 para inicializar um aplicativo. Vamos falar sobre isso em detalhes.
7.1. Como Spring Bootstraps?
Spring suporta tanto o método legadoweb.xml de bootstrap, bem como o último método Servlet 3+.
Vamos ver a abordagemweb.xml em etapas:
-
O contêiner de servlet (o servidor) lêweb.xml
-
ODispatcherServlet definido emweb.xml é instanciado pelo contêiner
-
DispatcherServlet criaWebApplicationContext lendoWEB-INF/{servletName}-servlet.xml
-
Finalmente, oDispatcherServlet registra os beans definidos no contexto da aplicação
Veja como o Spring inicializa usando a abordagem Servlet 3+:
-
O contêiner procura classes que implementamServletContainerInitializer e executa
-
OSpringServletContainerInitializer encontra todas as classes que implementamWebApplicationInitializer
-
OWebApplicationInitializer cria o contexto com classes XML ou@Configuration
-
OWebApplicationInitializer cria oDispatcherServlet com o contexto criado anteriormente.
7.2. Como Spring Boot Bootstraps?
O ponto de entrada de um aplicativo Spring Boot é a classe que é anotada com@SpringBootApplication:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Por padrão, o Spring Boot usa um contêiner incorporado para executar o aplicativo. Nesse caso, o Spring Boot usa o ponto de entradapublic static void main para iniciar um servidor da web embutido.
Além disso, ele cuida da ligação dos beansServlet, Filter,eServletContextInitializer do contexto do aplicativo para o contêiner de servlet integrado.
Outro recurso do Spring Boot é que ele verifica automaticamente todas as classes no mesmo pacote ou subpacotes da classe principal em busca de componentes.
O Spring Boot oferece a opção de implantá-lo como um arquivo da web em um contêiner externo também. Nesse caso, temos que estender oSpringBootServletInitializer:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
// ...
}
Aqui, o contêiner de servlet externo procura pela classe principal definida no arquivo META-INF do arquivo da web eSpringBootServletInitializer cuidará de vincularServlet, Filter,eServletContextInitializer.
8. Empacotamento e implantação
Finalmente, vamos ver como um aplicativo pode ser empacotado e implantado. Ambas as estruturas suportam tecnologias comuns de gerenciamento de pacotes como Maven e Gradle. Mas quando se trata de implantação, essas estruturas diferem bastante.
Por exemplo, oSpring Boot Maven Plugin fornece suporte a Spring Boot no Maven. Ele também permite empacotar arquivos executáveis de jar ou war e executar um aplicativo "no local".
Algumas das vantagens do Spring Boot sobre o Spring no contexto da implantação incluem:
-
Fornece suporte a contêiner incorporado
-
Provisão para executar os jars independentemente usando o comandojava -jar
-
Opção para excluir dependências para evitar possíveis conflitos de jar ao implantar em um contêiner externo
-
Opção para especificar perfis ativos ao implementar
-
Geração de porta aleatória para testes de integração
9. Conclusão
Neste tutorial, aprendemos sobre as diferenças entre Spring e Spring Boot.
Em poucas palavras, podemos dizer que o Spring Boot é simplesmente uma extensão do Spring para tornar o desenvolvimento, teste e implantação mais conveniente.