SlideShare une entreprise Scribd logo
1  sur  29
Globalcode – Open4education
Software Livre: E o DeltaSpike ?
Rafael Benevides
Globalcode – Open4education
Quem sou eu?
Nome: Rafael Benevides
JBoss Software Engineer
JBoss Developer Materials lead
Apache DeltaSpike committer
Twitter: @rafabene
Globalcode – Open4education
CDI Extensions
OCP (Open closed Principle)
Globalcode – Open4education
OCP in CDI =
Portable Extensions
Baseado em SPI (Service Provider Interface)
Permite:
✔
Registrar novos “Beans”
✔
Registrar novos “Scopes” (custom scopes)
✔
Satisfazer @Inject “tion” points
✔
Modificar os metadados dos Beans
Globalcode – Open4education
Apache DeltaSpike
Globalcode – Open4education
Como tudo começou
JBoss Seam 3 Apache MyFaces
CODI
CDI Source
Comunidade
Java EE
Globalcode – Open4education
Qual o propósito do
projeto DeltaSpike ?
“Suportar o desenvolvimento de Portable Extensions
CDI que promovam funcionalidades úteis para
aplicações Java que não são fornecidas pela
especificação CDI.”
(Documentação DeltaSpike)
Globalcode – Open4education
Então o DeltaSpike é
um framework ?
Globalcode – Open4education
Compatibilidade
Globalcode – Open4education
Módulos
“Extensões criadas pela comunidade são
empacotadas como módulos”
(Documentação DeltaSpike)
Globalcode – Open4education
Módulos
CORE
Security
JPA
JSF
Bean validation
Servlet
Partial Bean
Data
Test Control
Scheduler
Globalcode – Open4education
Strong typing
Injeção de dependência tipada
Elimina a dependência de Strings
Fácil refatoração
Compilador pode detectar erros
Nenhuma ferramenta especial é
necessária
Elimina cast (ok, esconde casts)
Resolução de erros detectado durante deploy
Strong typing == Strong tooling
Globalcode – Open4education
Principais funcionalidades
Exception Handler
try {
// Invoca um serviço que lança exception
} catch (NoResultException e) {
// O tratamento de exception é delegado para os @ExceptionHandlers
catchEvent.fire(new ExceptionToCatchEvent(e));
}
Handlers
@ExceptionHandler
public class MyHandler {
void fazAlgoComException(@Handles ExceptionEvent<Throwable> evt) {
// Faz Algo com a Exception
evt.handledAndContinue();
}
}
Globalcode – Open4education
Principais funcionalidades
Type-safe Project Stage
UnitTest,
Development
SystemTest
IntegrationTest
Staging
Production
Configurável via DeltaSpike Configuration API
@Inject
private ProjectStage projectStage;
boolean isDevProjectStage = ProjectStage
.Development.equals(this.projectStage);
<h:panelGroup layout="block"
rendered="#{applicationConfig.projectStage == 'Development'}"
-Dorg.apache.deltaspike.ProjectStage=Development
Globalcode – Open4education
Principais Funcionalidades
DeltaSpike Configuration API
public String getFilaJMS() {
return ConfigResolver.getProjectStageAwarePropertyValue("jms.queue");
}
jms.queue.Production=queue/queueProduction
jms.queue.Development=queue/queueDevelopment
Múltiplos ConfigSources:
System properties (deltaspike_ordinal = 400)
Environment properties (deltaspike_ordinal = 300)
JNDI values (deltaspike_ordinal = 200, the base name is "java:comp/env/deltaspike/")
Properties file values (apache-deltaspike.properties) (deltaspike_ordinal = 100,
default filename is "META-INF/apache-deltaspike.properties")
Globalcode – Open4education
Principais funcionalidades
Injetable Resource
@Inject
@InjectableResource(location = "/version.txt")
private InputStream is;
public String getVersion() throws IOException {
try (BufferedReader br =
new BufferedReader(new InputStreamReader(is))) {
return br.readLine();
}
}
Globalcode – Open4education
Principais funcionalidades
I18n Messages
@Named("msg")
@MessageBundle
public interface Messages {
public String usuarioAdicionado(String username);
public String usuario();
@MessageTemplate("{password}")
public String senha();
}
<br /> #{msg.senha()}:
@Inject
private Messages messages;
new FacesMessage(msg.usuarioAdicionado("Rafael"));
Globalcode – Open4education
Principais funcionalidades
Segurança
@Retention(value = RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@SecurityBindingType
public @interface AdminOnly {
}
@ApplicationScoped
public class ApplicationAuthorizer
{
@Secures
@AdminOnly
public boolean verificaPermissao(InvocationContext invocationContext,
BeanManager manager, @Logado Usuario usuario) throws Exception {
return usuario.getRole().equalsIgnoreCase("Admin");
}
}
@AdminOnly
public void iniciarTarefaAdministrativa() {
// Inicia uma tarefa
}
Globalcode – Open4education
Principais Funcionalidades
Data Module – Repository Pattern
@Repository
public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> {
// O DeltaSpike cria um proxy com implementações para
●
count();
●
findAll();
●
findBy(PK);
●
flush();
●
refresh();
●
remove();
●
save();
●
saveAndFlush();
}
Globalcode – Open4education
Principais Funcionalidades
Data Module – Repository Pattern
@Repository
public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> {
// O próprio nome do método cria o SQL
public Usuario findByUsernameAndPassword(String username, char[]
password);
}
@Repository
public interface RepositorioPostagens extends EntityRepository<Postagem,
Long> {
@Query("SELECT p FROM Postagem AS p WHERE p.autor in (?1)")
public List<Postagem> findBySeguidos(List<Usuario> usuariosSeguidos);
}
Globalcode – Open4education
Principais funcionalidades
Type-safe view-config for JSF
// type-safe outcome
public Class<Welcome> telaHome() {
return Home.class;
}
@Inject
ViewNavigationHandler vnh;
// type-safe outcome
public Class<CriarUsuario> tela2() {
vnh.navigateTo(CriarUsuario.class);
}
@Secured(CustomAccessDecisionVoter.class)
public interface SecuredPages {}
@View(navigation = REDIRECT)
public interface Pages extends ViewConfig
{
class Index implements Pages {
}
interface Admin extends Pages, SecuredPages
{
class Index implements Admin {
}
@View(navigation = FORWARD)
class Home implements Admin {
}
}
}
Globalcode – Open4education
Principais funcionalidades
@WindowScoped
“É como se fosse uma sessão por aba/janela...
Não existem muitos casos de uso que precisam
compartilhar dados entre as abas.”
(Documentação DeltaSpike)
Globalcode – Open4education
Principais funcionalidades
Agendador de Jobs integrado com o Quartz
//Job de exemplo agendado para rodar a cada 1 minuto
@Scheduled(cronExpression = "0 0/1 * * * ?", onStartup = false)
public class CdiAwareQuartzJob implements org.quartz.Job {
// O Job permite injeção CDI
@Inject
private AdminServices service;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
service.executarRotinasAdministrativas();
}
} @Inject
private Scheduler<Job> jobScheduler;
public void iniciarTarefaAdministrativa() {
jobScheduler.registerNewJob(CdiAwareQuartzJob.class);
}
Globalcode – Open4education
Outras funcionalidades
Servlet Module – Injectable Servlet objects/
Servlet Events Propagation
@Inject @DeltaSpike (qualifier para compatibilidade com CDI 1.1)
private HttpServletRequest request;
private HttpServletResponse response;
private HttpSession session;
private Principal principal;
@Observes @Initialized HttpServletRequest
@Observes @Destroyed HttpServletRequest
@Observes @Initialized HttpSession
Globalcode – Open4education
Outras funcionalidades
Bean Validation Module
Permite que “Validators” recebam injeção de objetos via
CDI em ambiente java EE 6 / CDI 1.0
Partial Bean
Permite a criação de implementações para suas
interfaces ou classes abstratas
Globalcode – Open4education
Outras funcionalidades
Container Control
Permite fazer o boot de implementações CDI em
ambiente Java SE, bem como controlar o ciclo de vida
dos contextos
Test Control
Facilita a criação de testes CDI
Inicia e finalizar o container CDI / Inicia Contextos
Controla o ProjectStage
Globalcode – Open4education
Conclusão
O DeltaSpike não é um full-stack framework
O DeltaSpike é um conjunto de Portable Extensions para
facilitar o desenvolvimento Java utilizando CDI
O DeltaSpike é um conjunto de ferramentas!
Globalcode – Open4education
Código Exemplo
/rafabene
https://github.com
/demo_deltaspike
Globalcode – Open4education

