Fundamentos do Spring Boot
O Spring Boot revolucionou o desenvolvimento Java ao adotar o paradigma de Convenção sobre Configuração. Seu núcleo baseia-se na auto-configuração, permitindo que desenvolvedorse iniciem projetos rapidamente sem a necessidade de configurações XML extensas.
O Mecanismo de Auto-Configuração
A auto-configuração funciona através da anotação @SpringBootApplication, que combina @Configuration, @EnableAutoConfiguration e @ComponentScan. O Spring Boot analisa as dependências no pom.xml e configura automaticamente os beans correspondentes.
As configurações automáticas são mapeadas no arquivo spring.factories dentro do JAR spring-boot-autoconfigure. Para customizar esses comportamentos, basta definir propriedades no arquivo application.yml ou criar seus próprios beans, que substituirão os padrões (condicionalismo).
Gerenciamento de Configurações com YAML
O formato YAML é preferido por sua legibilidade e suporte a estruturas hierárquicas. É crucial manter a indentação correta.
# Exemplo de configuração de perfil e dados
usuario:
nome: "Carlos Silva"
idade: 30
habilidades: [Java, Spring, Docker]
detalhes:
ativo: true
data_registro: 2023-10-01
Para mapear essas propriedades em classes Java, utilizamos a anotação @ConfigurationProperties:
@Data
@Component
@ConfigurationProperties(prefix = "usuario")
public class PerfilUsuario {
private String nome;
private Integer idade;
private List<String> habilidades;
private Map<String, Object> detalhes;
}
Gestão de Ambientes (Profiles)
O Spring Boot facilita a alternância entre ambientes de desenvolvimento, teste e produção. No arquivo principal, define-se qual perfil está ativo:
spring:
profiles:
active: prod
---
spring:
config:
activate:
on-profile: dev
server:
port: 8081
---
spring:
config:
activate:
on-profile: prod
server:
port: 80
Recursos Estáticos e Customização MVC
Por padrão, o Spring Boot busca recursos estáticos em diretórios como /static, /public ou /resources. A prioridade segue a ordem: resources > static > public.
Para estender as funcionalidades do Spring MVC sem perder as auto-configurações, implementamos a interface WebMvcConfigurer:
@Configuration
public class CustomMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// Redirecionamento direto para uma view
registry.addViewController("/home").setViewName("index");
}
}
Integração com Banco de Dados e Mybatis
Para otimizar conexões, o uso do Druid (Alibaba) é comum devido aos seus recursos de monitoramento. Abaixo, a configuração de integração com Mybatis:
@Mapper
@Repository
public interface ClienteMapper {
@Select("SELECT * FROM clientes WHERE id = #{id}")
Cliente buscarPorId(@Param("id") Long id);
@Insert("INSERT INTO clientes(nome, email) VALUES(#{nome}, #{email})")
int salvar(Cliente cliente);
}
Segurança com Spring Security
O Spring Security oferece uma camada robusta para autenticação e autorização via AOP (Programação Orientada a Aspectos).
@EnableWebSecurity
public class SecurityAppConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/api/**").authenticated()
.anyRequest().permitAll()
.and()
.formLogin();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
String senhaCripto = new BCryptPasswordEncoder().encode("12345");
auth.inMemoryAuthentication()
.passwordEncoder(new BCryptPasswordEncoder())
.withUser("gestor").password(senhaCripto).roles("ADMIN");
}
}
Documentação de API com Swagger
O Swagger gera documentação interativa para suas APIs REST. Para configurá-lo no Spring Boot:
@Configuration
@EnableSwagger2
public class SwaggerProviderConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.projeto.controller"))
.build();
}
}
Processamento Assíncrono e Agendamento
Tarefas demoradas podem ser executadas em segundo plano para não bloquear a thread principal.
@Service
public class AgendadorService {
@Async
public void processarRelatorio() {
// Lógica assíncrona
}
@Scheduled(cron = "0 0 12 * * ?") // Executa todo dia ao meio-dia
public void backupDiario() {
System.out.println("Iniciando backup automático...");
}
}
Persistência com Redis e Serialização Personalizada
Ao trabalhar com Redis, é essencial configurar um RedisTemplate que utilize serilaização JSON para facilitar a leitura dos dados por outros sistemas.
@Configuration
public class CustomRedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
template.setValueSerializer(serializer);
template.setKeySerializer(new StringRedisSerializer());
return template;
}
}