Title: Springframework
1Springframework
- Jobson Ronan jrjs_at_cin.ufpe.br
2O que é o Springframework?
- Spring é um framework leve de inversão de
controle(IOC) e orientação a aspectos(AOP) - Torna o desenvolvimento de aplicaçõesmais fácil
e mais interessante!
3Como assim?
- Como Spring ajuda os desenvolvedores J2EE
- Oferece um container leve de JavaBeans que
elimina a necessidade de escrever códigos
repetitivos de encanador como lookups - Oferece um framework de inversão de controle que
permite as dependências dos beans serem
descobertas durante a instanciação - Permitir que cross cutting concers como
gerenciamento de transações ser aplicado aos
beans como Aspectos ao invés ser escrito no
objeto de negócio - Oferecer camadas de abstração sobre tecnologias
populares como JDBC e Hibernate que facilite seu
uso e organize o gerenciamento de configuração
4Como assim?
- Tudo isso seguindo alguns principios
- O Código de sua aplicação não deve depender da
API do Spring - Spring não deve competir com boas soluções
existentes mais sim promover integração - Escrever código testável é crítico e o container
deve ajudar(não interferir) nesse objetivo - Usar o Spring deve ser um prazer!
5Visão geral
6Sobre a arquitetura
- Spring pode ser usado em uma variedade de
situações - Aplicações web
- Aplicações que envolvem EJBs ou outros serviços
- Aplicações que acessem uma ou mais recursos(BDs)
- Apesar disso, Spring lidera os chamados
frameworks para o Desenvolvimento leve de
aplicações J2EE - Realmente precisamos de serviços pesados, como
EJB, providos pelos tradicionais Servidores de
aplicação J2EE?
7Relembrando o que é IoC?
- Um modo de remover as dependências entre os
objetos injetando as referências para os
colaboradores sobre demanda (Dependency
Injection) - O framework de IOC determina como os objetos
serão injetados, normalmente através de um
arquivo de configuração XML
8Modo tradicional
... private AccountService accountService
null public void execute(HttpServletRequest
req, ...) throws Exception Account account
createAccount(req) AccountService service
getAccountService() service.updateAccount(a
ccount) private AccountService
getAccountService() throws ... if
(accountService null) Context ctx
new InitialContext() Context env
(Context)ctx.look p("javacomp/env")
Object obj env.lookup("ejb/AccountServiceHome")
AccountServiceHome home
(AccountServiceHome)
PortableRemoteObject.narrow(env,Acco
ntService.class) accountService
home.create() return
accountService ...
9Modo Spring
- Com Spring, o container de IOC ira cuidar da
injeção de uma apropriada implementação
.. private AccountService accountService
null public void setAccountService(AccountServic
e accountService) this.accountService
accountService public void execte(HttpServletR
equest req, ...) throws Exception Account
account createAccount(req)
accountService.updateAccount(account) ...
10O Container de Beans
- É o núcleo do Spring famework
- Usa IOC para gerenciar os componentes que compõem
uma aplicação - Componentes são expressos como simples Java Beans
- O Container gerencia as relações entre os Beans e
é responsável por sua configuração - O Container gerencia o ciclo de vida dos Beans
11Tipos de Containers
- Bean Factory
- Dá suporte básico a injeção de dependência
- Configuração e gerenciamento do ciclo de vida
- Application Context
- Construido sobre o Bean Factory adicionando
serviços de - Resolução mensagens através de arquivos de
propriedades para internacionalização - Carregamento de recursos genéricos
- Publicação de eventos
12Bean Factory
public interface Greeting String
greeting() public class WelcomeGreeting
implements Greeting private String
message public void setMessage(String
message) this.message message
public String getGreeting()
return message
13Bean Factory
lt?xml version"1.0" encoding"UTF-8"?gt lt!DOCTYPE
beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http//www.springframework.org/dtd/spring-beans.d
td"gt ltbeansgt ltbean idgreeting
classWelcomeGreetinggt ltproperty
namemessagegt ltvaluegtBem vindoslt/valuegt
lt/propertygt lt/beangt lt/beansgt
- ...salvo em um arquivo chamado, por exemplo,
myapp.xml
14Bean Factory
... public static void main(String args)
BeanFactory factory new XmlBeanFactory(
new FileInputStream(foo.xml)) Greeting
greeting (Greeting) factory.getBean(greeting)
System.out.println(greeting.getGreeting())
- Saída no console
- gt Bem vindos
15Bean Factory
- Características dos managed beans
- Singletons por default
- Propriedades setadas por Dependency Injection
- Referência para outros managed beans
- Strings
- Tipos primitivos
- Coleções (lists, sets, map, props)
- Inner Beans
- Parâmetros podem ser extraídos para arquivos de
propriedades
16Spring DAO Spring ORM
- Spring como suporte a camada de negócio
17O que temos?
- Uma camada de abstração para persistência de
dados utilizando um ou mais das seguintes
tecnologias - JDBC
- Hibernate, OJB
- JDO
- iBatis
- Uma robusta infra-estrutura para o gerenciamento
de transações de forma declarativa que suporta
tanto transações locais como transações
distribuídas através da JTA - Uma camada simplificadora para tecnologias de
distribuição incluindo EJBs, RMI, e Web Services - Útil suporte a JNDI, JMS, email, e agendamento de
tarefas(task scheduling)
18Spring DAO
- Possui uma API de acesso a dados que ajuda a
isolar e melhorar o modo como o dado é servido
pela camada de negócio - Uma consistente e rica hierarquia de exceções
suficiente para mapear exceções específicas
dependentes de tecnologia para outras exceções
genéricas - Além de uma série de templates e wrapper classes
para se trabalhar com JDBC, Hibernate, JDO, etc.
19JDBC Tradicional
public void updateCustomer(Customer customer)
Connection conn null PreparedStatement ps
null try conn getConnection() ps
conn.prepareStatement(update customer set
firstName ?, lastName ?,
...) ps.setString(1, customer.getFirstName())
ps.setString(2, customer.getLastName()) ps.e
xecuteUpdate() catch (SQLException e)
log.error(e) finally try if (ps !
null) ps.close() catch (SQLException e)
log.error(e) try if (conn ! null)
conn.close() catch (SQLException e)
log.error(e) private Connection
getConnection() //... Mais código de
encanador
20Spring DAO
- Usando um template jdbc do spring
- O jdbcTemplate pode ser injetado pelo container...
public void updateCustomer(Customer customer)
String sql update customer set
firstName ?, lastName ?, ...)
Object params new Object
customer.getFirstName(), customer.getLastName(
), ... int types new int
Types.VARCHAR, Types.VARCHAR, ...
jdbcTemplate.update(sql, params, types)
21Spring DAO
- Operações também podem ser modeladas como objetos
public class UpdateCustomer extends SqlUpdate
public UpdateCustomer(DataSource ds)
setDataSource(ds) setSql(update customer
set values (?,?..)) declareParameter(new
SqlParameter(Types.VARCHAR))
declareParameter(new SqlParameter(Types.VARCHAR))
//... compile() public int
update(Customer customer) Object params
new Object customer.getFirstName(),
customer.getLastName()
return update(params)
22Spring DAO
- Usando o objeto UpdateCustomer
- A classe UpdateCustomer pode ser uma inner class
public class JdbcCustomerDao extends
JdbcDaoSupport implements CustomerDao
private UpdateCustomer updateCustomer
protected void initDao() throws Exception
super.initDao() updateCustomer new
UpdateCustomer(getDataSource()) public
void updateCustomer(Customer customer)
updateCustomer.update(customer)
23Integração ao Hibernate
- Spring prove um bean SessionFactory que
simplifica a configuração e o gerênciamento de
sessões em objetos de negócio - Uma classe HibernateTemplate
- Uma classe HibernateDaoSupport que pode ser
herdada para maior abstração - Gerenciamento e mapeamento das HibernateException
s - Facilmente plugável ao framework de Transações do
Spring
24Integração ao Hibernate
... ltbeansgt ltbean idsessionFactory
classorg.springframework.orm. hibernate3.Lo
calSessionFactoryBeangt ltproperty
namedataSourcegt ltref beandataSource/gt
lt/propertygt ltproperty namehibernateProperties
gt ltpropsgt ltprop keyhibernate.dialectgt
org.hibernate.dialect.MySQLDialect
lt/propgt lt/propsgt lt/propertygt ltproperty
namemappingResourcesgt ltlistgtltvaluegtCustomer
.hbm.xmllt/valuegtlt/listgt lt/propertygt lt/beangt ...
25Integração ao Hibernate
- Exemplo de configuração (cont)
ltbean idcustomerDao classHibernateCustomerDao
gt ltproperty namesessionFactorygt ltref
beansessionFactory/gt lt/propertygt lt/beangt ltbea
n id"myDataSource" class"org.apache.commons.dbcp
.BasicDataSource" destroy-method"close"gt
ltproperty name"driverClassName"gt
ltvaluegtcom.mysql.jdbc.Driverlt/valuegt
lt/propertygt ltproperty name"url"gt
ltvaluegtjdbcmysql//localhost/jealt/valuegt
lt/propertygt ltproperty name"username"gt ltvalu
egtsalt/valuegt lt/propertygt ltproperty
name"password"gt ltvaluegtlt/valuegt lt/propertygt lt/
beangt
26Integração ao Hibernate
- Customer DAO...
- Simples e limpo!
- O uso do HibernateTemplate é bastante semelhante
ao do objeto Session do hibernate - Existe suporte semelhante para outras tecnologias
ORM como iBatis, JDO e OJB
public class HibernateCustomerDao extends
HibernateDaoSupport implements CustomerDao
public void updateCustomer(Customer
customer) getHibernateTemplate().update(
customer)
27Transações com Spring Motivação
- Ambientes gerenciados com EJBs permitem uma
tratamento declarativo de transações - Fora do código, descreve-se, para cada método
transacional, suas características transacionais - Ex método x da classe br.org.citi.XYZ deve
representar uma transação - Elimina uma grande quantidade de código
repetitivo - Facilita a manutenção
- Entre outros
28Transações com Spring Motivação
- Porém, já falamos muito mal dos EJBs neste curso
? - Queremos ter os mesmo benefícios... Mas só os
benefícios
29Transações com Spring
- Suporte para gerenciamento programático e
declarativo de transações - Transações locais são delegadas pelo Spring para
o gerente de transações do data-source - Quando múltiplos recursos estão envolvidos
(transações distribuídas), Spring delega para o
gerente de transações JTA obtido através do JNDI - Apenas algumas pequenas mudanças são necessárias
para trocar entre local e JTA
30Transações com Spring
- Gerenciamento Declarativo ()
- Usa AOP para encapsular chamadas a objetos
transacionais com código de begin e commit de
transações - Comportamento de propagação
- Mandatory, Never, Not Supported, Required,
Requires New, Support, Nested - Similar a EJBs
- Também suporta níveis de isolação
- Default, Read Uncommitted, Read Committed,
Repeatable Read, Serializable
31Modelo transacional
- Normalmente o modelo flat transactions
- Se método é chamado dentro de uma transação, ele
pode continuar transação anterior - Se ele falhar, transação inteira é revertida
- Se nova transação for iniciada no método que já
faz parte de uma transação, ela é independente - Se falhar, pode sinalizar rollback() para
desfazer transação externa (ou não, e permitir
que transação externa continue) - O possível rollback da transação externa não
afetará outras transações (T2) cujos resultados
já foram cometidos
32Modelo transacional
Fim A5 B0 C0
T1
Suspensa
T1
Suspensa
T1
Início A0 B0 C0
T2
T3
falha
sucesso
A5
33Comportamento de propagação
- Mandatory
- Indica que o método só pode ser chamado no escopo
de uma transação do cliente - Se o método for chamado fora de uma transação,
ele causará uma exceção - Never
- Indica que o método nunca pode estar dentro de
uma transação - Se o cliente que chama o método for parte de uma
transação, ele causará uma exceção
34Comportamento de propagação
- NotSupported
- Indica que o método não suporta transações
- Se o método for chamado pelo cliente no escopo de
uma transação, a mesma será suspensa enquanto
durar a chamada do método (não haverá propagação
de transações do cliente) - Required
- Indica que o escopo de uma transação é requerido
pelo método - Se não existe transação, uma nova é criada e dura
até que o método termine (é propagada para todos
os métodos chamados) - Se já existe uma transação iniciada pelo cliente,
o bean é incluído no seu escopo durante a chamada
do método
35Comportamento de propagação
- Requires New
- Indica que o método requer uma nova transação
- Estando ou não o cliente no escopo de uma
transação, o bean irá iniciar uma nova transação
que iniciará e terminará no bean. - Support
- Indica que o método suporta transações
- Será incluído no escopo da transação do cliente
se existir - Se ele for chamado fora do escopo de uma
transação ele realizará suas tarefa sem
transações e pode chamar objetos que não suportam
transações
36Transações com Spring
Transação somente de leitura? opcional
Comportamento de propagação
PROPAGATION, ISOLATION, readOnly, -Exceptions,
Exception
Grau de isolamento opcional
Regras de Rollback opcional
Os atributos são declarados no arquivo de
definição dos beans
37Transações com Spring
... ltbeansgt ltbean idcustomerService
classorg.springframework.transaction. interc
eptor.TransactionProxyFactoryBeangt ltproperty
nametransactionManagergt ltref
beantransactionManager/gt lt/propertygt
ltproperty nametargetgt ltref
beancustomerServiceTarget/gt lt/propertygt
ltproperty nametransactionAttributesgt
ltpropsgt ltprop keygetgtPROPAGATION_REQUIRE
D, readOnlylt/propgt ltprop keystoregtPROPAG
ATION_REQUIREDlt/propgt lt/propsgt
lt/propertygt ltbeangt ...
38Transações com Spring
... ltbean idcustomerServiceTarget
classCustomerServiceImplgt ltproperty
namecustomerDaogt ltref beancustomerDao/gt
lt/propertygt lt/beangt ltbean idtransactionManager
classorg.springframework.orm. hibernate3.H
ibernateTransactionManagergt ltproperty
namesessionFactorygt ltref
beansessionFactory/gt lt/propertygt lt/beangt ltbea
n idcustomerDao classHibernateCustomerDaogt
ltproperty namesessionFactorygt ltref
beansessionFactory/gt lt/propertygt lt/beangt ...
39Transações com Spring
- E pronto!
- Nada de código com begin, commit e rollback!
40O que mais?
- Spring Remoting
- Distribuição com RMI, WebServices e outros
extremamente facilitada - Considere as seguintes classes
// Account service public interface
AccountService public void
insertAccount(Account acc) public List
getAccounts(String name)
// ... and corresponding implement doing nothing
at the moment public class AccountServiceImpl
implements AccountService public void
insertAccount(Account acc) // do something
public List getAccounts(String name)
// do something
41Spring Remoting
- Exportando nosso objeto como uma serviço RMI
- Usa-se o RmiServiceExporter
ltbean id"accountService" class"example.AccountSe
rviceImpl"gt lt!-- any additional properties,
maybe a DAO? --gt lt/beangt ltbean
class"org.springframework.remoting.rmi.RmiService
Exporter"gt ltproperty name"serviceName"gtltvalue
gtAccountServicelt/valuegtlt/propertygt ltproperty
name"service"gtltref bean"accountService"/gtlt/prope
rtygt ltproperty name"serviceInterface"gt
ltvaluegtexample.AccountServicelt/valuegt
lt/propertygt lt!-- defaults to 1099 --gt
ltproperty name"registryPort"gtltvaluegt1199lt/valuegtlt
/propertygt lt/beangt
42Spring Remoting
- Para acessar nosso serviço remoto basta usar um
RmiProxyFactoryBean - E pronto!
ltbean id"accountService"
class"org.springframework.remoting.rmi.RmiProxyFa
ctoryBean"gt ltproperty name"serviceUrl"gt ltval
uegtrmi//HOST1199/AccountServicelt/valuegt
lt/propertygt ltproperty name"serviceInterface"gt
ltvaluegtexample.AccountServicelt/valuegt
lt/propertygt lt/beangt
43Spring Remoting
- Isso que é distribuição transparente!
- A camada de distribuição desapareceu do código
Java! - Agora é só XML!
44Conclusões
- O spring é um framework para todas as a camadas
- O seu uso aumenta a manutenibilidade do sistema
consideravelmente - Ainda existe um framework, ageci, sub-projeto do
Spring, para gerenciamento de segurança
declarativo!
45Exercícios
- Altere a camada de dados da nossa aplicação com o
Spring (usar Spring DAO Spring ORM). - Altere o gerenciamento de transações de nossa
aplicação para usar o framework de transações do
Spring. - Transforme sua fachada em um serviço remoto.
- Teste tudo!
46Springframework
- Jobson Ronan jrjs_at_cin.ufpe.br