Spring

Galera,
Tó dando uma estuda no framework spring, e me pergunto sobre sua relevância mundo web. Realmente, é bonitinho você tirar aquela arruma de news do código, mas acho pior ver um arquivo xml crescer indefinidamente. Fico pensando na hora da manutenção. Afinal, um código bem escrito e com base em design patterns poderia ou não dispensar o conceito de Inversão de dependência. Alguém tem relatos positivos do uso do spring com STRUTS + spring / JSF + spring?

As palavras são “indefinidamente” e “inversão de dependência”. Faltou um ponto de interrogação na sua frase final.

Obrigado, corregido
mas…
se tens conhecimento sobre, poderias responder… 8)

Eu acho que vale a pena.

Mas não se faz mais necessário o uso de extensos arquivos XML no Spring.

[quote=romarcio]Eu acho que vale a pena.

Mas não se faz mais necessário o uso de extensos arquivos XML no Spring. [/quote]
Pois é, mas por quê?

[quote=fabioEM][quote=romarcio]Eu acho que vale a pena.

Mas não se faz mais necessário o uso de extensos arquivos XML no Spring. [/quote]
Pois é, mas por quê? [/quote]

Afinal, um código bem escrito e com base em design patterns poderia ou não dispensar o conceito de Inversão de dependência.

Com o uso de anotações não precisa mapear os beans em arquivos xml.

E Injeção de Dependências não seria um padrão para diminuir o auto acoplamento entre as classes?
O que o Spring faz é te dar isso pronto, sem você precisar implementa-la.
E o Spring não é somente isso, tem muito mais coisas, como um implementação do padrão MVC.