Contenu connexe

Tendances

Tendances (20)

Docker + Django
Docker + DjangoDocker + Django
Docker + Django
 
Aulão de docker
Aulão de dockerAulão de docker
Aulão de docker
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida real
 
Vagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + dockerVagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + docker
 
Docker para maiores
Docker para maioresDocker para maiores
Docker para maiores
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4
 
Docker
DockerDocker
Docker
 
QCon 2019 - Kubernetes Deepdive
QCon 2019 -  Kubernetes DeepdiveQCon 2019 -  Kubernetes Deepdive
QCon 2019 - Kubernetes Deepdive
 
Olá docker
Olá dockerOlá docker
Olá docker
 
Workshop Microservices - Distribuindo os Microservices com Docker e Kubernetes
Workshop Microservices - Distribuindo os Microservices com Docker e KubernetesWorkshop Microservices - Distribuindo os Microservices com Docker e Kubernetes
Workshop Microservices - Distribuindo os Microservices com Docker e Kubernetes
 
Criando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com AppiumCriando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com Appium
 
TDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de DockerTDC 2015 POA - O Fantástico Mundo de Docker
TDC 2015 POA - O Fantástico Mundo de Docker
 
Orquestrando Docker Containers: Machine, Swarm e Compose
Orquestrando Docker Containers: Machine, Swarm e ComposeOrquestrando Docker Containers: Machine, Swarm e Compose
Orquestrando Docker Containers: Machine, Swarm e Compose
 
