【问题标题】:Supply Spring managed objects to non Spring managed Objects?将 Spring 托管对象提供给非 Spring 托管对象?
【发布时间】:2010-01-18 13:14:31
【问题描述】:

我有一个数据结构,代表一个包含数千个配置设置的 CSV 文件。该结构是一个带有实例变量的 Java 类文件,用于表示文件中的记录(即:HashMap)和文件的状态(错误、警告等)。

这些类不是由 Spring 创建的,因为它们有状态。我希望该类访问当前由 Spring 管理的数据库 DAO 类处理的系统配置属性。通常当类需要这个 DAO 时,我使用 @Autowired 通过 Spring 注入它。但是由于我的数据结构不是Spring管理的,CSV结构类怎么访问DAO呢?

我能想到的唯一方法是从 Spring 托管 bean 创建数据结构以传入 DAO:

CSVDataStruture c = new CSVDataStruture(dao);

【问题讨论】:

  • 可以通过spring context的getBean方法直接引用托管bean

标签: java spring dependency-injection


【解决方案1】:

请参阅6.8.1. Using AspectJ to dependency inject domain objects with Spring 关于使用@Configurable

另一种方法是获取应用程序上下文(在 Web 应用程序中这是 WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext))并使用 context.getBean("name") 获取 bean,但这更像是一种解决方法。

【讨论】:

  • @Configurable 是要走的路
【解决方案2】:

这些类不是由 Spring 创建的,因为它们有状态。

是什么让你认为 Spring 不能/不应该创建有状态的对象?

根据您要执行的操作(很难弄清楚!)我会执行以下操作之一:

  • 为 CVS 文件参数和 DAO 参数提供 CSV 类 getter 和 setter,并使用 Spring DI 实例化它。这假设在 Spring 连接发生时文件名可用。

  • 使用从文件参数实例化 CSV 对象的方法创建工厂类。工厂类应该有一个用于 DAO 对象的 getter/setter,并使用 Spring DI 进行实例化。

【讨论】:

  • 谢谢 - 我会尝试选项 2。我们正在做的是加载一个文件,验证内容,然后加载第二个文件并比较这两个文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2023-04-09
  • 2017-08-16
  • 2021-07-15
相关资源
最近更新 更多