
O que é o Spring Framework?
O Spring Framework, ou simplesmente Spring, é um dos frameworks mais populares para criação de aplicações web em Java. Um framework é como uma biblioteca (talvez você esteja mais familiarizado com este termo), mas há algo a considerar. Grosso modo, quando você usa uma biblioteca, você simplesmente cria instâncias das classes que ela contém, chama os métodos de que precisa e, assim, obtém o resultado de que precisa. Em outras palavras, esta é uma abordagem mais imperativa: em seu programa, você indica explicitamente o momento específico em que precisa criar qual objeto, quando chamar qual método específico, etc. Com frameworks, as coisas são um pouco diferentes. Você simplesmente escreve algumas classes próprias e escreve alguma lógica nelas, mas então a própria estrutura cria instâncias de suas classes e chama seus métodos. Suas classes geralmente implementam algumas interfaces do framework ou herdam algumas de suas classes, fornecendo assim algumas funcionalidades que já foram escritas para você. Mas isso nem sempre é o caso. Por exemplo, o Spring tenta o máximo possível evitar esse acoplamento rígido (onde suas classes dependem diretamente de classes/interfaces no framework). Ele usa anotações para conseguir isso. Voltaremos a isso mais tarde. Mas é importante entender que o Spring é apenas uma coleção de classes e interfaces disponíveis para você usar :) Também quero observar desde já que o Spring pode ser usado não apenas para aplicativos da Web, mas também para os programas de console mais comuns tão familiares a todos nós. E ainda vamos escrever um deles hoje. fornecendo assim algumas funcionalidades que já foram escritas para você. Mas isso nem sempre é o caso. Por exemplo, o Spring tenta o máximo possível evitar esse acoplamento rígido (onde suas classes dependem diretamente de classes/interfaces no framework). Ele usa anotações para conseguir isso. Voltaremos a isso mais tarde. Mas é importante entender que o Spring é apenas uma coleção de classes e interfaces disponíveis para você usar :) Também quero observar desde já que o Spring pode ser usado não apenas para aplicativos da Web, mas também para os programas de console mais comuns tão familiares a todos nós. E ainda vamos escrever um deles hoje. fornecendo assim algumas funcionalidades que já foram escritas para você. Mas isso nem sempre é o caso. Por exemplo, o Spring tenta o máximo possível evitar esse acoplamento rígido (onde suas classes dependem diretamente de classes/interfaces no framework). Ele usa anotações para conseguir isso. Voltaremos a isso mais tarde. Mas é importante entender que o Spring é apenas uma coleção de classes e interfaces disponíveis para você usar :) Também quero observar desde já que o Spring pode ser usado não apenas para aplicativos da Web, mas também para os programas de console mais comuns tão familiares a todos nós. E ainda vamos escrever um deles hoje. O Spring tenta o máximo possível evitar esse acoplamento rígido (onde suas classes dependem diretamente de classes/interfaces no framework). Ele usa anotações para conseguir isso. Voltaremos a isso mais tarde. Mas é importante entender que o Spring é apenas uma coleção de classes e interfaces disponíveis para você usar :) Também quero observar desde já que o Spring pode ser usado não apenas para aplicativos da Web, mas também para os programas de console mais comuns tão familiares a todos nós. E ainda vamos escrever um deles hoje. O Spring tenta o máximo possível evitar esse acoplamento rígido (onde suas classes dependem diretamente de classes/interfaces no framework). Ele usa anotações para conseguir isso. Voltaremos a isso mais tarde. Mas é importante entender que o Spring é apenas uma coleção de classes e interfaces disponíveis para você usar :) Também quero observar desde já que o Spring pode ser usado não apenas para aplicativos da Web, mas também para os programas de console mais comuns tão familiares a todos nós. E ainda vamos escrever um deles hoje. ) Também quero observar imediatamente que o Spring pode ser usado não apenas para aplicativos da Web, mas também para os programas de console mais comuns que são tão familiares para todos nós. E ainda vamos escrever um deles hoje. ) Também quero observar imediatamente que o Spring pode ser usado não apenas para aplicativos da Web, mas também para os programas de console mais comuns que são tão familiares para todos nós. E ainda vamos escrever um deles hoje.Estrutura
Mas o Spring não é apenas uma estrutura específica. Em vez disso, é um nome comum usado para se referir a vários pequenos frameworks, cada um dos quais faz seu próprio tipo de trabalho.
https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
Figura 2.1. Visão geral do Spring Framework
- Acesso de dados
- Rede
- Essencial
- e mais
Por que o Java tem o Spring Framework?
Bem, além do fato de estar na moda, elegante e fresco, posso dizer agora que, assim que você adquirir uma pequena quantidade de habilidade usando o Spring, entenderá como existem todos os tipos de trabalho que você não tem mais fazer e quanto trabalho o Spring assume. Você pode escrever algumas dezenas de linhas de definições de configuração e escrever algumas classes, e você acaba com um projeto de trabalho. Mas assim que você começar a se perguntar quanta coisa está oculta, quanto trabalho está sendo feito e quanto código você teria que escrever se fosse implementar o mesmo projeto baseado em servlets simples ou soquetes e Java puro, seu cabelo vai ficar em pé :) A primavera é até descrita como uma espécie de mágica. Você experimenta isso quando vê que tudo funciona, mas você também tem uma ideia aproximada de como e quanto trabalho está acontecendo nos bastidores - então parece que realmente há algum tipo de mágica em ação :) É mais fácil chamá-la de mágica do que tentar explicar como tudo está interconectado. :) O segundo argumento a favor do estudo do Spring é que aproximadamente 90% das vagas de emprego para desenvolvedores juniores (com base em minhas observações pessoais) exigem conhecimento ou pelo menos uma ideia geral do que é o SpringData
, Web MVC
, e Security
módulos oferecem desenvolvedores sofisticados :) Mas hoje é apenas sobre o básico.
DI/IoC
Se você já tentou ler sobre o Spring, a primeira coisa que encontrou provavelmente foram estes acrônimos: DI/IoC. Agora, eu recomendo fortemente que você faça uma pausa neste artigo e leia este artigo da DZone ! IoC significa inversão de controle. Já mencionei isso de passagem quando escrevi que usar uma biblioteca envolve você mesmo indicar em seu código qual método chamar em qual objeto, mas usar um framework geralmente significa que o framework chamará seu código no momento certo. Ou seja, neste último caso, você não está mais gerenciando o processo de execução do código/programa — o framework faz isso por você. Você passou o controle para o framework (inversão de controle). DI significa injeção de dependência. Com a injeção de dependência, você não cria objetos cat no método principal e depois os passa para seus métodos. Em vez disso, o Spring Framework os cria para você. Você simplesmente diz algo como "Quero um gato aqui" e o framework passa um para você em seu método. Veremos essa abreviação em artigos futuros.Beans e contexto
Um dos conceitos-chave no Spring é um bean. Na verdade, este é apenas um objeto de alguma classe. Suponha que temos um programa que requer 3 objetos: um gato, um cachorro e um papagaio. E temos várias classes com vários métodos. Às vezes precisamos de um gato para um método, às vezes precisamos de um cachorro para um método diferente e às vezes nossos métodos precisam de um gato e um papagaio (por exemplo, o método para alimentar o gato, ha-ha). Para ainda outros métodos, todos os três objetos são necessários. Sim, poderíamos primeiro criar esses três objetos no método main, e então passá-los para nossas classes, e então dentro dessas classes passá-los para os métodos relevantes... E assim por diante ao longo de todo o programa. Mas se também supusermos que ocasionalmente queremos alterar a lista de parâmetros de entrada para nossos métodos (por exemplo, decidirmos reescrever algo ou adicionar novas funcionalidades), então teremos que fazer algumas mudanças no código. E agora imagine que não temos 3, mas 300 desses objetos. Uma alternativa seria reunir todos os nossos objetos em uma lista (List<Object>
), passe-o para todos os métodos e, em seguida, obtenha o objeto necessário enquanto estiver dentro dos métodos. Mas, à medida que o programa é executado, e se algum objeto for adicionado a essa lista, ou pior, e se algum for excluído? Isso tem o potencial de interromper todos os métodos em que usamos um índice para obter objetos da lista. Para evitar esse problema, decidimos armazenar nossos objetos não em uma lista, mas em um mapa, onde a chave é o nome do objeto e o valor é o próprio objeto. Isso nos permite recuperar os objetos de que precisamos simplesmente usando seus nomes, por exemplo, get("papagaio") e, em resposta, obtemos o objeto papagaio. Ou a chave pode ser a classe do objeto e o valor pode ser o próprio objeto. Nesse caso, em vez de especificar o nome do objeto, podemos apenas especificar a classe do objeto de que precisamos. Isso também é conveniente. Ou podemos até mesmo escrever algum tipo de wrapper para o mapa, onde alguns métodos obtêm objetos por seu nome e outros métodos obtêm objetos por sua classe. O que chegamos aqui é chamado decontexto do aplicativo no Spring Framework. Um contexto é uma coleção de beans (objetos). Acessamos um contexto para obter o bean (objeto) que precisamos por seu nome, por seu tipo ou por algum outro meio. Além disso, podemos pedir ao próprio Spring para procurar em seu próprio contexto o bean de que precisamos e passá-lo para o nosso método. Por exemplo, suponha que tivéssemos um método como este:
public void doSomething(Cat cat) {
...
}
Quando o Spring chamou esse método, ele pegou nosso objeto cat de seu contexto e o passou para o método. Mas agora decidimos que, além de um gato, nosso método também precisa de um papagaio. Com o Spring, nada poderia ser mais fácil! Simplesmente escrevemos:
public void doSomething(Cat cat, Parrot parrot) {
...
}
Agora, quando o Spring chama nosso método, ele entende a necessidade de passar um gato e um papagaio, então ele vai ao seu contexto, pega esses dois objetos e os passa para o nosso método. Ao transferir as rédeas do controle para o Spring, também transferimos a responsabilidade de criar objetos e passá-los para nossos métodos, que o Spring chamará. Isso levanta a questão: como o Spring sabe quais objetos (beans) criar?
Formas de configurar um aplicativo
Existem três maneiras principais de configurar um aplicativo , ou seja, maneiras de dizer ao Spring exatamente quais objetos precisamos:- arquivos de configuração XML
- Configuração baseada em Java
- configuração automática
- o método com prioridade máxima, que deve ser preferido, é a configuração automática
- se a configuração automática não puder ser usada para configurar corretamente todos os beans possíveis, use a configuração baseada em Java (que envolve a criação de objetos usando o código Java)
- e o método de prioridade mais baixa é o método antigo — usando arquivos de configuração XML.
GO TO FULL VERSION