A idéia básica da injeção de dependências com VRaptor é injetar objetos na sua lógica de negócios ...
public class DaoFactory {
public PersonDao getPersonDao() {
return new PersonDao();
}
public StudentDao getStudentDao() {
return new StudentDao();
}
}Observe: A anotação @Out é usada para ejetar a fabrica no escopo da requisição ...
public class DaoInterceptor implements Interceptor {
@Out
private DaoFactory factory = new DaoFactory();
public void intercept(LogicFlow flow) throws LogicException,
ViewException {
// executa o próximo interceptor ou lógica
flow.execute();
}
}@Component("injection")
@InterceptedBy(DaoInterceptor.class)
public class InjectionExample {
@In
private DaoFactory factory;
public void test() {
// faz alguma coisa com a fábrica injetada
}
}Se você chama injection.test.logic o fluxo seguinte será executado:
Criar Interceptor --> Chamar o método intercept --> Interceptor chama flow.execute --> Ejeção da fábrica --> Criar o Componente de Negócios --> Ler Parâmetros --> Chamar o Método da Lógica--> Redirecionamento ao View --> Finalização do Método intercept
A injeção tem como padrão o escopo da requisição. Você pode usar os mesmos escopos da anotação @Out: também veja Tipo de escopo.
VRaptor fornece a injeção pelo construtor procurando o objeto em todos os escopos. For exemplo:
public class InjectionExample {
private DaoFactory factory;
public InjectionExample(DaoFactory factory) {
this.factory = factory;
}
public void test() {
// faz alguma coisa com a fábrica injetada
}
}Se a fábrica pertence ao package org.vraptor.dao, VRaptor procura a chave org.vraptor.dao.DaoFactory em todos os escopos: lógica, requisição, sessão e aplicação, nesse ordem.
Se ele não acha nenhuma chave num escopo, o componente não pode ser criado e VRaptor gera uma exceção.
Ao contrário, se VRaptor consegue achar a chave, ele usa o seu valor e o passa para o construtor.
Nenhum componente pode ter mais do que um construtor, senão seria possível criar objetos complexos e componentes esquisitos com perigo de bugs .
Para implementar o exemplo acima corretamente, use a chave na anotação @Out:
public class DaoInterceptor implements Interceptor {
@Out(key="org.vraptor.dao.DaoFactory")
private DaoFactory factory = new DaoFactory();
public void intercept(LogicFlow flow) throws LogicException,
ViewException {
// executa o próximo interceptor ou lógica
flow.execute();
}
}Para acessá-los basta definir um construtor que os receba como argumento:
public MyLogicConstructor(HttpServletRequest request) {
this.request = request;
}Armazene o request (ou outro objeto) como variável membro e faça o que quiser com ele.
Outra maneira é usar a injeção via @In:
@In
private HttpServletRequest request;
@In
private HttpServletResponse response;
@In
private HttpSession session;
@In
private ServletContext servletContext;