Deploying Docker Containers
Deploying Docker ContainersDeploying Docker Containers
Deploying Docker Containers
 
Primeiros passos com o Docker
Primeiros passos com o DockerPrimeiros passos com o Docker
Primeiros passos com o Docker
 
Crud
CrudCrud
Crud
 
Docker, facilitando a vida do desenvolvimento
Docker, facilitando a vida do desenvolvimentoDocker, facilitando a vida do desenvolvimento
Docker, facilitando a vida do desenvolvimento
 
Poco Bibliotecas C++
Poco Bibliotecas C++Poco Bibliotecas C++
Poco Bibliotecas C++
 
Alagoas Dev Day
Alagoas Dev DayAlagoas Dev Day
Alagoas Dev Day
 
Docker e suas tecnologias por @cesarnog
Docker e suas tecnologias por @cesarnogDocker e suas tecnologias por @cesarnog
Docker e suas tecnologias por @cesarnog
 

En vedette

En vedette (18)

Architecting cloud-enabled applications using Spring-Integration 2.x
Architecting cloud-enabled applications using Spring-Integration 2.xArchitecting cloud-enabled applications using Spring-Integration 2.x
Architecting cloud-enabled applications using Spring-Integration 2.x
 
Microservices with Kubernetes, Docker, and Jenkins
Microservices with Kubernetes, Docker, and JenkinsMicroservices with Kubernetes, Docker, and Jenkins
Microservices with Kubernetes, Docker, and Jenkins
 
Enterprise Integration Patterns na nuvem com Spring Integration
Enterprise Integration Patterns na nuvem com Spring IntegrationEnterprise Integration Patterns na nuvem com Spring Integration
Enterprise Integration Patterns na nuvem com Spring Integration
 
JavaOne 2016: The Deploy Master: From Basic to Zero Downtime, Blue/Green, A/B...
JavaOne 2016: The Deploy Master: From Basic to Zero Downtime, Blue/Green, A/B...JavaOne 2016: The Deploy Master: From Basic to Zero Downtime, Blue/Green, A/B...
JavaOne 2016: The Deploy Master: From Basic to Zero Downtime, Blue/Green, A/B...
 
Java Craftsmanship: Lessons Learned on How to Produce Truly Beautiful Java Code
Java Craftsmanship: Lessons Learned on How to Produce Truly Beautiful Java CodeJava Craftsmanship: Lessons Learned on How to Produce Truly Beautiful Java Code
Java Craftsmanship: Lessons Learned on How to Produce Truly Beautiful Java Code
 
