获取CDI受管bean实例的规范方法:BeanManager#getReference()与Context#get()

BalusC

我发现有两种一般的方法可以通过BeanManager仅以aBean<T>开头(基于来创建Class<T>来获取自动创建的CDI托管bean实例

  1. 通过BeanManager#getReference(),通常在摘要中显示:

    Bean<TestBean> bean = (Bean<TestBean>) beanManager.resolve(beanManager.getBeans(TestBean.class));
    TestBean testBean1 = (TestBean) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
    
  2. 通过Context#get(),在代码段中较少显示:

    Bean<TestBean> bean = (Bean<TestBean>) beanManager.resolve(beanManager.getBeans(TestBean.class));
    TestBean testBean2 = beanManager.getContext(bean.getScope()).get(bean, beanManager.createCreationalContext(bean));
    

实际上,它们的作用完全相同:返回对当前CDI管理的bean实例的代理引用,并在范围内尚不存在时自动创建bean实例。

但是它们的做法有所不同:BeanManager#getReference()总是创建一个全新的代理实例,而Context#get()如果以前已经创建过,则重用现有的代理实例。当在现有TestBean实例的操作方法中执行以上代码时,这是显而易见的

System.out.println(testBean1 == testBean2); // false
System.out.println(testBean1 == this); // false
System.out.println(testBean2 == this); // true

的javadocContext#get()是非常明确的在此:

返回某个特定上下文类型的现有实例,或者通过调用Contextual.create(CreationalContext)创建一个新实例并返回该新实例。

javadoc中BeanManager#getReference()不在此明确就够了:

获取特定bean和特定bean类型的上下文引用。

这让我感到困惑。您何时使用一个或另一个?对于这两种方式,无论如何您都需要一个Bean<T>实例,从中可以很容易地获得bean类和bean作用域,这是附加参数。我无法想象为什么在这种特定情况下需要从外部提供它们。

我可以想象这Context#get()会提高内存效率,因为它不必不必要地创建另一个引用同一基础bean实例的代理实例,而只是查找并重用现有的代理实例。

这使我提出以下问题:什么时候BeanManager#getReference()比有用Context#get()它通常在摘要中显示,并且经常被建议作为解决方案,但是即使已存在一个新代理,它也不必要地创建了一个新代理。

阿西夫·布托(Asif Bhutto)

beanManager#getReference为您提供了客户端代理的新实例,但是客户端代理会将方法调用转发到特定上下文的当前上下文实例。一旦获得代理并将其保留,该方法调用将在当前实例(例如当前请求)上调用。如果上下文实例不可序列化,这也很有用-客户端代理将是并且将在反序列化之后重新连接。

BeanManager#getContext在没有客户端代理的情况下获取目标实例。您可能仍会在类名称中看到Weld的代理,但这是提供拦截和修饰的增强子类。如果未拦截或修饰该bean,则它将是给定bean的普通实例。

通常(1)更合适,除非您有一个特殊的用例,在这种情况下您需要直接访问目标实例(例如,访问其实例的字段)。

或者换句话说

1)BeanManager#getReference将返回一个“上下文引用”,以及该bean的常规作用域代理。如果一个豆有@SessionScopedas

@SessionScoped User user;

然后,上下文引用用户将为每个调用“指向”当前会话的相应用户实例(“上下文实例”)user.getName()来自两个不同的Web浏览器的两个不同的调用将为您提供不同的答案。

2)Context#get()将返回内部的``上下文实例'',而没有普通的作用域代理,这通常是用户不应自称的。如果您User user以这种方式获得for“ Bob”并将其存储在@ApplicationScopedBean或静态变量中,则它将始终保持用户“ Bob”的身份-即使来自其他浏览器的Web请求也是如此!您将获得一个直接的,非代理的实例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

被CDI.current()。选择()。get()和BeanManager.getReference()功能上等同?

来自分类Dev

无法找到CDI BeanManager

来自分类Dev

BeanManager 方法 getReference() 在应用程序初始化期间不可用

来自分类Dev

获取持久性上下文中的受管实体实例的列表

来自分类Dev

获取Java CDI bean的上下文引用的正确方法

