O documento discute o Apache DeltaSpike, um conjunto de extensões portáteis para o CDI que fornece funcionalidades úteis para aplicações Java. O DeltaSpike inclui módulos como segurança, JPA, JSF e agendamento de tarefas. Ele permite injeção de dependência tipada, configuração de projeto, recursos injetáveis e internacionalização de mensagens. O DeltaSpike facilita o desenvolvimento Java usando o CDI sem ser um framework completo.
4. 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
5. 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
6. Eventos do Container CDI
• BeforeBeanDiscovery
• ProcessAnnotatedType and ProcessSyntheticAnnotatedType
• AfterTypeDiscovery
• ProcessInjectionTarget and ProcessProducer
• ProcessInjectionPoint
• ProcessBeanAttributes
• ProcessBean, ProcessManagedBean, ProcessSessionBean,
ProcessProducerMethod and ProcessProducerField
• ProcessObserverMethod
• AfterBeanDiscovery
• AfterDeploymentValidation
8. 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?
14. Como tudo começou
JBoss Seam 3 Apache MyFaces
CODI
CDI Source Comunidade
Java EE
15. 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)
18. Módulos
• “Extensões criadas pela comunidade são
empacotadas como módulos”
(Documentação DeltaSpike)
19. Módulos
CORE
Security
JPA
JSF
Bean validation
Servlet
Partial Bean
Data
Test Control
Scheduler
20. 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
21. 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();
}
}
25. 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"));
26. 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
}
27. 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();
}
28. 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);
}
29. 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 {
}
}
}
30. 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.”
31. 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);
}
33. 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
34. 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
35. 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!