Write Powerful Javascript Modules To Make Your Apps DRY (Brian Leathem)
Write Powerful Javascript Modules To Make Your Apps DRY (Brian Leathem)Write Powerful Javascript Modules To Make Your Apps DRY (Brian Leathem)
Write Powerful Javascript Modules To Make Your Apps DRY (Brian Leathem)
 
CDK 2.0: Docker, Kubernetes, And OSE On Your Desk (Langdon White)
CDK 2.0: Docker, Kubernetes, And OSE On Your Desk (Langdon White)CDK 2.0: Docker, Kubernetes, And OSE On Your Desk (Langdon White)
CDK 2.0: Docker, Kubernetes, And OSE On Your Desk (Langdon White)
 
JavaOne 2016: Kubernetes introduction for Java Developers
JavaOne 2016: Kubernetes introduction for Java Developers JavaOne 2016: Kubernetes introduction for Java Developers
JavaOne 2016: Kubernetes introduction for Java Developers
 
High Performance Data Storage in a Microservices Environment
High Performance Data Storage in a Microservices EnvironmentHigh Performance Data Storage in a Microservices Environment
High Performance Data Storage in a Microservices Environment
 
Containers: Under The Hood (Vincent Batts)
Containers: Under The Hood (Vincent Batts)Containers: Under The Hood (Vincent Batts)
Containers: Under The Hood (Vincent Batts)
 
MicroServices for Java Developers
MicroServices for Java Developers MicroServices for Java Developers
MicroServices for Java Developers
 
Kubernetes for Java Developers
 Kubernetes for Java Developers Kubernetes for Java Developers
Kubernetes for Java Developers
 
DevOps Moves To Production (Lori MacVittie)
DevOps Moves To Production (Lori MacVittie)DevOps Moves To Production (Lori MacVittie)
DevOps Moves To Production (Lori MacVittie)
 
The Deploy Master: From Basic to Zero Downtime, Blue/Green, A/B and Canary
The Deploy Master: From Basic to Zero Downtime, Blue/Green, A/B and CanaryThe Deploy Master: From Basic to Zero Downtime, Blue/Green, A/B and Canary
The Deploy Master: From Basic to Zero Downtime, Blue/Green, A/B and Canary
 
Reactive Distributed Applications with Vert.x
Reactive Distributed Applications with Vert.xReactive Distributed Applications with Vert.x
Reactive Distributed Applications with Vert.x
 
Java and DevOps: Supercharge Your Delivery Pipeline with Containers
Java and DevOps: Supercharge Your Delivery Pipeline with ContainersJava and DevOps: Supercharge Your Delivery Pipeline with Containers
Java and DevOps: Supercharge Your Delivery Pipeline with Containers
 
Microservices with Docker, Kubernetes, and Jenkins
Microservices with Docker, Kubernetes, and JenkinsMicroservices with Docker, Kubernetes, and Jenkins
Microservices with Docker, Kubernetes, and Jenkins
 
Developing In Python On Red Hat Platforms (Nick Coghlan & Graham Dumpleton)
Developing In Python On Red Hat Platforms (Nick Coghlan & Graham Dumpleton)Developing In Python On Red Hat Platforms (Nick Coghlan & Graham Dumpleton)
Developing In Python On Red Hat Platforms (Nick Coghlan & Graham Dumpleton)
 

Similaire à TDC 2014 SP - E o DeltaSpike ?

Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
Denis L Presciliano
 

Similaire à TDC 2014 SP - E o DeltaSpike ? (20)

JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computing
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Precisamos falar sobre Gradle
Precisamos falar sobre GradlePrecisamos falar sobre Gradle
Precisamos falar sobre Gradle
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com Java
 
SpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm ServerSpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm Server
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
MC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrões
MC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrõesMC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrões
MC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrões
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizados
 
Aplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com DockerAplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com Docker
 
Liferay e Modularização com Arquitetura OSGi
Liferay e Modularização com Arquitetura OSGiLiferay e Modularização com Arquitetura OSGi
Liferay e Modularização com Arquitetura OSGi
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
Workshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootWorkshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring Boot
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Inversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET FrameworkInversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET Framework
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium
 

Plus de Rafael Benevides (6)

Docker for (Java) Developers
Docker for (Java) DevelopersDocker for (Java) Developers
Docker for (Java) Developers
 
