2. Spring Framework
MGJUG
João Vitor Lacerda Guimarães
joao.vitor@gmail.com
29/06/2005
3. Agenda
● O que é o Spring?
● Como ele é organizado?
● Inversão de controle
● Integração com a parte web
● Acesso a banco de dados
– Hibernate e JDBC
● Transações declarativas
● Utilizando mocks
● Conclusão
4. Spring Framework
● Um container leve que fornece aspectos prontos
para serem utilizados
● Diminui o código escrito
● Integra com diversos frameworks, não reinventa a
roda
● Portável entre diversos servidores de aplicações
● Pouco ou não invasivo, você escolhe o que vai
utilizar
● Torna seu código mais testável
● Converte diversas checked exceptions em
unchecked
● Versão atual é a 1.2.1
6. Inversão de controle
● Muda-se o instanciador do objeto
● Define-se dependências no objeto
instanciado (através de get/set ou de
contrutores)
● Pode injetar objetos obtidos via jndi
– a classe que recebe não precisa de fazer
lookups
● Favorece a utilização de interfaces
● Spring fornece constructor-injection e
setter-injection
7. Vantagens do IOC
● Teste fica fácil
– Teste o seu componente isolado
● Manutenção fica fácil
– Alterações bem localizadas
● Configuração fica fácil
– Desacoplado da lógica do sistema
– Pode variar de acordo com o contexto
● Reutilização fica fácil
– Componentes com baixo acoplamento são
mais fáceis de serem reutilizados
8. Dependency Injection
● Código Java
public class Cliente {
private CartaoCredito cartaoCredito;
public void setCartaoCredito(CartaoCredito cartaoCredito)
{
this.cartaoCredito = cartaoCredito;
}
}
● Configuração XML
<bean id=quot;clientequot;
class=quot;com.mgjug.persistencia.cliente.Clientequot;>
<property name=quot;cartaoCreditoquot;>
<ref bean=quot;cartaoquot;/>
</property>
</bean>
9. Autowire
● no(default)
– Especifica-se todas as propriedades que
devem ser setadas e quais serão os seus
valores.
● byName
– O Spring monta o objeto injetando beans de
mesmo nome das dependências
● byType
– Idem ... mesmo tipo das dependências
11. Mais autowire
● byName
Deve existir no contexto do Spring um bean
com o nome da dependência. O id dessa
dependência é único
● byType
Deve existir no contexto do Spring apenas
um bean com o tipo da dependência a ser
injetada.
12. Integrando com a web
● ContextLoaderListener carrega os beans
noServletContext – pode ser obtido com:
● WebApplicationContext ctx =
WebApplicationContextUtils.
getWebApplicationContext(servletContext);
● Struts - ContextLoaderPlugin e ActionSupport
● WebWork - SpringObjectFactory
● JSF - DelegatingVariableResolver
● Tapestry - sobrescreve BaseEngine e coloca o
contexto do spring no Global
14. JDBC de um jeito simples
● O JDBCTemplate fornece facilitadores para
acessar o banco de dados.
● Abstração do controle de abertura de
conexão, statements.
● query, queryForList, queryForMap, update
15. Integração com Hibernate
● Fornece suporte às versões 2.1.x e 3.x
● Pacotes utilitários
– org.springframework.orm.hibernate
– org.springframework.orm.hibernate3
● Principais classes
– HibernateDaoSupport (superclasse para DAO)
– HibernateTemplate (executa acessos)
16. HibernateCallback
public Collection findByFiltro(
● Classe utilitária final Cliente filtro) {
return (Collection)
para facilitar a getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(
criação de métodos Session session)
throws HibernateException {
mais específicos if (filtro != null) {
Criteria criteria =
session.createCriteria(
(ex. FindByFiltro) Cliente.class);
if (filtro.getId() != null) {
criteria.add(
Restrictions.eq(quot;idquot;,
filtro.getId()));
}
//...
return criteria.list();
}
return null;
//...
18. AOP
● Os aspectos do Spring são aplicáveis
somente aos beans gerenciados por ele
● O Spring fornece aspectos prontos como:
– DebugInterceptor
– PerformanceMonitorInterceptor
– TransactionInterceptor
22. Aspectos também possuem
dependências
● O Spring integra também com o AspectJ
<bean id=quot;securityAspectquot;
class=quot;com.mgjug.aspectj.LogAspectquot;
factory-method=quot;aspectOfquot;>
<property name=quot;sessionFactoryquot;>
<ref local=quot;sessionFactoryquot;/>
</property>
</bean>
23. Spring mock
● O spring-mock fornece classes para
simplificar a integração dos testes com o
container leve.
● Evita-se a utilização direta do contexto do
spring nos testes unitários.
● Testes unitários possuem dependências.
● Fornece testes transacionais.
24. EasyMock
public void
● A utilização de testDeleteCartaoCredito() {
mocks facilita o CartaoCredito cartaoCredito =
new CartaoCredito();
teste de camadas cartaoCreditoDAOMock.
da aplicação de delete(cartaoCredito);
controlCartaoCreditoDAO.replay();
maneira
apresentacaoManager.
independente. deleteCartaoCredito(
cartaoCredito);
controlCartaoCreditoDAO.verify();
}