如何解决Injeactable的调用者类?

时间:2017-02-04 06:00:12

标签: java java-ee dependency-injection cdi

假设我是一个注入aclass B的A类。在B类中,我需要隐式地获取注入了B类的类。所以在这种情况下,这将是A类。

有谁知道如何以健壮的方式接收这个?

也试过这个,但这给了我Logger而不是它的来电者。

Something like

@Stateless
@Dependent
public class Logger {

@Inject
InjectionPoint ip;

@Asynchronous
public void doSomething(){
   ip.getMember().getDeclaringClass().getName()
 }
}

2 个答案:

答案 0 :(得分:2)

如果我们谈论的是@Dependent范围内的bean,则会有a way documented in the CDI spec

一般的想法是,CDI允许您注入一个名为InjectionPoint的对象,从中可以获得有关bean注入此bean的信息。

这是一个简短的片段:

@Dependent //if you don't declare any scope, it's @Dependent by default
public class MyBean {
  @Inject
  InjectionPoint ip;

  public void doStuff() {
    // gives you the name of declaring class
    ip.getMember().getDeclaringClass().getName(); 
  }
}

或者,您可以在bean中使用构造函数注入来在bean创建期间处理此问题。它可能更接近你的目标:

@Dependent //if you don't declare any scope, it's @Dependent by default
public class MyAnotherBean {
  public MyAnotherBean(InjectionPoint ip) {
    // CDI will inject InjectionPoint automatically
    ip.getMember().getDeclaringClass().getName(); 
  }
}

再次注意,此仅适用于@Dependent !为什么?好吧,因为@Dependent每个注入点创建新实例并且不使用代理。因此,您也准确地知道为此创建此实例的人员。其他范围(例如@RequestScoped@SessionScoped等)确实使用代理,因此您只在CDI中实例化一个对象,然后在请求注入时传递代理。

答案 1 :(得分:1)

似乎我找到了解决方案。

制作HelperClass。其中包含@AroundInvoke方法。

@AroundInvoke
public Object injectMap(InvocationContext ic) throws Exception {
    StackTraceElement element = Thread.currentThread().getStackTrace()[CLASS_NAME_ELEMENT];
    return ic.proceed();
}

在A类中,我注释了需要使用注射类B的方法:

@Interceptors(ContextHelper.class)

这似乎适用于我想要的东西。