{"id":11388,"date":"2020-12-02T17:11:08","date_gmt":"2020-12-02T20:11:08","guid":{"rendered":"https:\/\/geekblogti.wpengine.com\/?p=11388"},"modified":"2024-09-24T18:22:09","modified_gmt":"2024-09-24T21:22:09","slug":"spring-framework","status":"publish","type":"post","link":"https:\/\/www.geekhunter.com/pt/blog\/spring-framework\/","title":{"rendered":"Spring Framework: o que \u00e9, seus m\u00f3dulos e exemplos!"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Com 18 anos de exist\u00eancia, o Spring Framework teve suas primeiras atribui\u00e7\u00f5es para o desenvolvimento web.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Com a proposta de facilitar o uso de algo complicado como o Java na \u00e9poca, foi ganhando popularidade at\u00e9 que explodiu ao lan\u00e7arem o <a href=\"https:\/\/geekblogti.wpengine.com\/tudo-o-que-voce-precisa-saber-sobre-o-spring-boot\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Spring Boot<\/strong><\/a>, que tamb\u00e9m ser\u00e1 falado nesse artigo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ent\u00e3o ficou bem claro que os m\u00f3dulos e ferramentas lan\u00e7adas para auxiliar o uso do Java s\u00e3o indispens\u00e1veis para uma maior produtividade e flu\u00eancia no c\u00f3digo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-o-que-o-spring-framework\">O que \u00e9 o Spring Framework?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Spring Framework \u00e9 um framework desenvolvido para a plataforma <a href=\"https:\/\/geekblogti.wpengine.com\/tudo-sobre-java\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Java<\/strong><\/a> baseado nos padr\u00f5es de projetos (<a href=\"https:\/\/geekblogti.wpengine.com\/design-patterns\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Design Patterns<\/strong><\/a>), invers\u00e3o de controle e inje\u00e7\u00e3o de depend\u00eancia. \u00c9 constitu\u00eddo por diversos e completos m\u00f3dulos capazes de dar um boost na aplica\u00e7\u00e3o Java.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de aprofundarmos no framework, vamos entender esses importantes Design Patterns em que o Spring Framework \u00e9 baseado (com exemplos \ud83d\ude43).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-invers-o-de-controle\">Invers\u00e3o de Controle<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Invers\u00e3o de controle (Inversion of Control ou IoC, em ingl\u00eas) trata-se da <strong>interrup\u00e7\u00e3o do fluxo de execu\u00e7\u00e3o de um c\u00f3digo<\/strong> retirando, de certa forma, o controle sobre ele e delegando-o para uma depend\u00eancia ou container. O principal prop\u00f3sito \u00e9 minificar o acoplamento do c\u00f3digo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No Java, falamos mesmo em desacoplamento das classes. Isso permite um ganho enorme em manutenibilidade, al\u00e9m da facilidade de trocar ou acrescentar comportamentos ao sistema, se necess\u00e1rio. Tamb\u00e9m diminui a possibilidade de ocorr\u00eancia bugs em cascata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No Spring Framework, as inst\u00e2ncias das classes s\u00e3o fracamente acopladas, ou seja, a interdepend\u00eancia entre os objetos \u00e9 m\u00ednima.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A invers\u00e3o de controle, no Spring, \u00e9 facilitada por outro Design Pattern: Inje\u00e7\u00e3o de Depend\u00eancia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-inje-o-de-depend-ncia\">Inje\u00e7\u00e3o de Depend\u00eancia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A inje\u00e7\u00e3o de depend\u00eancia tem o prop\u00f3sito de <strong>evitar o acoplamento de c\u00f3digo numa aplica\u00e7\u00e3o<\/strong>. Em outras palavras, \u00e9 a proveni\u00eancia de inst\u00e2ncias de classes que um objeto precisa sem que este instancie por si mesmo. Podemos dizer que a inje\u00e7\u00e3o de depend\u00eancia \u00e9 uma forma de aplicar a invers\u00e3o de controle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No Spring Framework, podemos fazer a inje\u00e7\u00e3o de depend\u00eancia da seguinte forma:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>anota\u00e7\u00e3o @Autowired;<\/li><li>utilizando o construtor da classe (Constructor Injection);<\/li><li>utilizando o m\u00e9todo setter (Setter Injection).<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A anota\u00e7\u00e3o @Autowired define um ponto onde a inje\u00e7\u00e3o da depend\u00eancia ser\u00e1 realizada. Por exemplo, no c\u00f3digo abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Service\npublic class ExampleService {\n\n\t@Autowired\n\tprivate ExampleRepository exampleRespository;\n\n\t\/\/ construtor, getters e setters\n\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Define-se que uma inst\u00e2ncia da classe ExampleRepository \u00e9 uma depend\u00eancia que ser\u00e1 injetada pelo container spring. O Spring gerenciar\u00e1 todo o ciclo de vida dessa depend\u00eancia em todas as vezes que ExampleService for instanciado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;A utiliza\u00e7\u00e3o de @Autowired como \u00e9 feita no exemplo acima \u00e9 conhecida como Field Injection (Inje\u00e7\u00e3o de depend\u00eancia por campo) e, embora seja a mais utilizada, n\u00e3o \u00e9 a melhor escolha para realizar a inje\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A inje\u00e7\u00e3o por construtor, forma recomendada pela equipe do spring, \u00e9 como o c\u00f3digo abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Service\npublic class ExampleService {\n\n\tprivate ExampleRepository exampleRepository;\n\n\tpublic ExampleService(ExampleRepository exampleRepository) {\n\t\tthis.exampleRepository = exampleRepository;\n\t}\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">As vantagens desse modo de inje\u00e7\u00e3o s\u00e3o o aumento da legibilidade do c\u00f3digo, facilidade de manuten\u00e7\u00e3o e facilidade na constru\u00e7\u00e3o dos testes (O Spring Framework oferece suporte para testes tamb\u00e9m \ud83d\ude35).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A inje\u00e7\u00e3o por m\u00e9todo setter:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Service\npublic class ExampleService {\n\n\tprivate ExampleRepository exampleRepository;\n\n\t@Autowired\n\tpublic void setExampleRepository(ExampleRepository                            \t\t\t\t\t\t              exampleRepository) {\n\n\tthis.exampleRepository = exampleRepository\n\t\n\t}\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Agora que falamos desses importantes aspectos do Spring Framework, vamos falar de alguns de seus m\u00f3dulos principais e algumas <strong>annotations <\/strong>utilizadas. No final, vou mostrar um pequeno tutorial java spring com algumas annotations desses m\u00f3dulos (\ud83d\udc4f\ud83d\udc4f\ud83d\udc4f).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Obs. 1:<\/strong> Pode ser que alguma annotation seja de outro m\u00f3dulo, mas isso nada muda.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Obs. 2:<\/strong> As annotations abaixo s\u00e3o as principais de cada m\u00f3dulo, mas n\u00e3o se resume a elas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Obs. 3:<\/strong> Parte das annotations precisam ou suportam par\u00e2metros, apesar de n\u00e3o tratarmos desse aspecto. No exemplo que faremos sobre uma aplica\u00e7\u00e3o Spring RESTful, isso ficar\u00e1 vis\u00edvel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-spring-boot-no-spring-framework\">Spring Boot no Spring Framework<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"900\" height=\"300\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2020\/12\/spring-boot.jpg\" alt=\"spring-boot-framework\" class=\"wp-image-11404\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-boot.jpg 900w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-boot-150x50.jpg 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-boot-100x33.jpg 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-boot-600x200.jpg 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-boot-450x150.jpg 450w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">O Spring Boot facilita bastante a cria\u00e7\u00e3o de aplica\u00e7\u00f5es Java que utilizam o ecossistema Spring com pouca ou nenhuma configura\u00e7\u00e3o para executar o projeto. Ele <strong>abstrai toda a complexidade que uma configura\u00e7\u00e3o completa pode trazer<\/strong> (\u201cjust run\u201d \ud83d\ude0d).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esse m\u00f3dulo do Spring Framework foi desenvolvido com base na ideia de conven\u00e7\u00e3o sobre configura\u00e7\u00e3o. Ou seja, apenas utilizar subm\u00f3dulos necess\u00e1rios sem preocupa\u00e7\u00e3o com o trabalho de configura\u00e7\u00e3o do spring.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Algumas anota\u00e7\u00f5es utilizadas:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Configuration<\/strong> &#8211; define uma classe como fonte de defini\u00e7\u00f5es de beans e \u00e9 uma das anota\u00e7\u00f5es essenciais se voc\u00ea estiver usando a configura\u00e7\u00e3o baseada em Java.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Bean<\/strong> &#8211; utilizada em m\u00e9todos de uma classe, geralmente marcada com @Configuration, indicando ao Spring Framework que deve invocar aquele m\u00e9todo e gerenciar o objeto retornado por ele, ou seja, agora este objeto pode ser injetado em qualquer ponto da sua aplica\u00e7\u00e3o (Lembra da inje\u00e7\u00e3o de depend\u00eancia?).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Autowired<\/strong> &#8211; j\u00e1 falada e exemplificada, define pontos de inje\u00e7\u00e3o de depend\u00eancias dentro de uma classe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Scope<\/strong> &#8211; define o tempo de vida de um objeto gerenciado pelo Spring Framework. Podemos combinar com outras anota\u00e7\u00f5es como @Component ou @Bean.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Primary<\/strong> &#8211; \u00e9 usada quando temos dois m\u00e9todos anotados com @Bean que retornam o mesmo tipo de objeto. O Spring precisa saber qual deles ser\u00e1 injetado por padr\u00e3o quando for solicitado. Indica qual o deve ser o padr\u00e3o.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Obs.: Para alterar o padr\u00e3o, utiliza-se a annotation @Qualifier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@SpringBootApplication<\/strong> &#8211; combina as @Configuration, @EnableAutoConfiguration e @ComponentScan. Desse modo, n\u00e3o precisamos instalar um servidor Web, pois o Spring Boot&nbsp;j\u00e1 vem com um servidor Tomcat incorporado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;Essa anota\u00e7\u00e3o ativa a configura\u00e7\u00e3o baseado em Java, bem como o recurso de varredura e configura\u00e7\u00e3o autom\u00e1tica de componentes do Spring Boot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Profile<\/strong> &#8211; define para qual profile tal bean deve ser carregado. Comum quando existem classes que somente devem ser carregadas em ambiente de desenvolvimento ou de produ\u00e7\u00e3o ou de teste.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@EnableAutoConfiguration<\/strong> &#8211;&nbsp; ativa o recurso de configura\u00e7\u00e3o autom\u00e1tica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@EnableAsync<\/strong> &#8211; quando precisa-se de a\u00e7\u00f5es no sistema em background (outra thread). Essa annotation deve ser colocada em classes anotadas com @Configuration, para que o Spring habilite o suporte de execu\u00e7\u00e3o ass\u00edncrona.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Async<\/strong> &#8211; habilitado o uso de execu\u00e7\u00e3o de m\u00e9todos ass\u00edncronos com @EnableAsync, marca-se qualquer m\u00e9todo de um bean gerenciado. Assim que tal m\u00e9todo \u00e9&nbsp; invocado, o Spring vai garantir que a execu\u00e7\u00e3o dele ser\u00e1 em outra thread.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Component<\/strong> &#8211; indica que uma classe vai ser gerenciada pelo container do Spring (Spring Container IoC).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@ComponentScan<\/strong> &#8211; utilizada em classes de configura\u00e7\u00e3o indicando quais pacotes ou classes devem ser escaneadas pelo Spring para que essa configura\u00e7\u00e3o funcione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Service<\/strong> &#8211; define uma classe de servi\u00e7o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@RestControllerAdvice<\/strong> &#8211; combina\u00e7\u00e3o das annotations @ControllerAdvice e @ResponseBody. Indica ao Spring que se trata de um componente especializado em exce\u00e7\u00f5es e que o retorno dos m\u00e9todos da mesma devem ser inseridos no corpo da resposta HTTP e convertidos para JSON.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@ControllerAdvice<\/strong> &#8211; lida com exce\u00e7\u00f5es num aplicativo Spring MVC. \u00c9 usada para manipula\u00e7\u00e3o global de erros. Tem o controle total sobre o corpo da resposta e c\u00f3digo de status.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/geekblogti.wpengine.com\/tudo-o-que-voce-precisa-saber-sobre-o-spring-boot\/\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" width=\"720\" height=\"200\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2020\/12\/cta-spring-boot.png\" alt=\"\" class=\"wp-image-11408\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-spring-boot.png 720w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-spring-boot-150x42.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-spring-boot-100x28.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-spring-boot-600x167.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-spring-boot-450x125.png 450w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-spring-data-jpa\">Spring Data JPA<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O Spring Data tem o prop\u00f3sito de fornecer um modelo de programa\u00e7\u00e3o baseado em Spring para <strong>acesso a dados de maneira f\u00e1cil e sem complica\u00e7\u00f5es<\/strong>, mantendo as caracter\u00edsticas especiais do armazenamento de dados subjacente \ud83d\ude2e.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Facilita o uso de tecnologias de acesso a dados, banco de dados relacionais e n\u00e3o relacionais, possui caracter\u00edsticas com abstra\u00e7\u00f5es de mapeamento e objetos personaliz\u00e1veis e consultas din\u00e2micas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Algumas anota\u00e7\u00f5es utilizadas:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Transactional<\/strong> &#8211; configura o comportamento transacional de um m\u00e9todo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@NoRepositoryBean<\/strong> &#8211; para que o Spring Framework n\u00e3o crie beans de interface de reposit\u00f3rios comuns para reposit\u00f3rios filhos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Repository<\/strong> &#8211; define um reposit\u00f3rio bean (essa n\u00e3o \u00e9 bem do Spring Data, mas \u00e9 bem associada a ele)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Query<\/strong> &#8211; usada para fornecer uma implementa\u00e7\u00e3o JPQL para um m\u00e9todo de reposit\u00f3rio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Param<\/strong> &#8211; definir par\u00e2metros nomeados que ser\u00e3o passados para consultas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Id<\/strong> &#8211; define que o atributo \u00e9 um identificador.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Transient<\/strong> &#8211; marca um campo de uma classe de modelo como transit\u00f3rio. Portanto, o mecanismo de armazenamento de dados n\u00e3o l\u00ea ou grava o valor deste campo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@GeneratedValue<\/strong> &#8211; define que a gera\u00e7\u00e3o do id da entidade ser\u00e1 gerenciada pelo provedor de persist\u00eancia (JPA).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-spring-security-no-spring-framework\">Spring Security no Spring Framework<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O Spring Security \u00e9 uma estrutura de autentica\u00e7\u00e3o e autoriza\u00e7\u00e3o poderosa e altamente personaliz\u00e1vel para <strong>prote\u00e7\u00e3o de aplica\u00e7\u00f5es<\/strong> baseados em Spring Framework.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Concentra-se em fornecer autentica\u00e7\u00e3o e autoriza\u00e7\u00e3o para aplica\u00e7\u00f5es Java. Para isso, oferece facilidades para extens\u00f5es e atende toda a personaliza\u00e7\u00e3o de seguran\u00e7a que um projeto Java Spring precisa \ud83d\ude0e.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Algumas anota\u00e7\u00f5es utilizadas:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@EnableWebSecurity<\/strong> &#8211; habilita recursos de seguran\u00e7a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@EnableAuthorizationServer<\/strong> &#8211; habilita o AuthorizationServer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@EnableResourceServer<\/strong> &#8211; permite que a aplica\u00e7\u00e3o se comporte como um Resource Server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@EnableGlobalMethodSecurity<\/strong> &#8211; ativa a seguran\u00e7a de m\u00e9todo global.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Secured<\/strong> &#8211; \u00e9 usada para especificar uma lista de fun\u00e7\u00f5es (pap\u00e9is) em um m\u00e9todo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PreAuthorize<\/strong> &#8211; fornece controle de acesso baseado em express\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PreFilter<\/strong> &#8211; filtra um argumento de cole\u00e7\u00e3o antes de executar o m\u00e9todo, definindo regras de seguran\u00e7a refinadas usando o Spring EL. A filtragem \u00e9 aplicada numa lista que est\u00e1 sendo passada como par\u00e2metro de entrada para o m\u00e9todo anotado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PosFilter<\/strong> &#8211; filtra listas de objetos com base nas regras de seguran\u00e7a personalizadas que definimos ou seja, define para filtrar a lista de retorno de um m\u00e9todo aplicando essa regra a todos os elementos da lista.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se o valor avaliado for verdadeiro, o item ser\u00e1 mantido na lista, caso contr\u00e1rio, o item ser\u00e1 removido.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@AuthenticationPrincipal <\/strong>&#8211; indica ao Spring a inje\u00e7\u00e3o do usu\u00e1rio logado na aplica\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-spring-web-e-spring-mvc\">Spring Web e Spring MVC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O Spring Web \u00e9 utilizado para criar aplicativos Web, incluindo RESTful, utilizando o Spring MVC. Indispens\u00e1vel para cria\u00e7\u00e3o aplica\u00e7\u00f5es web baseadas em Spring Framework.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O Spring MVC \u00e9 um m\u00f3dulo do spring que ajuda a criar aplica\u00e7\u00f5es Web de maneira f\u00e1cil, simples e elegante, o que possibilita a constru\u00e7\u00e3o de aplica\u00e7\u00f5es web robustas e flex\u00edveis e, como o nome sugere, \u00e9 baseado no pattern MVC \ud83d\udc40.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No Spring MVC, um controller \u00e9 criado utilizando a anota\u00e7\u00e3o @Controller ou @RestController e para cada m\u00e9todo \u00e9 feita um mapeamento para a URL que o controlador ser\u00e1 chamado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Algumas anota\u00e7\u00f5es utilizadas:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@RequestMapping<\/strong> &#8211; mapeia requisi\u00e7\u00f5es REST.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Controller<\/strong> &#8211; define uma classe que cont\u00e9m m\u00e9todos para estrutura Spring MVC.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@RestController<\/strong> &#8211; define uma classe que cont\u00e9m m\u00e9todos para uma API RESTful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@RequestBody<\/strong> &#8211; mapeia o corpo da solicita\u00e7\u00e3o HTTP para um objeto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PathVariable<\/strong> &#8211; define o recebimento de par\u00e2metros de uma requisi\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@RequestParam<\/strong> &#8211; com essa anota\u00e7\u00e3o, podemos acessar par\u00e2metros da solicita\u00e7\u00e3o HTTP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@ExcepetionHandler<\/strong> &#8211; lida com exce\u00e7\u00f5es. A configura\u00e7\u00e3o do Spring detecta essa anota\u00e7\u00e3o e registra o m\u00e9todo como manipulador de exce\u00e7\u00f5es para a classe de exce\u00e7\u00e3o do argumento e suas interfaces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@ResponseStatus<\/strong> &#8211; com essa anota\u00e7\u00e3o, podemos especificar o status HTTP desejado da resposta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@ModelAttribute<\/strong> &#8211; define o modelAttribute que ser\u00e1 utilizado em um form HTML. Podemos acessar elementos que j\u00e1 est\u00e3o no modelo de um MVC @Controller favorecendo a chave do modelo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@CrossOrigin<\/strong> &#8211; ativa a comunica\u00e7\u00e3o entre dom\u00ednios para os m\u00e9todos manipuladores de solicita\u00e7\u00f5es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@SessionAttributes<\/strong> &#8211; declara os atributos da sess\u00e3o listando os nomes dos atributos do modelo que devem ser armazenados de forma transparente na sess\u00e3o, servindo como beans de apoio de formul\u00e1rio entre as solicita\u00e7\u00f5es subsequentes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-jpa-java-persistence-api\"><strong>JPA (Java Persistence API)<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Algumas anota\u00e7\u00f5es importantes utilizadas numa aplica\u00e7\u00e3o Java Spring Framework (essa \u00e9 uma se\u00e7\u00e3o b\u00f4nus, aproveite!)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Entity<\/strong> &#8211; especifica que a classe representa uma entidade no banco de dados. O estado da classe anotada com essa annotation \u00e9 gerenciado pelo contexto de persist\u00eancia subjacente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Basic<\/strong> &#8211; mapeia um tipo de atributo b\u00e1sico para uma coluna de uma tabela no banco de dados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Cacheable<\/strong> &#8211; especifica se uma entidade deve ser armazenada no cache de segundo n\u00edvel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Table<\/strong> &#8211; especifica a tabela da entidade anotada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Column<\/strong> &#8211; especifica o mapeamento entre um atributo b\u00e1sico e a coluna da tabela de banco de dados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Id<\/strong> &#8211; especifica o identificador da entidade. Qualquer entidade precisa ter um atributo identificador, este que \u00e9 usado ao carregar a entidade em um determinado contexto de persist\u00eancia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@GeneratedValue<\/strong> &#8211; especifica que o valor do identificador de entidade \u00e9 gerado automaticamente utilizando a coluna de identidade, uma sequ\u00eancia de banco de dados ou um gerador de tabelas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;O Hibernate (uma implementa\u00e7\u00e3o da JPA) suporta o mapeamento @GeneratedValue mesmo para os identificadores de UUID.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Transient<\/strong> &#8211; especifica que um determinado atributo de entidade n\u00e3o deve ser persistido. Quase a mesma ideia da annotation do Spring Data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Lob<\/strong> &#8211; especifica que o atributo atualmente anotado representa um tipo de objeto grande.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@OneToOne<\/strong> &#8211; especifica um relacionamento de banco de dados um para um.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@ManyToOne<\/strong> &#8211; especifica um relacionamento de banco de dados muitos para um.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@OneToMany<\/strong> &#8211; especifica um relacionamento de banco de dados um para muitos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@ManyToMany<\/strong> &#8211; especifica um relacionamento de banco de dados muitos para muitos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@JoinColumn<\/strong> &#8211; especifica a coluna FOREIGN KEY utilizada ao ingressar em uma associa\u00e7\u00e3o de entidades ou em uma cole\u00e7\u00e3o incorpor\u00e1vel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@JoinTable<\/strong> &#8211; especifica a tabela de links entre duas outras tabelas de banco de dados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@MapsId<\/strong> &#8211; especifica que o identificador de identidade \u00e9 mapeado pelo @ManyToOne atualmente anotado ou @OneToOne associado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@ElementCollection<\/strong> &#8211; especifica uma cole\u00e7\u00e3o de tipos b\u00e1sicos ou incorpor\u00e1veis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Embeddable<\/strong> &#8211; especifica tipos incorpor\u00e1veis. Assim como os tipos b\u00e1sicos, os tipos incorpor\u00e1veis n\u00e3o t\u00eam identidade, sendo gerenciados por sua entidade propriet\u00e1ria.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Embedded<\/strong> &#8211; especifica que um determinado atributo de entidade representa um tipo incorpor\u00e1vel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Enumerated<\/strong> &#8211; especifica que um atributo de entidade representa um tipo enumerado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@JoinColumns<\/strong> &#8211; utilizada para agrupar v\u00e1rias anota\u00e7\u00f5es @JoinColumn que s\u00e3o utilizadas ao mapear a associa\u00e7\u00e3o de entidades ou uma cole\u00e7\u00e3o incorpor\u00e1vel utilizando um identificador composto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@NamedQuery<\/strong> &#8211; especifica uma consulta JPQL que pode ser recuperada posteriormente por seu nome.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@OrderBy<\/strong> &#8211; especifica os atributos da entidade utilizados para classifica\u00e7\u00e3o ao buscar a cole\u00e7\u00e3o atualmente anotada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PersistenceContext<\/strong> &#8211; especifica o EntityManager que precisa ser injetado como depend\u00eancia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Temporal<\/strong> &#8211; especifica o tipo de tempo do atributo de entidade java.util.Date ou java.util.Calendar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Access<\/strong> &#8211; especifica o tipo de acesso da classe de entidade associada, superclasse associada ou atributo de classe e entidade incorpor\u00e1vel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Inheritance<\/strong> &#8211; especifica a estrat\u00e9gia de heran\u00e7a de uma determinada hierarquia de classes de entidade.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@ForeignKey<\/strong> &#8211; especifica a chave estrangeira associada ao mapeamento @JoinColumn.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@Mapkey<\/strong> &#8211; especifica a chave de uma associa\u00e7\u00e3o java.util.Map para o qual o tipo de chave \u00e9 a chave prim\u00e1ria ou atributo da entidade que representa o valor do mapa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@NamedQueries<\/strong> &#8211; utilizada para agrupar v\u00e1rias anota\u00e7\u00f5es @NamedQuery.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PersistenceUnit<\/strong> &#8211; especifica o EntityManagerFactory que precisa ser injetado como depend\u00eancia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PersistenceUnits<\/strong> &#8211; utilizada para agrupar v\u00e1rias anota\u00e7\u00f5es @PersistenceUnit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PostLoad <\/strong>&#8211; especifica um m\u00e9todo de retorno de chamada que \u00e9 acionado depois que uma entidade \u00e9 carregada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PostPersist<\/strong> &#8211; especifica um m\u00e9todo de retorno de chamada que \u00e9 acionado ap\u00f3s uma entidade ser persistida.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PostRemove<\/strong> &#8211; especifica um m\u00e9todo de retorno de chamada que \u00e9 acionado ap\u00f3s uma entidade ser removida.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PostUpdate<\/strong> &#8211; especifica um m\u00e9todo de retorno de chamada que \u00e9 acionado ap\u00f3s uma entidade ser atualizada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PrePersist<\/strong> &#8211; especifica um m\u00e9todo de retorno de chamada que \u00e9 acionado antes que uma entidade seja persistida.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PreRemove<\/strong> &#8211;&nbsp; especifica um m\u00e9todo de retorno de chamada que \u00e9 acionado antes que uma entidade seja removida.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>@PreUpdate<\/strong> &#8211;&nbsp; especifica um m\u00e9todo de retorno de chamada que \u00e9 acionado antes que uma entidade seja atualizada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclus-o\">Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como voc\u00ea pode perceber, existem uma infinidade de ferramentas para facilitar o seu trabalho com Java. Aproveite a lista de annotations e aumente a sua produtividade!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Outro ponto que deve ser destacado tamb\u00e9m \u00e9: &#8220;Spring Framework is inevitable&#8221;. Para aplica\u00e7\u00f5es web e o pr\u00f3prio uso do Java, o framework e seus m\u00f3dulos s\u00e3o fundamentais para acelerar seu trabalho.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Espero que tenham gostado do conte\u00fado, lembrem de acessar o projeto no link acima e at\u00e9 a pr\u00f3xima!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bit.ly\/3lEplgY\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" width=\"720\" height=\"200\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2020\/12\/cta-vagas-java.png\" alt=\"\" class=\"wp-image-11407\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-vagas-java.png 720w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-vagas-java-150x42.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-vagas-java-100x28.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-vagas-java-600x167.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/cta-vagas-java-450x125.png 450w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Com 18 anos de exist\u00eancia, o Spring Framework teve suas primeiras atribui\u00e7\u00f5es para o desenvolvimento web. Com a proposta de facilitar o uso de algo complicado como o Java na \u00e9poca, foi ganhando popularidade at\u00e9 que explodiu ao lan\u00e7arem o Spring Boot, que tamb\u00e9m ser\u00e1 falado nesse artigo. Ent\u00e3o ficou bem claro que os m\u00f3dulos [&hellip;]<\/p>\n","protected":false},"author":167,"featured_media":11403,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-11388","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimiento-de-software"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.3 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Spring Framework: conhe\u00e7a o que \u00e9 e seus m\u00f3dulos<\/title>\n<meta name=\"description\" content=\"Saiba mais sobre o Spring Framework, a ferramenta capaz de facilitar a cria\u00e7\u00e3o de aplica\u00e7\u00f5es em Java, al\u00e9m de seus m\u00f3dulos e anota\u00e7\u00f5es.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Framework: o que \u00e9, seus m\u00f3dulos e exemplos!\" \/>\n<meta property=\"og:description\" content=\"Com 18 anos de exist\u00eancia, o Spring Framework teve suas primeiras atribui\u00e7\u00f5es para o desenvolvimento web. Com a proposta de facilitar o uso de algo\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Geekhunter\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/geekhunterbr\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-12-02T20:11:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-24T21:22:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-framework.png\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"354\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Geekhunter\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@geekhunterbr\" \/>\n<meta name=\"twitter:site\" content=\"@geekhunterbr\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Geekhunter\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/\"},\"author\":{\"name\":\"Geekhunter\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/person\\\/9f62b173345139f7bbdaf55312c3d400\"},\"headline\":\"Spring Framework: o que \u00e9, seus m\u00f3dulos e exemplos!\",\"datePublished\":\"2020-12-02T20:11:08+00:00\",\"dateModified\":\"2024-09-24T21:22:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/\"},\"wordCount\":2790,\"publisher\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/spring-framework.png\",\"articleSection\":[\"Desenvolvimiento de software\"],\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/\",\"name\":\"Spring Framework: conhe\u00e7a o que \u00e9 e seus m\u00f3dulos\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/spring-framework.png\",\"datePublished\":\"2020-12-02T20:11:08+00:00\",\"dateModified\":\"2024-09-24T21:22:09+00:00\",\"description\":\"Saiba mais sobre o Spring Framework, a ferramenta capaz de facilitar a cria\u00e7\u00e3o de aplica\u00e7\u00f5es em Java, al\u00e9m de seus m\u00f3dulos e anota\u00e7\u00f5es.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/spring-framework\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/spring-framework.png\",\"contentUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/spring-framework.png\",\"width\":600,\"height\":354,\"caption\":\"spring-framework\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/spring-framework\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mundo TI\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/category\\\/mundo-ti\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Desenvolvimiento de software\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/category\\\/mundo-ti\\\/desenvolvimiento-de-software\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Spring Framework: o que \u00e9, seus m\u00f3dulos e exemplos!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/\",\"name\":\"Blog de TI\",\"description\":\"Dicas para o RH e profissionais da \u00e1rea TI\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\",\"name\":\"GeekHunter\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/icon-1.png\",\"contentUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/icon-1.png\",\"width\":300,\"height\":300,\"caption\":\"GeekHunter\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/geekhunterbr\\\/\",\"https:\\\/\\\/x.com\\\/geekhunterbr\",\"https:\\\/\\\/www.instagram.com\\\/geekhunterbr\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/geekhunter-brasil\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@GeekHunterOfficial\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/person\\\/9f62b173345139f7bbdaf55312c3d400\",\"name\":\"Geekhunter\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g\",\"caption\":\"Geekhunter\"},\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/author\\\/matias\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Spring Framework: conhe\u00e7a o que \u00e9 e seus m\u00f3dulos","description":"Saiba mais sobre o Spring Framework, a ferramenta capaz de facilitar a cria\u00e7\u00e3o de aplica\u00e7\u00f5es em Java, al\u00e9m de seus m\u00f3dulos e anota\u00e7\u00f5es.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/","og_locale":"pt_BR","og_type":"article","og_title":"Spring Framework: o que \u00e9, seus m\u00f3dulos e exemplos!","og_description":"Com 18 anos de exist\u00eancia, o Spring Framework teve suas primeiras atribui\u00e7\u00f5es para o desenvolvimento web. Com a proposta de facilitar o uso de algo","og_url":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/","og_site_name":"Blog Geekhunter","article_publisher":"https:\/\/www.facebook.com\/geekhunterbr\/","article_published_time":"2020-12-02T20:11:08+00:00","article_modified_time":"2024-09-24T21:22:09+00:00","og_image":[{"width":600,"height":354,"url":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-framework.png","type":"image\/png"}],"author":"Geekhunter","twitter_card":"summary_large_image","twitter_creator":"@geekhunterbr","twitter_site":"@geekhunterbr","twitter_misc":{"Escrito por":"Geekhunter","Est. tempo de leitura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/#article","isPartOf":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/"},"author":{"name":"Geekhunter","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/person\/9f62b173345139f7bbdaf55312c3d400"},"headline":"Spring Framework: o que \u00e9, seus m\u00f3dulos e exemplos!","datePublished":"2020-12-02T20:11:08+00:00","dateModified":"2024-09-24T21:22:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/"},"wordCount":2790,"publisher":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/#primaryimage"},"thumbnailUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-framework.png","articleSection":["Desenvolvimiento de software"],"inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/","url":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/","name":"Spring Framework: conhe\u00e7a o que \u00e9 e seus m\u00f3dulos","isPartOf":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/#primaryimage"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/#primaryimage"},"thumbnailUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-framework.png","datePublished":"2020-12-02T20:11:08+00:00","dateModified":"2024-09-24T21:22:09+00:00","description":"Saiba mais sobre o Spring Framework, a ferramenta capaz de facilitar a cria\u00e7\u00e3o de aplica\u00e7\u00f5es em Java, al\u00e9m de seus m\u00f3dulos e anota\u00e7\u00f5es.","breadcrumb":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.geekhunter.com/pt/blog\/spring-framework\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/#primaryimage","url":"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2020\/12\/spring-framework.png","contentUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2020\/12\/spring-framework.png","width":600,"height":354,"caption":"spring-framework"},{"@type":"BreadcrumbList","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/spring-framework\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/www.geekhunter.com/pt/blog\/"},{"@type":"ListItem","position":2,"name":"Mundo TI","item":"https:\/\/www.geekhunter.com/pt/blog\/category\/mundo-ti\/"},{"@type":"ListItem","position":3,"name":"Desenvolvimiento de software","item":"https:\/\/www.geekhunter.com/pt/blog\/category\/mundo-ti\/desenvolvimiento-de-software\/"},{"@type":"ListItem","position":4,"name":"Spring Framework: o que \u00e9, seus m\u00f3dulos e exemplos!"}]},{"@type":"WebSite","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#website","url":"https:\/\/www.geekhunter.com\/pt\/blog\/","name":"Blog de TI","description":"Dicas para o RH e profissionais da \u00e1rea TI","publisher":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.geekhunter.com/pt/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization","name":"GeekHunter","url":"https:\/\/www.geekhunter.com\/pt\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2024\/10\/icon-1.png","contentUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2024\/10\/icon-1.png","width":300,"height":300,"caption":"GeekHunter"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/geekhunterbr\/","https:\/\/x.com\/geekhunterbr","https:\/\/www.instagram.com\/geekhunterbr\/","https:\/\/www.linkedin.com\/company\/geekhunter-brasil\/","https:\/\/www.youtube.com\/@GeekHunterOfficial"]},{"@type":"Person","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/person\/9f62b173345139f7bbdaf55312c3d400","name":"Geekhunter","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g","caption":"Geekhunter"},"url":"https:\/\/www.geekhunter.com\/pt\/blog\/author\/matias\/"}]}},"_links":{"self":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts\/11388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/users\/167"}],"replies":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/comments?post=11388"}],"version-history":[{"count":0,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts\/11388\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/media\/11403"}],"wp:attachment":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/media?parent=11388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/categories?post=11388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/tags?post=11388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}