Bạn cũng có thể truy cập BeanManager bằng cách sử dụng CDI.current(), giúp bạn nhập một vài dòng mã tốt. Ví dụ lấy từ here
Sử dụng CDI.current()
BeanManager bm = CDI.current().getBeanManager();
Sử dụng JNDI:
BeanManager bm = null;
try {
InitialContext context = new InitialContext();
bm = (BeanManager) context.lookup("java:comp/BeanManager");
} catch (Exception e) {
e.printStackTrace();
}
Bây giờ bạn có BeanManager bạn có thể truy cập đậu CDI của bạn bằng cách thực hiện một trong hai một tra cứu loại dựa trên hoặc tra cứu dựa trên tên.
Loại dựa trên:
Bean<CrudService> bean = (Bean<CrudService>) bm.getBeans(CrudService.class).iterator().next();
CreationalContext<CrudService> ctx = bm.createCreationalContext(bean);
CrudService crudService = (CrudService) bm.getReference(bean, CrudService.class, ctx);
Tên dựa trên
Bean bean = bm.getBeans("crudService").iterator().next();
CreationalContext ctx = bm.createCreationalContext(bean);
CrudService crudService = bm.getReference(bean, bean.getClass(), ctx);
Full dụ:
//get reference to BeanManager
BeanManager bm = CDI.current().getBeanManager();
Bean<CrudService> bean = (Bean<CrudService>) bm.getBeans(CrudService.class).iterator().next();
CreationalContext<CrudService> ctx = bm.createCreationalContext(bean);
//get reference to your CDI managed bean
CrudService crudService = (CrudService) bm.getReference(bean, CrudService.class, ctx);
CẬP NHẬT - Điều này bây giờ có thể đạt được trong một dòng nếu bạn đang sử dụng CDI 1.1 :
CrudService crudService = CDI.current().select(CrudService.class).get();
Nguồn
2015-03-10 18:13:57
Tôi tìm thấy một ví dụ mã tốt tại http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/ – Sebi
Một tên @ManagedBean (value = "MyManagedBean") POJO có thể được tra cứu thông qua JNDI với nghĩa là InitialContext.doLookup ("java: app/myapp/MyManagedBean"); xem tài liệu API của javax.annotation.ManagedBean –
Tôi đã tò mò về những gì 'javax.annotation.ManagedBean' chính xác là, đây là một câu trả lời tốt: http://stackoverflow.com/a/32420123/1341535 –