【问题标题】:How to improve slowness due to many @Inject in ManagedBean如何改善由于 ManagedBean 中的许多 @Inject 而导致的缓慢
【发布时间】:2019-10-26 12:03:50
【问题描述】:

我目前正在制作一个基于旧系统的系统。旧系统基本上将模块分成单独的类和 bean。然而,对于新系统,许多模块被压缩到一个 bean 中,它会注入如此多的类和其他 bean,这使得它非常慢,因为它需要初始化所有注入的 bean 和类。

有什么方法可以改进吗?有没有类似条件注入的东西,我们只在需要时才调用该类?

目前,我的想法是只在需要时调用类。例如。当用户想要访问用户对象时,只注入用户相关的 bean 和类。不会调用与 Employer 类相关的类和 bean。我不确定这是否可能,如果不可能,是否有办法通过多次注入来提高性能?

【问题讨论】:

  • 对于 OpenWebBeans 注入的 bean 在访问时以惰性方式实例化。不确定 Wildfly CDI 实施是否属于这种情况。
  • 有效地,一个好的设计已经被一个糟糕的设计所取代,现在你想要一个糟糕的设计的解决方法;-)
  • 糟糕的设计意味着将多个类注入到一个 bean 中? @Kukeltje
  • 不,做一个“神”类(许多模块(假设一个模块包含多个类)为一个类)。你实际上做了多少次注射?我无法想象你会注意到注射了十几个甚至几十个豆子。除非您在创建 bean 时做很多工作,例如@Postconstruct 带注释的方法。那么你也许应该在那里实现一些惰性的东西
  • 我要说的是,两个 CDI impls 都在使用惰性方法来解析普通范围的 bean。而且您已经使用 Weld,因为这是 WildFly(以及几乎所有其他 EE 服务器,除了 tomee)使用的 CDI 实现。您需要向我们提供更多关于您实际运行的详细信息以查看问题所在。我想知道您有多少 bean 可以看到仅注入的任何实际性能问题......

标签: jboss wildfly cdi


【解决方案1】:

通过使用实例接口修复它。而不是

@Inject
MyManagedBean myManagedBean

我使用 Instance 仅在它被使用时注入类

@Inject
Instance<MyManagedBean> myManagedBean

所以它的作用是,每次你想调用类时,你通过 .get() 调用它(例如 myManagedBean.get()),这将初始化类。只要不调用 .get(),类就不会被初始化。

【讨论】:

  • 令我印象深刻的是两位专家说加载在默认情况下在两种实现中都是惰性的,但在更改此设置时您只会看到性能提升。这让我这么想,你的代码也有其他问题。而且,正如之前所怀疑的那样,注射不是问题,而是例如。构造(例如,不使用 postconstruct 或做静态事情或......)没有看到具有性能数字的实际代码,很难理解什么真正的问题(慢注入不是真正的问题,因为这很快,否则很多人会遇到问题)得到解决通过这个答案
猜你喜欢
  • 2018-01-18
  • 2017-03-27
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2016-04-16
  • 2013-11-20
相关资源
最近更新 更多