Arquitetura e Desenvolvimento com Spring Boot: Do Core ao Ecossistema de Segurança

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;
    }
}

Tags: SpringBoot java SpringSecurity MyBatis Redis

Publicado em 7-30 10:50