Estou utilizando o spring 3 com spring mvc e não tem muita coisa no xml não. Basicamente você tem que colocar umas tags que dizem em quais pacotes o spring deve procurar as classes anotadas e algumas outras coisas tem que ser configuradas no xml, mas não achei muita coisa não. Aliás, agora que estou utilizando o spring mvc 3 com anotações que estou entendendo o que o pessoal falava sobre ganho de produtividade comparando com o struts 1. E também estou achando mais produtivo do que quando utilizava jsf com richfaces. Por incrível que possa parecer, estou achando bem melhor montar as telas com o jquery ui do que com os componentes prontos do jsf. O único ponto negativo é a parte ajax, pois você tem que atualizar tudo na tela “na mão” com javascript, coisa que o jsf com richfaces faz sozinho, mas em contrapartida parece que a aplicação está bem mais leve, acho que pelo fato do javascript não ser genérico.
Já com relação ao ejb3, não achei tanta vantagem assim, pois antes eu utilizava ejb3 com anotações também. A única vantagem que vi foi o fato de eu não ter que utilizar um servidor de aplicações e sim apenas um container web, mas hoje já existe o ejb lite pra isso também.
Mas a idéia de injeção de depência é bem legal, tanto é que foi incorporada ao jee 6 (apesar de já existir para alguns componentes do jee 5.

Esqueça struts1/2, você já está em 2012, o que ele faz, o spring mvc faz muito mais e muito mais fácil. Se quiser, olhe o vraptor 3 também que está bem legal.

Eu queria esquecer, mas tem muita coisa por aí feita neles… E outras sendo feitas neles… Se eu pudesse escolher mudaria, mas as vezes quando entramos no projeto já está tudo definido em termos de frameworks.

As vezes as classes até ficam encharcada de de depencias, porém há ferramentas para gerenciar isso. O Marven gerencia esse problema de granularidade de dependencias.

Também estou estudando Spring comecei na semana passada e estou muito interessado, considerando que o mesmo facilita o desenvolvimento da camada de persistencia.

O Spring é um dos raros frameworks que existem que são estado da arte. Ele possui integração com praticamente todo o tipo de funcionalidade necessária no mundo JEE, faz isso com anotações e de brinde, te oferece um benefício muito importante que é a modularização. A linha:

<import resource="classpath:**/*-module.xml" />

Faz milagres. Então, não, não acho que o XML pode crescer ‘indefinidamente’, ainda mais tendo arquivos do tipo database-module.xml, jms-module.xml, etc. E tudo feito fácil, fácil, sem as restrições de outros frameworks de promoção de modularização.

Eu sempre trabalhei com stack do j2ee. Recentemente comecei a utilizar o spring e estou gostando pra caramba. Talvez não tenha sido muito bom antes de existirem as anotações. Não sei bem à partir de que versão elas foram incorporadas, mas eu tenho um livro aqui de spring 2 que não tem nenhuma anotação, então os exemplos ficam com xmls muito grandes, mas à partir da versão 3 que é a que estou utilizando acho que está muito bom. “Pena” que agora tem que aprender jee6 também :slight_smile:

só pra constar, como estamos falando de spring, eu tenho aqui a versão do livro spring in action 3 em inglês. O livro está novo, eu ganhei ele comprando a versão “meap” do livro eletrônico para o kindle. Como já tinha lido a versão eletrônica, não vou utilizar a veersão impressa. Caso alguém tenha interesse pode me mandar uma mensagem.
Até mais e boa noite!

Oi pessoal, estou tentando fazer uma modificação nos meus dados, mas não estou sendo bem sucediddo. Este aplicativo tem Spring e o Hibernate, conforme vocês podem ver abaixo.

app-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<context:annotation-config/>
<context:component-scan base-package="br.com.caelum.estoque"/>
<mvc:annotation-driven/>

<bean
	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/views/" />
	<property name="suffix" value=".jsp" />
</bean>

<bean id="produtoHibernateDAO" class="br.com.caelum.estoque.dao.ProdutoHibernateDAO"/>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
    destroy-method="destroy">
    
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/fj27</prop>
            <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <prop key="hibernate.connection.username">root</prop>
            <prop key="hibernate.connection.password">microsoft</prop>
            <prop key="hibernate.connection.autocommit">true</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>br.com.caelum.estoque.model.Produto</value>
            <value>br.com.caelum.estoque.model.Movimentacao</value>
        </list>
    </property>
</bean>	

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<bean id="produto" class="br.com.caelum.estoque.model.Produto"/>

<tx:annotation-driven/>

ProdutoController.java
package br.com.caelum.estoque;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import br.com.caelum.estoque.interfaces.ProdutoDAO;
import br.com.caelum.estoque.model.Produto;

@Controller
@RequestMapping(value="/produtos")
public class ProdutoController {

@Autowired
@Qualifier("produtoHibernateDAO")
private ProdutoDAO produtoDAO;

/*
 * http://localhost:8080/estoque/produtos/listar.html
 */
@RequestMapping(value="/listar", method=RequestMethod.GET)
public ModelAndView listar(){
	ModelAndView modelAndView = new ModelAndView("produtos/lista");
	modelAndView.addObject(produtoDAO.listar());
	return modelAndView;
}

@RequestMapping(value="/mostrar/{id}", method=RequestMethod.GET)
public ModelAndView mostrar(@PathVariable long id){
	ModelAndView modelAndView = new ModelAndView("produtos/mostrar");
	modelAndView.addObject(produtoDAO.buscarPorId(id));
	return modelAndView;
}

/*
 * http://localhost:8080/estoque/produtos/form.html
 */
@RequestMapping(value="/form", method=RequestMethod.GET)
public String form(){
	return "produtos/form";
}

@RequestMapping(value="/salvar", method=RequestMethod.POST)
public String salvar(Produto produto){
	produtoDAO.salvar(produto);
	return "redirect:/produtos/listar.html";
}

@RequestMapping(value="/alterar", method=RequestMethod.POST)
public String alterar(Produto produto){
	produtoDAO.alterar(produto);
	return "redirect:/produtos/listar.html";
}

@RequestMapping(value="/editar/{id}", method=RequestMethod.GET)
public ModelAndView editar(@PathVariable Long id){
	Produto produto = produtoDAO.buscarPorId(id);
	ModelAndView modelAndView = new ModelAndView("produtos/editar");
	modelAndView.addObject(produto);
	return modelAndView;
}

@RequestMapping(value="/apagar")
public String apagar(Long id){
	Produto produto = produtoDAO.buscarPorId(id);
	produtoDAO.remove(produto);
	return "redirect:/produtos/listar.html";
}

}

Produto.java
package br.com.caelum.estoque.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Produto {

private static long contador = 0;

@Id
@GeneratedValue
private long id;
private String descricao;
private Integer quantidade;
	
public Produto(){
	setId(getId() + 1);
	contador++;
	id = contador;
}

public String getDescricao() {
	return descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public Integer getQuantidade() {
	return quantidade;
}

public void setQuantidade(Integer quantidade) {
	this.quantidade = quantidade;
}

public long getId() {
	return id;
}

public void setId(long id) {
	this.id = id;
}

}

editar.jsp

Alterar Produto
Descriçâo:
Quantidade:

[quote=fabioEM][quote=romarcio]Eu acho que vale a pena.

Mas não se faz mais necessário o uso de extensos arquivos XML no Spring. [/quote]
Pois é, mas por quê? [/quote]

fredericocuba , que tal abrir outro tópico, no lugar certo, com a sua dúvida nele? Vai lá, não dói…

Outra coisa: quando for postar código, coloque com a tag [code]. Fica bem mais fácil de ler.

[]'s

Nossa, desenterraram este hein?

Como vi o tópico por aqui, vou dar o meu pitaco: desde a versão 2.0 do Spring que trouxe anotações, a quantidade de XML a ser digitado foi reduzida significativamente e, com a versão 3, você sequer precisa de código XML para trabalhar com o Spring.

Se é relevante nos dias de hoje? Bastante!
A principal razão é o fato de ser um framework de vanguarda se comparado ao JCP. Enquanto no JCP você têm um comitê que avalia o que deve ser incluído - o que leva muito tempo - normalmente a postura adotada é a de se usar apenas o “menor denominador comum” entre várias opções. Sendo assim, o Spring sempre será mais avançado que o Java EE padrão (no que diz respeito a novas funcionaldiades) e também, com suas funcionalidades específicas, acaba por aumentar o ganho do desenvolvedor.

Além disto, é também o melhor container de Inversão de Controle/Injeção de Dependências já feito: incrívelmente poderoso, e com um suporte a AOP que ainda é superior ao do stack Java EE padrão. AOP, apesar de ser pouco usada, é talvez uma das ferramentas mais poderosas no cinto de utilidades do programador. Na minha opinião, só não é tão difundido por falta de bom material a respeito (acredito que eu tenha dado uma boa contribuição nesta área na parte do meu livro que trata do assunto).

Isto sem mencionar as integrações fáceis de serem feitas com todos os componentes da plataforma Java EE e terceirizados. Tem também o suporte a acesso remoto que é fantástico, controle transacional ferrado de bom, acesso a dados de uma forma muito simplificada e muito mais.

A modularização também é bacana: se você não quer usar o SPring MVC, por exemplo, pode usar o JSF, Struts ou o que quiser em conjunto com tudo o que mencionei acima. Outro ponto bacana: você não precisa de um servidor de aplicações: programa com POJOs sempre (eu sei que o Java EE ta lá também), isto te facilita na hora de escrever testes: mocar serviços com o Spring, por exemplo, é muito fácil.

Então, quando olho pra trás e vejo como é no Java EE, vejo este se aproximar do Spring sim, mas sempre vai estar alguns passos atrás, e este atraso ainda torna o Spring extremamente relevante.

Estou movendo este tópico para o “Desenvolvimento web” porque se enquadra melhor lá ok?

Movido para desenvolvimento web.

Oi pessoal. Eu estou utilizando o spring 3.0.6.RELEASE e esftou tentando fazer uma integração com o hibernate. Alguém já tentou? Dá para dividirem a solução?

Obrigado qualquer ajuda
Fred

teste