Contenu connexe Similaire à Spring vs. Java EE QConSP 2012 (20) Spring vs. Java EE QConSP 20127. JAVA EE
PLATFORM
• lutador experiente
• mudou a tática no Java EE 5
• ganhou confiança: CDI
• perdeu peso para ser ágil
• quer lutar na nuvem
Patrocinado por: Oracle, Red Hat, IBM and
other
QCONSP #3 THE CHALLENGER
9. THE SPRING
FRAMEWORK
• sem derrota desde 2004
• nocauteou o J2EE
• luta em qualquer container
• golpes fortes com POJOs
• sabe explorar bem seu oponente
Patrocinado por: Spring Source
QCONSP #3 THE CHAMPION
12. Princípio UFC
(princípio hollywood)
“Don’t fight us, we fight you!”
QCONSP #3 ROUND #1
16. IoC / DI
Spring JavaEE
@Controller @Named
@Scope(“request”) @RequestScoped
public class ContatoBean { public class ContatoBean {
@Autowired //@Inject @Inject
private ContatoDAO dao; private ContatoDAO dao;
QCONSP #3 ROUND #1
18. Persistência
Spring JavaEE
@Repository @Stateless
public class ContatoDAO { public class ContatoDAO {
@PersistenceContext @PersistenceContext
private EntityManager manager; private EntityManager manager;
persistence.xml
definição datasource
QCONSP #3 ROUND #2
20. Persistência
@Repository
Spring @Stateless
JavaEE
public class ContatoDAO { public class ContatoDAO {
@Autowired @Resource
private JdbcTemplate template; private DataSource ds;
public void salva(Contato c){
public void salva(Contato c) { try {
template.update( Connection con = ds.getConn..();
"insert ... values (?, ?)", PreparedStatement ps =
c.nome(), c.idade()); con.prepareStatement(“insert ..”);
} ps.setString(1, c.nome());
} ps.setString(1, c.idade());
ps.execute();
ps.close();
}catch(..){} ...
QCONSP #3 ROUND #2
24. Transação e Exceção
Spring JavaEE
@Transactional(...) @TransactionAttribute(...)
@Repository @Stateless
public class ContatoDAO { public class ContatoDAO {
@PersistenceContext @PersistenceContext
private EntityManager manager; private EntityManager manager;
<bean id=”xxxTransactionManager” ejb-jar.xml
.../>
QCONSP #3 ROUND #3
26. Transação e Exceção
Spring JavaEE
@Transaction(rollbackFor= @ApplicationException(rollback=true)
DaoException.class) public class DaoException
public class ContatoController{ extends Exception{}
•HandlerExceptionResolver •<error-page>
•AOP Proxies •filtros ou interceptadores
QCONSP #3 ROUND #3
29. Web-Peso leve
@Controller
Spring @Named
JavaEE
@Transactional @RequestScoped
public class ContatoController { public class ContatoMB {
@Autowired private Contato contato;
private ContatoDAO dao; private List<Contato> contatos;
@RequestMapping("/adicionar") @Inject
public ModelAndView adicionar(Contato c){ private ContatoDAO dao;
dao.salva(c);
ModelAndView mv = new ModelAndView("ok"); public void salvar(){
mv.addObject("contatos", dao.lista); dao.salva(contato);
return mav; zeraForm();
} }
QCONSP #3 ROUND #4
31. Web-Peso pesado
Spring JavaEE
public class EncodingPostProcessor public class UtilMB {
implements BeanPostProcessor {
public String reset() {
public Object postProcessBeforeInitialzation FacesContext context =
(Object bean, String name) FacesContext.getCurrentInstance();
throws BeansException Application application =
{if(bean instanceof context.getApplication();
AnnotationMethodHandlerAdapter) { ViewHandler viewHandler =
application.getViewHandler();
HttpMessageConverter<?>[] convs = UIViewRoot viewRoot =
((AnnotationMethodHandlerAdapter) viewHandler.createView(context,
bean).getMessageConverters(); context.getViewRoot().getViewId());
context.setViewRoot(viewRoot);
for (HttpMessageConverter<?> conv : convs) { return "success";
}
if(conv instanceof }
StringHttpMessageConverter) {
((StringHttpMessageConverter) conv)
.setSupportedMediaTypes(Arrays
.asList(new MediaType("text", "
Charset.forName("UTF-)
}
QCONSP #3 ROUND #4
32. Web
Action-based vs. Component-based
QCONSP #3 ROUND #4
34. Web-Service - SOAP
Spring JavaEE
@WebService @WebService
public class ContatosWS extends public class ContatosWS{
SpringBeanAutowiringSupport{
@Inject
@Autowired ContatoDAO dao;
private ContatoDAO dao;
public List<Contato> listaDeContatos(){
public List<Contato> listaDeContatos() { return dao.lista();
if(dao==null{ }
processInjectionBasedOnCurrentContext(this);
} }
...;
}
}
QCONSP #3 ROUND #5
36. Web-Service - REST
@Controller
Spring @Path("/")
JavaEE
public class ContatoResource { public class ContatoResource {
@Autowired @Inject
private ContatoDAO dao; private ContatoDAO dao;
@RequestMapping( @GET
value = "/contatos/{id}", @Path("/contatos/{id}")
produces={"application/json"}, @Produces({"application/json"})
method=RequestMethod.GET) public Contato load(@PathParam("id")
@ResponseBody Long id){
public Contato load(@PathVariable("id") return dao.busca(id);
Long id) { }
return dao.busca(id); }
}
}
QCONSP #3 ROUND #5
38. Mensageria
JavaEE - JMS
InitialContext ic = new InitialContext();
ConnectionFactory cf = (ConnectionFactory)ic.lookup("Factory");
Connection con = cf.createConnection(..);
Session session = con.createSession(false,AUTO_ACKNOWLEDGE);
TextMessage msg = session.createTextMessage("oi jms");
Queue queue = (Queue)ic.lookup("jms/queue/loja");
QueueSender sender = session.createSender(queue);
sender.send(textMessage);
con.close();
QCONSP #3 ROUND #6
39. Mensageria
JavaEE - JMS
InitialContext ic = new InitialContext();
ConnectionFactory cf = (ConnectionFactory)ic.lookup("Factory");
Connection con = cf.createConnection(..);
Session session = con.createSession(false,AUTO_ACKNOWLEDGE);
TextMessage msg = session.createTextMessage("oi jms");
Queue queue = (Queue)ic.lookup("jms/queue/loja");
QueueSender sender = session.createSender(queue);
sender.send(textMessage);
con.close();
QCONSP #3 ROUND #6
40. Mensageria
Spring - JMSTemplate
@Autowired JmsTemplate template;
@Autowired Queue queue;
public void enviaMensagem() {
this.template.send(queue, new MessageCreator() {
public Message createMessage(Session s) throws JMSException {
return session.createTextMessage("oi jms");
}
});
}
QCONSP #3 ROUND #6
41. Mensageria
Spring - JMSTemplate
@Autowired JmsTemplate template;
@Autowired Queue queue;
public void enviaMensagem() {
this.template.send(queue, new MessageCreator() {
public Message createMessage(Session s) throws JMSException {
return session.createTextMessage("oi jms");
}
});
}
QCONSP #3 ROUND #6
43. Mensageria
Spring Integration
QCONSP #3 ROUND #6
45. Segurança
JavaEE - JAAS
<security-constraint> @RolesAllowed({"cliente"})
<web-resource-collection> public void salva(Contato contato){
<url-pattern>/adiciona.jsf</url-pattern> //...
</web-resource-collection> }
<auth-constraint>
<role-name>*</role-name> @PermitAll, @DenyAll ...
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>v
<form-login-config>
<form-login-page>/login.jsf
</form-login-page>
</form-login-config>
</login-config>
<security-role>
<role-name>*</role-name>
</security-role>
QCONSP #3 ROUND #7
46. Segurança
JavaEE - JAAS
<security-constraint> @RolesAllowed({"cliente"})
<web-resource-collection> public void salva(Contato contato){
<url-pattern>/adiciona.jsf</url-pattern> //...
</web-resource-collection> }
<auth-constraint>
<role-name>*</role-name> @PermitAll, @DenyAll ...
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>v
<form-login-config>
<form-login-page>/login.jsf
</form-login-page>
</form-login-config>
</login-config>
<security-role>
<role-name>*</role-name>
</security-role>
QCONSP #3 ROUND #7
48. Segurança
Spring Security
<sec:authentication-manager> @Secured({"cliente"})
<sec:authentication-provider public void salva(Contato contato){
user-service-ref="userDAO" /> //...
</sec:authentication-manager> }
<sec:http auto-config="true">
<sec:intercept-url <sec:authorize access="hasRole('cliente')">
pattern="/contatos.spring" um jsp restrito
access="ROLE_USER" /> </sec:authorize>
<sec:form-login
login-page="/login-form.spring"
default-target-url="/contatos.spring"
login-processing-url="/login" />
<sec:logout logout-url="/logout"
logout-success-url="/login-form.spring"/>
</sec:http>
QCONSP #3 ROUND #7
55. Extras
“We will create new projects
where no good solution exists.”
SpringSource
QCONSP #3 ROUND #9
62. Especifição
vs
Implementação
“Standards are for standardizing,
and not innovating.”
Ed Burns (Líder JSF-Spec )
QCONSP #3 ROUND #10
64. Especifição
vs
Implementação
"Stick to the standard when you can,
leave the standards when you need."
Antonio Goncalves (JCP Expert Member)
QCONSP #3 ROUND #10
Notes de l'éditeur \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n