uma introdução ao framework spring
TRANSCRIPT
Java EE LeveJava EE Leve
Uma introdução ao framework SpringUma introdução ao framework Spring
David Ricardo do Vale PereiraDavid Ricardo do Vale [email protected]
O que é Spring?O que é Spring?
Interface21
O que é Spring?O que é Spring?
• Reduzir a complexidade do desenvolvimento Java EE
• Simplificar sem perder o poder
• Facilitar o desenvolvimento usando as boas práticas
O que é Spring?O que é Spring?
• Possibilitar que as aplicações sejam construídas com POJOs
• Aplicação de serviços aos POJOs de maneira declarativa
– Ex: @Transactional
O que é Spring?O que é Spring?
Poder para os POJOs
O que é Spring?O que é Spring?
Spring influenciou...
– EJB 3.0
– Java Server Faces
O que é Spring?O que é Spring?
• Container de DI• AOP• Acesso a dados (JDBC, Hibernate, iBatis...)• Gerenciamento de Transações• Agendamento de Tarefas• Mail Support• Remoting• Spring MVC + Spring Web Flow• Spring RCP
Injeção de DependênciasInjeção de Dependências
Inversão de Controle
“Inversion of Control (IoC) is a design pattern that addresses a component's dependency resolution, configuration and lifecycle.”
(Paul Hammant - PicoContainer)
Injeção de DependênciasInjeção de Dependências
Dependency Lookup x Dependency Injection
Injeção de DependênciasInjeção de Dependências
The Hollywood Principle:
Don't call us, we'll call you!
Injeção de DependênciasInjeção de Dependências
Injeção de Dependências
Martin Fowler
Inversion of Control Containers and The Dependency Injection
Patternhttp://www.martinfowler.com/articles/injection.html
Injeção de DependênciasInjeção de Dependências
Bean 1 Bean 2depende de
Exemplo
Injeção de DependênciasInjeção de Dependências
Sem Inversão de Controle
public class Bean1 { private Bean2 bean2; public void metodo() { bean2 = new Bean2(); // sem IoC bean2.usandoBean(); }
}
Injeção de DependênciasInjeção de Dependências
Com Dependency Lookup
public class Bean1 { private Bean2 bean2; public void metodo() { bean2 = Factory.getBean2(); // Factory (GoF) bean2.usandoBean(); }
}
Injeção de DependênciasInjeção de Dependências
Com Dependency Injection
public class Bean1 { private Bean2 bean2; public void metodo() { bean2.usandoBean(); }
public void setBean2(Bean2 bean2) { this.bean2 = bean2; } }
Injeção de DependênciasInjeção de Dependências
Dois tipos...
– Setter Injection
– Constructor Injection
Spring trabalha com ambos!
Injeção de DependênciasInjeção de Dependências
Setter Injection
<bean id=”bean2” class=”pacote.Bean2”/>
<bean id=”bean1” class=”pacote.Bean1”><property name=”bean2”>
<ref bean=”bean2”/></property>
</bean>
Injeção de DependênciasInjeção de Dependências
Constructor Injection
<bean id=”bean2” class=”pacote.Bean2”/>
<bean id=”bean1” class=”pacote.Bean1”><constructor-arg>
<ref bean=”bean2”/></constructor-arg>
</bean>
AOPAOP
AOP = Aspects Oriented Programming
Aspectos
AOPAOP
0
AOPAOP
• Advices– Before Advice
– After Advice
– Around Advice
– Throws Advice
– Introduction Advice
AOPAOP
Um “Hello World!” com AOP
public class MessageWriter { public void writeMessage() { System.out.println(“World”); }}
AOPAOP
public class MessageDecorator implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println(“Hello ”); invocation.proceed(); System.out.println(“!”); return retVal; }
}
AOPAOP
public class HelloWorldAOPExample { public static void main(String args[]) { MessageWriter target = new MessageWriter();
ProxyFactory pf = new ProxyFactory(); pf.addAdvice(new MessageDecorator()); pf.setTarget(target); MessageWriter proxy = (MessageWriter)pf.getProxy();
target.writeMessage(); proxy.writeMessage(); }}
Acesso a DadosAcesso a Dados
Acesso a Dados com Spring
Acesso a DadosAcesso a Dados
Spring com JDBC
• Gerenciamento de DataSources
• JDBC Templates
• SQLExceptionTranslator
Acesso a DadosAcesso a Dados
Acesso a DadosAcesso a Dados
Gerenciamento de DataSources
<bean id=”dataSource” class=”org.springframework.jndi.JndiObjectFactoryBean”>
<property name=”jndiName”> <value>java:comp/env/jdbc/meuDataSource</value> </property></bean>
<bean id=”meuDAO” class=”net.java.dev.javarn.dao.MeuDAO”> <property name=”dataSource”> <ref local=”dataSource”/> </property></bean>
Acesso a DadosAcesso a Dados
JDBC Templates
• Facilita a execução de consultas
• Torna o código mais limpo
Acesso a DadosAcesso a Dados
int count = 0;try { PreparedStatement st = getConnection(). prepareStatement(“select count(*) from produto”); ResultSet rs = st.executeQuery(); if (rs.next()) count = rs.getInt(1);} catch(SQLException e) {
log.error(e);} finally { try { if (stmt != null) stmt.close(); } catch(SQLException e) { log.warn(e); } try { if (conn != null) conn.close(); } catch(SQLException e) { log.warn(e); }}
Acesso a DadosAcesso a Dados
JdbcTemplate jt = new JdbcTemplate(getDataSource());int count = jt.queryForInt( “select count(*) from produto”);
Acesso a DadosAcesso a Dados
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="studentDao" class="StudentDaoJdbc">
<property name="jdbcTemplate">
<ref bean="jdbcTemplate"/>
</property>
</bean>
Acesso a DadosAcesso a Dados
SQLExceptionTranslator
SQLException
BadSqlGrammarException
CannotGetJdbcConnectionException
InvalidResultSetAccessException
IncorrectResultSetColumnCountException
...
Acesso a DadosAcesso a Dados
Spring com Hibernate
• Gerenciamento de Session Factories
• Hibernate DAO Support
Acesso a DadosAcesso a Dados
Gerenciamento de Session Factories<bean id=”dataSource” ... />
<bean id=”sessionFactory” class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
<property name=”dataSource”><ref local=”dataSource”/></property> <property name=”hibernateProperties”> <props><prop key=”hibernate.dialect”> org.hibernate.dialect.PostgreSQLDialect </prop></props> </property> <property name=”mappingResources”> <list> <value>Bean1.hbm.xml</value> <value>Bean2.hbm.xml</value> </list> </property> ...
Acesso a DadosAcesso a Dados
Hibernate DAO Supportpublic class AlunoDao extends HibernateDaoSupport implements Dao { public Object get(int id) { return getHibernateTemplate().load(Aluno.class, id); } public List getAll() { return getHibernateTemplate().loadAll(Aluno.class); } public void saveOrUpdate(Object o) { getHibernateTemplate().saveOrUpdate(o); } public List findAlunosReprovados() { return getHibernateTemplate().find(“from Aluno a where
a.disciplinas.media < ?”, new Object[] { 7 }); }
}
Acesso a DadosAcesso a Dados
<bean id="sessionFactory" .../>
<bean id="dao" class="net.java.dev.javarn.TestDao"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property></bean>
Gerenciamento de TransaçõesGerenciamento de Transações
Gerenciamento de TransaçõesGerenciamento de Transações
@Transactionalpublic interface FooService {
Foo getFoo(String fooName);
void insertFoo(Foo foo);
void updateFoo(Foo foo);}
Gerenciamento de TransaçõesGerenciamento de Transações
public class FooService {
public Foo getFoo(String fooName) { ... }
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateFoo(Foo foo) { // ... }}
Spring na WebSpring na Web
Integração com Frameworks
• Spring + Spring MVC• Spring + Java Server Faces• Spring + Webwork• Spring + Tapestry• Spring + Struts
Spring na WebSpring na Web
Spring Web Flow
• Controle de fluxo de aplicações web
• Continuations
• Problema do botão voltar (back x undo)
Spring na WebSpring na Web
/step1.do
Controller 1 HTTPSession
storeForm
page1
/step2.do
Controller 2page2
updateForm
/lastStep.do
Controller 3confirmationPage
processTxBusinessService
Spring na WebSpring na Web
Spring na WebSpring na Web
• Fluxo como uma máquina de estados
• Estados e transições configurados com XML
• Atualmente compatível com Spring MVC e Java Server Faces
• Suporte a AJAX
Spring no DesktopSpring no Desktop
Spring RCP
• Rich Client Platform
• Programação Desktop com o poder do Spring
• Suporte a Swing, inicialmente
Spring no DesktopSpring no Desktop
Spring RCP – Form BuildersFormModelformModel= new DefaultFormModel(newCustomer());TableFormBuilderbuilder = new TableFormBuilder(formModel);builder.addSeparator("separator.contactDetails");builder.row();builder.add("name");builder.row();builder.add("orgPosition");builder.row();builder.add("orgName");builder.row();builder.addSeparator("separator.addressDetails");…builder.add("state");builder.add("postcode","colSpec=2cm");builder.row();builder.add("country");JComponentform = builder.getForm();
Spring no DesktopSpring no Desktop
RemotingRemoting
Sistemas Distribuídos com Spring
• Spring + EJBs
• Spring + RMI
• Spring + JAXRPC (Web Services)
• Spring HTTP Invoker
Spring 2.0Spring 2.0
Novidades do Spring 2.0
• XML mais simples e poderoso (XML Schema)
• Mais uso de Annotations
• Convention over configuration
• Múltiplas linguagens (Java, Groovy, Jruby, BeanShell)
Spring AnnotationSpring Annotation
Spring Annotation
• Configuração com Annotations
• Integração com JSF
• Brasileiro
http://spring-annotation.dev.java.net/
LivrosLivros