public class Faculty {
private List<String> facultyMembers;
private String facultyName;
@PostConstruct
public void initialize() {
this.facultyMembers = new ArrayList<String>();
facultyMembers.add("Ian Schultz");
facultyMembers.add("Diane Reyes");
facultyName = "Computer Science";
}
public List<String> getFacultyMembers() {
return facultyMembers;
}
public String getFacultyName() {
return facultyName;
}
}
CDI @Inject
Para usar @Inject, a primeira coisa que você precisa de um arquivo META-INF/beans.xml no modulo ou um jar. Isso efetivamente ativa o CDI e permite que as referências @Inject funcionem. Sem o arquivo META-INF/beans.xml não tem injeção, ponto final. Isso pode parecer excessivamente rigoroso, mas não é sem razão. A API CDI é um pouco gananciosa e consome uma quantidade justa de recursos por projeto.
Quando o container constrói um bean com uma referência @Inject, ele irá primeiro encontrar ou criar o objeto que será injetado. Por uma questão de simplicidade, o exemplo é um pojo Faculty básico com um construtor no-arg. Qualquer um que faça referência a @Inject Faculty receberá sua própria instância de Faculty. Se o desejo é compartilhar a mesma instância do Faculty, veja o conceito de scopes - isto é exatamente para que serve os escopos.
Exemplo
Neste exemplo, nós temos um Stateless bean Course com uma referência @Inject a um objeto do tipo Faculty. Quando Course é criado, o contêiner também criará um instância do Faculty. O @PostConstruct será chamado no Faculty, então a instância Faculty será injetada no Course bean. Finalmente, o @PostConstruct será invocado no Course e pronto. Todas as instâncias serão criadas.
O caso de teste CourseTest impulsiona este processo de criação tendo o Course injetado em seu método @Setup. Quando nosso método @Test for invocado, todo o trabalho real deve ser feito e devemos estar prontos. No caso de teste, fazemos algumas afirmações básicas para garantir que tudo foi construído, todos os métodos @PostConstruct chamados e tudo será injetado.
Faculty um pojo injetável básicoo
Course a simple session bean
@Stateless
public class Course {
@Inject
private Faculty faculty;
private String courseName;
private int capacity;
@PostConstruct
private void init() {
assert faculty != null;
// These strings can be externalized
// We'll see how to do that later
this.courseName = "CDI 101 - Introduction to CDI";
this.capacity = 100;
}
public String getCourseName() {
return courseName;
}
public int getCapacity() {
return capacity;
}
public Faculty getFaculty() {
return faculty;
}
}
Caso de Teste
public class CourseTest extends TestCase {
@EJB
private Course course;
@Before
public void setUp() throws Exception {
EJBContainer.createEJBContainer().getContext().bind("inject", this);
}
@Test
public void test() {
// Was the EJB injected?
assertTrue(course != null);
// Was the Course @PostConstruct called?
assertNotNull(course.getCourseName());
assertTrue(course.getCapacity() > 0);
// Was a Faculty instance injected into Course?
final Faculty faculty = course.getFaculty();
assertTrue(faculty != null);
// Was the @PostConstruct called on Faculty?
assertEquals(faculty.getFacultyName(), "Computer Science");
assertEquals(faculty.getFacultyMembers().size(), 2);
}
}
Running
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.superbiz.cdi.basic.CourseTest
Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06
http://tomee.apache.org/
INFO - openejb.home = /Users/dblevins/examples/cdi-basic
INFO - openejb.base = /Users/dblevins/examples/cdi-basic
INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Found EjbModule in classpath: /Users/dblevins/examples/cdi-basic/target/classes
INFO - Beginning load: /Users/dblevins/examples/cdi-basic/target/classes
INFO - Configuring enterprise application: /Users/dblevins/examples/cdi-basic
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean cdi-basic.Comp: Container(type=MANAGED, id=Default Managed Container)
INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
INFO - Auto-creating a container for bean Course: Container(type=STATELESS, id=Default Stateless Container)
INFO - Enterprise application "/Users/dblevins/examples/cdi-basic" loaded.
INFO - Assembling app: /Users/dblevins/examples/cdi-basic
INFO - Jndi(name="java:global/cdi-basic/cdi-basic.Comp!org.apache.openejb.BeanContext$Comp")
INFO - Jndi(name="java:global/cdi-basic/cdi-basic.Comp")
INFO - Jndi(name="java:global/cdi-basic/Course!org.superbiz.cdi.basic.Course")
INFO - Jndi(name="java:global/cdi-basic/Course")
INFO - Jndi(name="java:global/EjbModule1833350875/org.superbiz.cdi.basic.CourseTest!org.superbiz.cdi.basic.CourseTest")
INFO - Jndi(name="java:global/EjbModule1833350875/org.superbiz.cdi.basic.CourseTest")
INFO - Created Ejb(deployment-id=Course, ejb-name=Course, container=Default Stateless Container)
INFO - Created Ejb(deployment-id=cdi-basic.Comp, ejb-name=cdi-basic.Comp, container=Default Managed Container)
INFO - Created Ejb(deployment-id=org.superbiz.cdi.basic.CourseTest, ejb-name=org.superbiz.cdi.basic.CourseTest, container=Default Managed Container)
INFO - Started Ejb(deployment-id=Course, ejb-name=Course, container=Default Stateless Container)
INFO - Started Ejb(deployment-id=cdi-basic.Comp, ejb-name=cdi-basic.Comp, container=Default Managed Container)
INFO - Started Ejb(deployment-id=org.superbiz.cdi.basic.CourseTest, ejb-name=org.superbiz.cdi.basic.CourseTest, container=Default Managed Container)
INFO - Deployed Application(path=/Users/dblevins/examples/cdi-basic)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.126 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0