拦截使用@Produces 方法创建的 CDI bean
Intercepting CDI beans created with @Produces method
在我们的 JEE 应用程序中,我们创建了一个新注释 @MyAnnotation,我们在 CDI bean (@ApplicationScoped) 上设置它。
然后我们有一个拦截器拦截所有带有@MyAnnotation注解的bean。
问题是它不适用于由 @Produces 方法创建的 bean。
这意味着拦截器没有被调用。
所以如果我们有这个 class:
@ApplicationScoped
public class OtherClass
{
@Inject
private MyBean myBean;
public void f()
{
myBean.g();
}
}
那么以下将起作用:
@ApplicationScoped
@MyAnnotation
public class MyBean
{
public void g() {}
}
但以下不会:
@ApplicationScoped
public class MyBeanProducer
{
@Produces
public MyBean create()
{
return new MyBean();
}
}
有没有办法让拦截器拦截使用@Produces 创建的 CDI bean?
解决方案是使用InterceptionFactory(来自CDI 2.0)来代理@Poduces方法产生的bean,意思是:
@ApplicationScoped
public class MyBeanProducer
{
@Produces
public MyBean create(InterceptionFactory<MyBean> interceptionFactory)
{
return interceptionFactory.createInterceptedInstance(new MyBean());
}
}
@MyAnnotation 应该在 MyBean.
上
MyBean 必须具有可代理的无参数构造函数,因为 interceptionFactory.createInterceptedInstance() 正是这样做的 - 代理 MyBean 实例.
我找到了解决方案 here
在我们的 JEE 应用程序中,我们创建了一个新注释 @MyAnnotation,我们在 CDI bean (@ApplicationScoped) 上设置它。
然后我们有一个拦截器拦截所有带有@MyAnnotation注解的bean。
问题是它不适用于由 @Produces 方法创建的 bean。
这意味着拦截器没有被调用。
所以如果我们有这个 class:
@ApplicationScoped
public class OtherClass
{
@Inject
private MyBean myBean;
public void f()
{
myBean.g();
}
}
那么以下将起作用:
@ApplicationScoped
@MyAnnotation
public class MyBean
{
public void g() {}
}
但以下不会:
@ApplicationScoped
public class MyBeanProducer
{
@Produces
public MyBean create()
{
return new MyBean();
}
}
有没有办法让拦截器拦截使用@Produces 创建的 CDI bean?
解决方案是使用InterceptionFactory(来自CDI 2.0)来代理@Poduces方法产生的bean,意思是:
@ApplicationScoped
public class MyBeanProducer
{
@Produces
public MyBean create(InterceptionFactory<MyBean> interceptionFactory)
{
return interceptionFactory.createInterceptedInstance(new MyBean());
}
}
@MyAnnotation 应该在 MyBean.
上
MyBean 必须具有可代理的无参数构造函数,因为 interceptionFactory.createInterceptedInstance() 正是这样做的 - 代理 MyBean 实例.
我找到了解决方案 here