将Spring托管对象提供给非Spring托管对象?

时间:2010-01-18 13:14:31

标签: java spring dependency-injection

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

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

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

CSVDataStruture c = new CSVDataStruture(dao);

2 个答案:

答案 0 :(得分:3)

有关使用@Configurable

的信息,请参阅6.8.1. Using AspectJ to dependency inject domain objects with Spring

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

答案 1 :(得分:1)

  

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

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

取决于你想要做什么(很难弄明白这一点!)我会做以下其中一项:

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

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