【问题标题】:How do I know at runtime which implementing classes are set for my Spring beans?如何在运行时知道为我的 Spring bean 设置了哪些实现类?
【发布时间】:2014-02-01 03:40:29
【问题描述】:

在 hybris 中,有没有一种简单的方法可以知道某个 Spring bean 正在使用哪个实现类?

我的意思是,我可以通过执行以下操作来覆盖 Bean:

<alias name="myCheckoutFacade" alias="checkoutFacade"/>
<bean id="myCheckoutFacade" class="com.pedra.facades.checkout.impl.MyCheckoutFacadeImpl" scope="tenant" parent="defaultCheckoutFacade">
    <property name="commerceCheckoutService" ref="myCommerceCheckoutService"/>
</bean>

...所以现在当 Spring 需要创建一个别名为 checkoutFacade 的 bean 时,实现类将是 MyCheckoutFacadeImpl,而不是在其他一些 xml 配置文件中定义的覆盖 defaultCheckoutFacade

那么有没有办法在运行时知道哪个实现类被用于某个 Spring bean 定义?我的意思是不必调试代码。

【问题讨论】:

  • 调高日志级别。
  • org.springframework 退后一步?
  • 您可以使用 Beanshell 做的另一件有趣的事情是在运行时有选择地更改日志级别。 (在生产时要小心——首先在开发机器上尝试这个,因为它会创建一个非常大的日志!)org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.DEBUG); 最好在特定记录器上设置级别而不是只设置根,但这只是一个简单的示例。

标签: hybris spring-bean


【解决方案1】:

Beanshell 或 Groovy :-)

检查 bean 的实现类只是您在运行时使用 Beanshell 或 Groovy 可以做的许多很酷的事情之一。

免责声明:小心在生产机器上运行 Beanshell 或 Groovy 代码!

  • 登录到 HAC 并转到 Console > Beanshell 或 Groovy

  • 在 Beanshell 或 Groovy 中执行以下代码以获取您的实现类:

    de.hybris.platform.core.Registry.getApplicationContext().getBean("checkoutFacade");

两个控制台都会在结果选项卡中显示最后一个表达式的结果。

Hybris 5.x 的 Groovy 控制台中,简单地执行以下命令:

checkoutFacade

如您所见,每个 bean 都会自动def-ed 到每个 Groovy 脚本中。

对于 Beanshell,您可以在 Beanshell 中创建一个bean 函数:

import de.hybris.platform.core.Registry;
import de.hybris.platform.commercefacades.order.CheckoutFacade;

Object bean(String beanName) 
{
    return Registry.getApplicationContext().getBean(beanName);
}

CheckoutFacade checkoutFacade = (CheckoutFacade) bean("checkoutFacade");
print(checkoutFacade);

我最终使用 Beanshell 如此之多,以至于我创建了自己的包装应用程序,它允许我在 Eclipse 中开发 Beanshell,并将 Eclipse 用作 Beanshell 控制台。但这完全是另一篇文章!

资源:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 2015-09-09
    • 2015-02-10
    • 2016-11-14
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多