Eu ouço muito sobre o Spring , as pessoas estão dizendo em toda a web que o Spring é uma boa estrutura para o desenvolvimento da web. Para que exatamente serve o Spring Framework?
Eu ouço muito sobre o Spring , as pessoas estão dizendo em toda a web que o Spring é uma boa estrutura para o desenvolvimento da web. Para que exatamente serve o Spring Framework?
Respostas:
Basicamente, a primavera é uma estrutura para Injeção de dependência que é um padrão que permite construir sistemas muito dissociados.
Por exemplo, suponha que você precise listar os usuários do sistema e, assim, declarar uma interface chamada UserLister
:
public interface UserLister {
List<User> getUsers();
}
E talvez uma implementação acessando um banco de dados para obter todos os usuários:
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
Na sua opinião, você precisará acessar uma instância (apenas um exemplo, lembre-se):
public class SomeView {
private UserLister userLister;
public void render() {
List<User> users = userLister.getUsers();
view.render(users);
}
}
Observe que o código acima não inicializou a variável userLister
. O que deveríamos fazer? Se eu instanciar explicitamente o objeto assim:
UserLister userLister = new UserListerDB();
... Eu associaria a visão à minha implementação da classe que acessa o banco de dados. E se eu quiser mudar da implementação do banco de dados para outra que obtenha a lista de usuários de um arquivo separado por vírgula (lembre-se, é um exemplo)? Nesse caso, eu retornaria ao meu código e alteraria a linha acima para:
UserLister userLister = new UserListerCommaSeparatedFile();
Isso não tem problema com um programa pequeno como este, mas ... O que acontece em um programa que possui centenas de visualizações e um número semelhante de classes de negócios? A manutenção se torna um pesadelo!
O que o Spring faz é conectar as classes usando um arquivo XML ou anotações. Dessa forma, todos os objetos são instanciados e inicializados pelo Spring e injetados nos lugares certos (Servlets, Web Frameworks, classes de negócios, DAOs, etc, etc, etc) ...)
Voltando ao exemplo no Spring, precisamos apenas de um setter para o userLister
campo e ter um arquivo XML como este:
<bean id="userLister" class="UserListerDB" />
<bean class="SomeView">
<property name="userLister" ref="userLister" />
</bean>
ou mais simplesmente anote o arquivado em nossa classe de exibição com @Inject
:
@Inject
private UserLister userLister;
Dessa forma, quando a vista é criada, ela magicamente estará UserLister
pronta para funcionar.
List<User> users = userLister.getUsers(); // This will actually work
// without adding any line of code
Isso é ótimo! Não é?
UserLister
interface? Apenas mude o XML.UserLister
implementação pronta? Programe uma implementação simulada temporal UserLister
e facilite o desenvolvimento da visualização.Existem algumas outras opções para injeção de dependência por lá, o que, na minha opinião, tornou o Spring tão famoso, além de sua simplicidade, elegância e estabilidade, é que os caras do SpringSource programaram muitos POJOs que ajudam a integrar o Spring a muitos outros frameworks comuns sem ser necessário. intrusivo em sua aplicação. Além disso, o Spring possui vários bons subprojetos, como o Spring MVC, o Spring WebFlow, o Spring Security e novamente uma lista extensa de etc.
Espero que isto ajude. De qualquer forma, encorajo você a ler o artigo de Martin Fowler sobre Injeção de Dependência e Inversão de Controle, porque ele faz isso melhor do que eu. Depois de conhecer os fundamentos dar uma olhada em Documentação da Primavera , na minha opinião, ele é utilizado para ser o melhor livro Primavera nunca.
O Spring contém ( como Skaffman corretamente apontou ) uma estrutura MVC. Para explicar resumidamente, aqui estão minhas contribuições. O Spring suporta a segregação da camada de serviço, da web e da empresa, mas o que realmente faz melhor é a "injeção" de objetos. Então, para explicar que, com um exemplo, considere o exemplo abaixo:
public interface FourWheel
{
public void drive();
}
public class Sedan implements FourWheel
{
public void drive()
{
//drive gracefully
}
}
public class SUV implements FourWheel
{
public void drive()
{
//Rule the rough terrain
}
}
Agora, no seu código, você tem uma classe chamada RoadTrip da seguinte maneira
public class RoadTrip
{
private FourWheel myCarForTrip;
}
Agora sempre que você quiser uma instância do Trip; Às vezes, você pode querer que um SUV inicialize o FourWheel ou, às vezes, o Sedan. Realmente depende do que você deseja com base em situações específicas.
Para resolver esse problema, você deseja ter um padrão de fábrica como padrão de criação. Onde uma fábrica retorna a instância correta. Então, eventualmente, você terá muito código de cola para instanciar os objetos corretamente. O Spring faz o trabalho do código de cola melhor sem esse código. Você declara mapeamentos em XML e ele inicializa os objetos automaticamente. Também faz muito uso da arquitetura singleton para instâncias e isso ajuda no uso otimizado da memória.
Isso também é chamado de Inversão de controle. Outras estruturas para fazer isso são o guice do Google, o contêiner Pico etc.
Além disso, o Spring possui uma estrutura de validação, amplo suporte para a camada DAO em colaboração com JDBC, iBatis e Hibernate (e muito mais). Fornece excelente controle transacional sobre transações de banco de dados.
Há muito mais no Spring que pode ser lido em bons livros como "Pro Spring".
Os seguintes URLs também podem ser úteis.
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article .tss? l = SpringFramework
Antigamente, o Spring era um quadro de injeção de dependência que funcionava apenas como ( Guice , PicoContainer , ...), mas hoje em dia é uma solução total para a criação do seu aplicativo corporativo .
A injeção de dependência da mola, que é, obviamente, o coração da primavera ainda está lá (e você pode revisar outras boas respostas aqui), mas há mais da primavera ...
O Spring agora tem muitos projetos, cada um com alguns subprojetos ( http://spring.io/projects ). Quando alguém fala sobre primavera, você deve descobrir de que projeto primavera ele está falando, é apenas o núcleo da primavera, que é conhecido como estrutura da primavera , ou é outro projeto da primavera.
Alguns projetos de primavera que merecem destaque são:
Se você precisar de algum recurso mais específico para seu aplicativo, também poderá encontrá-lo:
Existem também alguns pequenos projetos, por exemplo, spring-social-facebook ( http://projects.spring.io/spring-social-facebook/ )
Você pode usar o spring para desenvolvimento web, pois ele possui o Spring MVC
módulo que faz parte do projeto Spring Framework . Ou você pode usar o spring com outro framework da web, como o struts2 .
Para que serve o Spring? Responderei a essa pergunta em breve, mas primeiro, vamos dar uma outra olhada no exemplo de victor hugo. Não é um ótimo exemplo, porque não justifica a necessidade de uma nova estrutura.
public class BaseView {
protected UserLister userLister;
public BaseView() {
userLister = new UserListerDB(); // only line of code that needs changing
}
}
public class SomeView extends BaseView {
public SomeView() {
super();
}
public void render() {
List<User> users = userLister.getUsers();
view.render(users);
}
}
Feito! Portanto, agora, mesmo que você tenha centenas ou milhares de visualizações, ainda precisará alterar a linha de código, como na abordagem Spring XML. Mas alterar uma linha de código ainda requer recompilar, em vez de editar o XML que você diz? Bem, meu amigo exigente, use Ant e script de distância!
Então, para que serve o Spring? É para:
Leitura adicional: http://discuss.joelonsoftware.com/?joel.3.219431.12
UserLister
), mas e se precisar de vários serviços, não compartilhados entre os BaseView
filhos dos diferentes ? Felizmente, não há herança múltipla em Java.
A primavera é três coisas.
O problema é que o Spring DI é realmente bem pensado, os invólucros de outras coisas são muito bem pensados, pois as outras coisas pensaram em tudo e o Spring simplesmente o envolve. As implementações Spring do MVC e REST e todas as outras coisas não são tão boas (YMMV, IMHO), mas há exceções (Spring Security é uma bomba). Por isso, costumo usar o Spring for DI e seus invólucros legais, mas prefiro outras coisas para a Web (gosto muito de tapeçaria), REST (Jersey é realmente robusta), etc.
O que você provavelmente desejaria em um aplicativo Web com o Spring -
Além disso, o Spring é ENORME - portanto, há muitas outras coisas que você pode estar interessado em usar em um aplicativo Web, como o Spring AOP ou o Spring Security. Mas as quatro coisas listadas acima descrevem os componentes comuns do Spring que são usados em um aplicativo da web.
Eu vejo duas partes disso:
Observe que você pode perfeitamente usar o Spring em um aplicativo Web sem usar o Spring MVC. Eu diria que a maioria dos aplicativos Web Java faz isso, enquanto usa outras estruturas da Web como Wicket, Struts, Seam, ...
A primavera é ótima para colar instâncias de classes juntas. Você sabe que suas classes do Hibernate sempre precisarão de uma fonte de dados, o Spring as une (e também implementa a fonte de dados).
Seus objetos de acesso a dados sempre precisam de acesso ao Hibernate; o Spring liga as classes do Hibernate aos DAOs para você.
Além disso, o Spring basicamente fornece configurações sólidas de várias bibliotecas e fornece orientações sobre quais bibliotecas você deve usar.
A primavera é realmente uma ótima ferramenta. (Eu não estava falando sobre o Spring MVC, apenas a estrutura base).
A resposta aceita não envolve o uso de anotações desde que o Spring introduziu suporte para várias anotações para configuração.
Existe uma outra maneira de conectar as classes usando um arquivo XML: as anotações. Vamos usar o exemplo da resposta aceita e registrar o feijão diretamente sobre a classe usando uma das anotações @Component
, @Service
, @Repository
ou @Configuration
:
@Component
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
Dessa forma, quando a visualização é criada, ela magicamente terá um UserLister pronto para funcionar.
A declaração acima é válida com um pequeno bônus, sem a necessidade de qualquer uso de arquivo XML e conexão com outra anotação @Autowired
que encontre uma implementação relevante e a injete.
@Autowired
private UserLister userLister;
Use a @Bean
anotação em um método usado para obter a implementação do bean para injetar.
@Bean
anotação no nível da classe. Deve ser um dos @Component
, @Service
, @Repository
etc. O descanso é correta. Talvez você deva também salientar que a conexão automática da interface dessa maneira só funcionará se houver apenas 1 classe candidata no caminho de classe adequado para injeção, caso contrário, erro no aplicativo Spring.
A vantagem é injeção de dependência (DI) . Significa terceirizar a tarefa de criação de objetos. Deixe-me explicar com um exemplo.
public interface Lunch
{
public void eat();
}
public class Buffet implements Lunch
{
public void eat()
{
// Eat as much as you can
}
}
public class Plated implements Lunch
{
public void eat()
{
// Eat a limited portion
}
}
Agora, no meu código, tenho uma classe LunchDecide da seguinte maneira:
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(){
this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
//this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion
}
}
Na aula acima, dependendo do nosso humor, escolhemos Buffet () ou Banhado (). No entanto, este sistema está firmemente acoplado. Toda vez que precisamos de um tipo diferente de objeto, precisamos alterar o código. Nesse caso, comentando uma linha! Imagine que existem 50 classes diferentes usadas por 50 pessoas diferentes. Seria uma bagunça e tanto. Nesse caso, precisamos desacoplar o sistema. Vamos reescrever a classe LunchDecide.
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(Lunch todaysLunch){
this.todaysLunch = todaysLunch
}
}
Observe que, em vez de criar um objeto usando a nova palavra-chave, passamos a referência a um objeto do tipo de almoço como parâmetro para o nosso construtor. Aqui, a criação de objetos é terceirizada. Esse código pode ser conectado usando o arquivo de configuração Xml (legado) ou as Anotações Java (modernas). De qualquer maneira, a decisão sobre qual tipo de objeto seria criado seria tomada durante o tempo de execução. Um objeto seria injetado por Xml em nosso código - Nosso Código depende de Xml para esse trabalho. Portanto, injeção de dependência (DI). O DI não apenas ajuda a tornar nosso sistema pouco acoplado, mas também simplifica a gravação de testes de unidade, pois permite que as dependências sejam zombadas. Por último, mas não menos importante, o DI simplifica a Programação Orientada a Aspectos (AOP), o que leva a uma maior dissociação e aumento da modularidade. Observe também que o DI acima é injeção de construtor.
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
O Spring é uma boa alternativa à tecnologia Enterprise JavaBeans (EJB) . Ele também possui estrutura da web e componente da estrutura de serviços da web.
O Spring começou como um sistema de injeção de dependência bastante simples. Agora é enorme e tem tudo dentro (exceto a pia da cozinha proverbial).
Mas não tema, é bastante modular para que você possa usar apenas as peças que deseja.
Para ver onde tudo começou, tente:
Pode ser antigo, mas é um excelente livro.
Para outro bom livro desta vez dedicado exclusivamente ao Spring, consulte:
Ele também faz referência a versões mais antigas do Spring, mas definitivamente vale a pena olhar.
A primavera foi a injeção de dependência no início e, em seguida, adicione o rei dos invólucros para quase tudo (invólucro sobre implementações de JPA etc.).
Longa história ... a maioria das partes do Spring prefere soluções XML (mecanismo de script XML ... brrrr), então, para o DI, uso o Guice
Boa biblioteca, mas com o crescimento do depnedenciec, por exemplo, o Spring JDBC (talvez uma solução Java jdbc com parâmetros de nomes reais) retire do maven 4-5 a seguir.
Usando o Spring MVC (parte de "big spring") para desenvolvimento web ... é uma estrutura "baseada em solicitação", existe guerra santa "solicitação versus componente" ... até você
No passado, eu pensei sobre o framework Spring do ponto de vista puramente técnico.
Dada alguma experiência de trabalho em equipe e desenvolvimento de Webapps corporativos - eu diria que o Spring é para o desenvolvimento mais rápido de aplicativos (aplicativos da Web), dissociando seus elementos individuais (beans). Um desenvolvimento mais rápido o torna tão popular. O Spring permite mudar a responsabilidade de construir (ligar) o aplicativo na estrutura do Spring. A injeção de dependência da estrutura Spring é responsável por conectar / conectar os beans individuais em um aplicativo em funcionamento.
Dessa maneira, os desenvolvedores podem se concentrar mais no desenvolvimento de componentes individuais (beans) assim que as interfaces entre os beans forem definidas.
O teste dessa aplicação é fácil - o foco principal é dado aos beans individuais. Eles podem ser facilmente dissociados e ridicularizados, para que o teste de unidade seja rápido e eficiente.
O Spring framework define vários beans especializados, como @Controller ( @Restcontroller ), @Repository , @Component para servir a propósitos da Web. O Spring junto com o Maven fornece uma estrutura intuitiva para os desenvolvedores. O trabalho em equipe é fácil e rápido, pois há elementos individuais separados e podem ser reutilizados.
O framework Spring é definitivamente bom para o desenvolvimento da Web e mais específico para serviços de API repousantes.
É bom para o acima exposto por causa de sua injeção de dependência e integração com outros módulos, como segurança de mola , spring aop , estrutura mvc , microsserviços
Em qualquer aplicativo, a segurança é provavelmente um requisito.
Se você pretende criar um produto que precise de manutenção prolongada, precisará utilizar o conceito Aop.
Se o seu aplicativo tiver muito tráfego, aumentando a carga, você precisará usar o conceito de microsserviços.
O Spring está oferecendo todos esses recursos em uma plataforma. Suporte com muitos módulos .
Mais importante, a primavera é de código aberto e uma estrutura extensível, tem um gancho em todos os lugares para integrar código personalizado no ciclo de vida.
Spring Data é um projeto que fornece integração com seu projeto.
Assim, a primavera pode se encaixar em quase todos os requisitos.