【问题标题】:How to observe the Application Context at runtime (while debugging)如何在运行时观察应用程序上下文(调试时)
【发布时间】:2016-05-22 20:16:49
【问题描述】:

我正在调试我的 Java Spring 服务,我得到一个 @Autowired 变量为 null,而它不应该是。

由于我已将服务的类声明为@Service,我想再次检查我的 bean 是否已被 Spring 扫描并包含在应用程序上下文中。

因此,我希望能够在 Eclipse 中观察 Application Context 的内容。

这怎么可能?

【问题讨论】:

  • 不能是null。如果它是null,那么您是在 Spring 范围之外自己创建 bean 实例。很可能是 spring 有一个实例,但这不是一个不会自动连接的实例,因为它是由您自己创建的。
  • 确实,我的构造函数被调用了。但是能够在运行时观察应用程序上下文这样我就可以调试了..
  • 构造函数被调用的事实并没有说明什么。可以扫描,可以自己做。应用程序上下文中甚至存在一个实例这一事实并没有说明什么,因为一旦您开始执行new YourClass(),该实例就会被忽略。因此,在这方面检查ApplicationContext 也无济于事。

标签: java eclipse spring inversion-of-control


【解决方案1】:

ApplicationContext 注入一个可以调试和调用#getBeanDefinitionNames 的bean 中

【讨论】:

  • 嘿@hahn 谢谢你的回答。还有什么更优雅的吗?也许通过 IDE 的一些解决方案?
  • 是的,您可以创建一个 ApplicationContextAware 提供程序(帮助程序)类并创建获取 bean 的静态方法。因此 applicationContext 将被注入此类,然后您可以通过 ACHelper.getApplicationContext() 通过 out application 访问该类
【解决方案2】:

您可以在启动服务器后使用 log4j.jar 输出所有警告、调试、信息。请点击以下链接http://www.tutorialspoint.com/spring/logging_with_log4j.htm。我在另一台笔记本电脑上有一个工作示例,可以发布代码。需要的话告诉我

【讨论】:

  • 您好,谢谢您的回答。我知道我可以记录,但我宁愿通过我的 IDE 观察应用程序上下文,而不是通过记录。这不可能吗?
【解决方案3】:

我不确定这是否是最好的方法但是没有添加任何额外的框架,如果你只是想检查依赖项是否正确注入,你可以先从字段中删除@Autowired注解。

现在创建一个参数化构造函数并使用@Autowired 注释构造函数。 Spring 将尝试通过构造函数注入所有 bean。

http://www.tutorialspoint.com/spring/spring_autowired_annotation.htm

现在您可以在构造函数中放置断点来检查注入的值。

希望这会有所帮助。

【讨论】:

  • 为了让事情更混乱,构造函数被调用了!而且我的自动装配的 bean 仍然是空的! ://
  • 无论如何你都应该使用构造函数注入;甚至 Spring 的一位原始开发人员也公开表示 @Autowired 字段注入是邪恶的,他对将其包含在框架中感到遗憾。
  • @E-Riz +1 我完全同意,我花了这么多时间教青少年为什么不应该进行现场注射。通过反射访问私有字段对我来说是完全不行的。
  • @E-Riz 构造函数注入是如何工作的?我的意思是,我知道预编译器会扫描注释并知道何时运行自动装配(我的理解是否正确?)。如果我自动装配构造函数,如果我不初始化 bean,预编译器如何知道 bean 的声明位置?
  • Spring 在创建应用程序上下文时调用构造函数。您可以从 xml 文件 ApplicationContext ctx = new ClassPathXmlApplicationContext("app.xml") 创建应用程序上下文,或者 Web 应用程序在部署战争时创建它。现在,如果您手动调用构造函数,您将绕过 spring,因此您必须自己将依赖项传递给构造函数。
猜你喜欢
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2020-07-31
  • 2021-08-11
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2021-06-09
相关资源
最近更新 更多