cdi extensions e deltaspike
DESCRIPTION
General prez about CDI Portable extensions and the Apache DeltaSpike project.TRANSCRIPT
JasoctAS Project Lead
May 4, 2011
CDI Extensions andApache DeltaSpike
Rafael Benevides
Senior Software [email protected]
Quem sou eu?
• Nome: Rafael Benevides
• JBoss Software Engineer
• JBoss Developer Materials lead
• Apache DeltaSpike committer
• Twitter: @rafabene
• e-Mail: [email protected]
CDI Extensions• OCP (Open closed Principle)
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
Como criar uma CDI Portable Extension ?
• Baseado no java.util.ServiceLoader
• Implementar javax.enterprise.inject.spi.Extension
• Registrar a Extensão
• Observar eventos do Container CDI
• Durante o boot do container, modificar o comportamento do CDI
Eventos do Container CDI• BeforeBeanDiscovery
• ProcessAnnotatedType and ProcessSyntheticAnnotatedType
• AfterTypeDiscovery
• ProcessInjectionTarget and ProcessProducer
• ProcessInjectionPoint
• ProcessBeanAttributes
• ProcessBean, ProcessManagedBean, ProcessSessionBean, ProcessProducerMethod and ProcessProducerField
• ProcessObserverMethod
• AfterBeanDiscovery
• AfterDeploymentValidation
Como registrar a extensão
Como a extensão é carregada?
Opções ?
O container CDI procura todas implementações da interface Extension ?
A JRE procurar todas implemetações da interface Extension?
Opções ?
Magia ?
Como a extensão é carregada?
Opções ?
Magia ?
ServiceLoader
Como a extensão é carregada?
E na vida real?
Portable Extensions
“Você decide o que fazer com os Beans que o CDI lhe fornece”
Apache DeltaSpike
http://deltaspike.apache.org
Como tudo começou
JBoss Seam 3 Apache MyFacesCODI
CDI Source Comunidade Java EE
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)
Então o DeltaSpike éum framework ?
Compatibilidade
Módulos
• “Extensões criadas pela comunidade são empacotadas como módulos”
(Documentação DeltaSpike)
Módulos
CORE
Security
JPA
JSF
Bean validation
Servlet
Partial Bean
Data
Test Control
Scheduler
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
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(); } }
@Injectprivate ProjectStage projectStage;
boolean isDevProjectStage = ProjectStage.Development.equals(this.projectStage);
<h:panelGroup layout="block" rendered="#{applicationConfig.projectStage == 'Development'}"
-Dorg.apache.deltaspike.ProjectStage=Development
Principais funcionalidadesType-safe Project Stage
•UnitTest, •Development•SystemTest•IntegrationTest•Staging•Production
Confgurável via DeltaSpike Confguration API
• DeltaSpike Configuration API public String getFilaJMS() { return ConfigResolver.getProjectStageAwarePropertyValue("jms.queue"); } jms.queue.Production=queue/queueProduction jms.queue.Development=queue/queueDevelopment
• Múltiplos ConfigSources:
• Properties file values (apache-deltaspike.properties) (deltaspike_ordinal = 100, default filename is "META-INF/apache-deltaspike.properties")
• JNDI values (deltaspike_ordinal = 200, the base name is "java:comp/env/deltaspike/")
• Environment properties (deltaspike_ordinal = 300)
• System properties (deltaspike_ordinal = 400)
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(); } }
Principais funcionalidades
• I18n Messages@Named("msg")@MessageBundlepublic interface Messages { public String usuarioAdicionado(String username); public String usuario(); @MessageTemplate("{password}") public String senha();}
<br /> #{msg.senha()}:
@Injectprivate Messages messages;
new FacesMessage(msg.usuarioAdicionado("Rafael"));
Principais funcionalidades
• Segurança@Retention(value = RetentionPolicy.RUNTIME)@Target({ ElementType.TYPE, ElementType.METHOD })@Documented@SecurityBindingTypepublic @interface AdminOnly {
}
@ApplicationScopedpublic 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 }
Principais funcionalidades
@Repositorypublic interface RepositorioUsuarios extends EntityRepository<Usuario, Long> {
// O DeltaSpike cria um proxy com implementações para● count();● findAll();● findBy(PK);● flush();● refresh();● remove();● save();● saveAndFlush(); }
Principais funcionalidades• Data Module – Repository Pattern
• Data Module – Repository Pattern@Repositorypublic interface RepositorioUsuarios extends EntityRepository<Usuario, Long> {
// O próprio nome do método cria o SQL public Usuario findByUsernameAndPassword(String username, char[] password); }
@Repositorypublic 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);
}
Principais funcionalidades
• Type-safe view-config for JSF
// type-safe outcomepublic Class<Welcome> telaHome() { return Home.class;}
@Inject ViewNavigationHandler vnh;
// type-safe outcomepublic 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 { } }}
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)
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);}
Principais 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
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
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
Outras funcionalidades
Conclusão• O DeltaSpike não é um full-stack framework
• O DeltaSpike é um conjunto de Portable Extensions para facilitar o desenvolvimento Javaa utilizando CDI
• O DeltaSpike é um conjunto de ferramentas!
Código Exemplo
/rafabenehttps://github.com
/demo_deltaspike
Questions?Questions?
[email protected]@redhat.com