来自分类Dev

如何将事务获取到@PostConstruct CDI bean方法

来自分类Dev

beanManager.getReference()是线程安全的吗?

来自分类Dev

MyBatis CDI beanManager.getBeans无法在GlassFish 4和4.1中找到SqlSessionFactory bean

来自分类Dev

无法将sessionScoped受管Bean注入其他受管Bean中

来自分类Dev

从CDI bean获取属性文件

来自分类Dev

CDI:手动获取用泛型声明的类的 bean 实例

来自分类Dev

@SessionScoped CDI bean在注入时是不同的实例

来自分类Dev

CDI SessionScoped Bean的非延迟实例化

来自分类Dev

数组的xpages受管bean属性返回引用而不是值

来自分类Dev

仅获取服务中的CDI管理的bean

来自分类Dev

@Schedule无法从@SessionScoped CDI bean获取数据

来自分类Dev

Java EE CDI - 每次调用方法时获取类的新实例

来自分类Dev

我们可以在JSF受管bean本身中基于org.primefaces.model.UploadedFile获取图像的高度和宽度吗?

来自分类Dev

获取spring bean的新实例

来自分类Dev

读取CDI bean中的context-param返回null

来自分类Dev

XPages受管Bean设置程序未在复选框更改时触发

来自分类Dev

在Spring受管bean的构造函数中初始化泽西客户端

来自分类Dev

在受管Bean之间传递参数后,Primefaces DataTable无法更新

来自分类Dev

从JSF受管bean检索JAAS登录模块中的对象添加

来自分类Dev

应用范围内的受管Bean中的ADF / JSF配置数据

来自分类Dev

在CDI bean的非请求环境中获取JSF ServletContext

来自分类Dev

在CDI bean的非请求环境中获取JSF ServletContext

来自分类Dev

阶段受管节点

来自分类Dev

从注入的实例CDI获取确切的对象

Related 相关文章

  1. 1

    被CDI.current()。选择()。get()和BeanManager.getReference()功能上等同?

  2. 2

    无法找到CDI BeanManager

  3. 3

    BeanManager 方法 getReference() 在应用程序初始化期间不可用

  4. 4

    获取持久性上下文中的受管实体实例的列表

  5. 5

    获取Java CDI bean的上下文引用的正确方法

  6. 6

    如何将事务获取到@PostConstruct CDI bean方法

  7. 7

    beanManager.getReference()是线程安全的吗?

  8. 8

    MyBatis CDI beanManager.getBeans无法在GlassFish 4和4.1中找到SqlSessionFactory bean

  9. 9

    无法将sessionScoped受管Bean注入其他受管Bean中

  10. 10

    从CDI bean获取属性文件

  11. 11

    CDI:手动获取用泛型声明的类的 bean 实例

  12. 12

    @SessionScoped CDI bean在注入时是不同的实例

  13. 13

    CDI SessionScoped Bean的非延迟实例化

  14. 14

    数组的xpages受管bean属性返回引用而不是值

  15. 15

    仅获取服务中的CDI管理的bean

  16. 16

    @Schedule无法从@SessionScoped CDI bean获取数据

  17. 17

    Java EE CDI - 每次调用方法时获取类的新实例

  18. 18

    我们可以在JSF受管bean本身中基于org.primefaces.model.UploadedFile获取图像的高度和宽度吗?

  19. 19

    获取spring bean的新实例

  20. 20

    读取CDI bean中的context-param返回null

  21. 21

    XPages受管Bean设置程序未在复选框更改时触发

  22. 22

    在Spring受管bean的构造函数中初始化泽西客户端

  23. 23

    在受管Bean之间传递参数后,Primefaces DataTable无法更新

  24. 24

    从JSF受管bean检索JAAS登录模块中的对象添加

  25. 25

    应用范围内的受管Bean中的ADF / JSF配置数据

  26. 26

    在CDI bean的非请求环境中获取JSF ServletContext

  27. 27

    在CDI bean的非请求环境中获取JSF ServletContext

  28. 28

    阶段受管节点

  29. 29

    从注入的实例CDI获取确切的对象

热门标签

归档