Reunião SouJava BSB - 2005 - Java a favor do consumidor brasileiro
Reunião SouJava BSB - 2005 - Java a favor do consumidor brasileiro Reunião SouJava BSB - 2005 - Java a favor do consumidor brasileiro
Reunião SouJava BSB - 2005 - Java a favor do consumidor brasileiro
 
TDC 2012 - JDF
TDC 2012 - JDFTDC 2012 - JDF
TDC 2012 - JDF
 
JBossInBossa 2011 - BRMS
JBossInBossa 2011 - BRMSJBossInBossa 2011 - BRMS
JBossInBossa 2011 - BRMS
 
JBossinBossa 2010 - Seam
JBossinBossa 2010 -  SeamJBossinBossa 2010 -  Seam
JBossinBossa 2010 - Seam
 
Red Hat Roadshow 2009 - Drools
Red Hat Roadshow 2009 - DroolsRed Hat Roadshow 2009 - Drools
Red Hat Roadshow 2009 - Drools
 

Dernier

Dernier (6)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 

TDC 2014 SP - E o DeltaSpike ?

  • 1. Globalcode – Open4education Software Livre: E o DeltaSpike ? Rafael Benevides
  • 2. Globalcode – Open4education Quem sou eu? Nome: Rafael Benevides JBoss Software Engineer JBoss Developer Materials lead Apache DeltaSpike committer Twitter: @rafabene
  • 3. Globalcode – Open4education CDI Extensions OCP (Open closed Principle)
  • 4. Globalcode – Open4education OCP in CDI = Portable Extensions Baseado em SPI (Service Provider Interface) Permite: ✔ Registrar novos “Beans” ✔ Registrar novos “Scopes” (custom scopes) ✔ Satisfazer @Inject “tion” points ✔ Modificar os metadados dos Beans
  • 6. Globalcode – Open4education Como tudo começou JBoss Seam 3 Apache MyFaces CODI CDI Source Comunidade Java EE
  • 7. Globalcode – Open4education Qual o propósito do projeto DeltaSpike ? “Suportar o desenvolvimento de Portable Extensions CDI que promovam funcionalidades úteis para aplicações Java que não são fornecidas pela especificação CDI.” (Documentação DeltaSpike)
  • 8. Globalcode – Open4education Então o DeltaSpike é um framework ?
  • 10. Globalcode – Open4education Módulos “Extensões criadas pela comunidade são empacotadas como módulos” (Documentação DeltaSpike)
  • 11. Globalcode – Open4education Módulos CORE Security JPA JSF Bean validation Servlet Partial Bean Data Test Control Scheduler
  • 12. Globalcode – Open4education Strong typing Injeção de dependência tipada Elimina a dependência de Strings Fácil refatoração Compilador pode detectar erros Nenhuma ferramenta especial é necessária Elimina cast (ok, esconde casts) Resolução de erros detectado durante deploy Strong typing == Strong tooling
  • 13. Globalcode – Open4education Principais funcionalidades Exception Handler try { // Invoca um serviço que lança exception } catch (NoResultException e) { // O tratamento de exception é delegado para os @ExceptionHandlers catchEvent.fire(new ExceptionToCatchEvent(e)); } Handlers @ExceptionHandler public class MyHandler { void fazAlgoComException(@Handles ExceptionEvent<Throwable> evt) { // Faz Algo com a Exception evt.handledAndContinue(); } }
  • 14. Globalcode – Open4education Principais funcionalidades Type-safe Project Stage UnitTest, Development SystemTest IntegrationTest Staging Production Configurável via DeltaSpike Configuration API @Inject private ProjectStage projectStage; boolean isDevProjectStage = ProjectStage .Development.equals(this.projectStage); <h:panelGroup layout="block" rendered="#{applicationConfig.projectStage == 'Development'}" -Dorg.apache.deltaspike.ProjectStage=Development
  • 15. Globalcode – Open4education Principais Funcionalidades DeltaSpike Configuration API public String getFilaJMS() { return ConfigResolver.getProjectStageAwarePropertyValue("jms.queue"); } jms.queue.Production=queue/queueProduction jms.queue.Development=queue/queueDevelopment Múltiplos ConfigSources: System properties (deltaspike_ordinal = 400) Environment properties (deltaspike_ordinal = 300) JNDI values (deltaspike_ordinal = 200, the base name is "java:comp/env/deltaspike/") Properties file values (apache-deltaspike.properties) (deltaspike_ordinal = 100, default filename is "META-INF/apache-deltaspike.properties")
  • 16. Globalcode – Open4education Principais funcionalidades Injetable Resource @Inject @InjectableResource(location = "/version.txt") private InputStream is; public String getVersion() throws IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) { return br.readLine(); } }
  • 17. Globalcode – Open4education Principais funcionalidades I18n Messages @Named("msg") @MessageBundle public interface Messages { public String usuarioAdicionado(String username); public String usuario(); @MessageTemplate("{password}") public String senha(); } <br /> #{msg.senha()}: @Inject private Messages messages; new FacesMessage(msg.usuarioAdicionado("Rafael"));
  • 18. Globalcode – Open4education Principais funcionalidades Segurança @Retention(value = RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) @Documented @SecurityBindingType public @interface AdminOnly { } @ApplicationScoped public class ApplicationAuthorizer { @Secures @AdminOnly public boolean verificaPermissao(InvocationContext invocationContext, BeanManager manager, @Logado Usuario usuario) throws Exception { return usuario.getRole().equalsIgnoreCase("Admin"); } } @AdminOnly public void iniciarTarefaAdministrativa() { // Inicia uma tarefa }
  • 19. Globalcode – Open4education Principais Funcionalidades Data Module – Repository Pattern @Repository public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> { // O DeltaSpike cria um proxy com implementações para ● count(); ● findAll(); ● findBy(PK); ● flush(); ● refresh(); ● remove(); ● save(); ● saveAndFlush(); }
  • 20. Globalcode – Open4education Principais Funcionalidades Data Module – Repository Pattern @Repository public interface RepositorioUsuarios extends EntityRepository<Usuario, Long> { // O próprio nome do método cria o SQL public Usuario findByUsernameAndPassword(String username, char[] password); } @Repository public interface RepositorioPostagens extends EntityRepository<Postagem, Long> { @Query("SELECT p FROM Postagem AS p WHERE p.autor in (?1)") public List<Postagem> findBySeguidos(List<Usuario> usuariosSeguidos); }
  • 21. Globalcode – Open4education Principais funcionalidades Type-safe view-config for JSF // type-safe outcome public Class<Welcome> telaHome() { return Home.class; } @Inject ViewNavigationHandler vnh; // type-safe outcome public Class<CriarUsuario> tela2() { vnh.navigateTo(CriarUsuario.class); } @Secured(CustomAccessDecisionVoter.class) public interface SecuredPages {} @View(navigation = REDIRECT) public interface Pages extends ViewConfig { class Index implements Pages { } interface Admin extends Pages, SecuredPages { class Index implements Admin { } @View(navigation = FORWARD) class Home implements Admin { } } }
  • 22. Globalcode – Open4education Principais funcionalidades @WindowScoped “É como se fosse uma sessão por aba/janela... Não existem muitos casos de uso que precisam compartilhar dados entre as abas.” (Documentação DeltaSpike)
  • 23. Globalcode – Open4education Principais funcionalidades Agendador de Jobs integrado com o Quartz //Job de exemplo agendado para rodar a cada 1 minuto @Scheduled(cronExpression = "0 0/1 * * * ?", onStartup = false) public class CdiAwareQuartzJob implements org.quartz.Job { // O Job permite injeção CDI @Inject private AdminServices service; @Override public void execute(JobExecutionContext context) throws JobExecutionException { service.executarRotinasAdministrativas(); } } @Inject private Scheduler<Job> jobScheduler; public void iniciarTarefaAdministrativa() { jobScheduler.registerNewJob(CdiAwareQuartzJob.class); }
  • 24. Globalcode – Open4education Outras funcionalidades Servlet Module – Injectable Servlet objects/ Servlet Events Propagation @Inject @DeltaSpike (qualifier para compatibilidade com CDI 1.1) private HttpServletRequest request; private HttpServletResponse response; private HttpSession session; private Principal principal; @Observes @Initialized HttpServletRequest @Observes @Destroyed HttpServletRequest @Observes @Initialized HttpSession
  • 25. Globalcode – Open4education Outras funcionalidades Bean Validation Module Permite que “Validators” recebam injeção de objetos via CDI em ambiente java EE 6 / CDI 1.0 Partial Bean Permite a criação de implementações para suas interfaces ou classes abstratas
  • 26. Globalcode – Open4education Outras funcionalidades Container Control Permite fazer o boot de implementações CDI em ambiente Java SE, bem como controlar o ciclo de vida dos contextos Test Control Facilita a criação de testes CDI Inicia e finalizar o container CDI / Inicia Contextos Controla o ProjectStage
  • 27. Globalcode – Open4education Conclusão O DeltaSpike não é um full-stack framework O DeltaSpike é um conjunto de Portable Extensions para facilitar o desenvolvimento Java utilizando CDI O DeltaSpike é um conjunto de ferramentas!
  • 28. Globalcode – Open4education Código Exemplo /rafabene https://github.com /demo_deltaspike

Notes de l'éditeur

  1. according to OCP software should be open for extension and closed for modification Você não precisa abrir o peito de uma pessoa para colocar um casaco.
  2. according to OCP software should be open for extension and closed for modification Você não precisa abrir o peito de uma pessoa para colocar um casaco.
  3. CDI possibilita a extensão de suas funcionalidades – Hack Java EE :) A especificação fornece um SPI (que é uma Service Provider Interface), onde o o Provedor de serviços implementa uma interface para estender o CDI Esta funcionalidade é oficialmante chamada de CDI Portable Extensions É portable pois todos os servers devem suportar sua implantação Nada mais, nada menos que um JAR
  4. Conjunto de Portable Extensions CDI com diversas funcionalidades e extensões prontas para você dar uma acelerada no seu projeto.
  5. Quem estava escrevendo Portable Extensions CDI?
  6. O DeltaSpike NÃO é um full stack frameworkj como o Seam, Spring, Play, etc Não há nada de errado hoje em dia nos chamados Full Stack Frameworks (englobam funcionalides para View, Persistência, Segurança) A confusão veio por causa do Seam 3
  7. Mesmo com a garantia de portabilidade na especidicac&amp;apos;ão CDI para Portalble estensions, A integração contínua do DeltaSpike é testada nas implmentações Glassfish, 3 e 4, Weld 1, 2, TomEE, OpenWebBeans
  8. Antes de falarmos das funcionalidades, é preciso saber... O DeltaSpike por ser baseado em CDI é fortemente tipado. Oq isto significa ?
  9. Ou pelo menos as funcionalidades que mais me atraem Posso ter os mais variados Handlers: Logar a Exception: - enviar para uma console administrativa, - enviar para uma fila para ser tratada, - Tratar exceptions específicas de maneira diferenciada, etc
  10. Permite configurar o estágio do projeto. Algum dos estágio pré-definidos, você pode criar um stage custom (caso sua empresa tenha algo fora do normal)
  11. Permite passar configurações para a aplicação Multiplas configurações por ProjectStage Multiplos origens de configuração, inclusive um custom
  12. Permite injectar InputStreams de maneira fácil Pode ser um arquivo texto, uma imagem, etc
  13. Permite que o código fique mais expressivo, além de facilitar e muito lidar com grandes sistemas que requeiram internacionalização Vantagem1: Evita Strings no código / facilita refactoring Vantagem2: Evitar cadastrar chaves duplicadas
  14. A segurança também é type-safe onde pode-se criar anotações que serão checadas por métodos específicos
  15. O Data Module criar um proxy com implementações de alguns métodos básicos como save, saveAndFlush, remove, count, findBy(PK), etc
  16. Além disso, é possível criar queries customizadas usando o nome do método ou então declarar a query com a anotação @Query
  17. Apesar do JSF estar caindo em desuso o type-safe view config é uma mão não roda
  18. Permite a injeção de beans CDI em Jobs Quartz, Permite a injeção de um Schedduler para manipular os Jobs Permite o agendamento do Jobs através da anotação @Scheduled
  19. Permite em ambiente CDI 1.0 a injeção de objetos do ambiente Servlet. É possível utilizar o qualifier @Deltaspike para seu código ter compatibilidade com o CDI 1.1 onde esta funcionlidade faz parte da especificação Também é possível registrar listerners CDI para os eventos gerados pelo Servlet