【发布时间】:2012-07-01 16:13:27
【问题描述】:
我有以下课程:
类验证器 { 私有最终 SchemaFetcher schemaFetcher; @注入 验证器(SchemaFetcher schemaFetcher){...} } 类 DatabaseSchemaFetcher 实现 SchemaFetcher { @Override Schema loadSchema(final SchemaDefinition schemaDef); @Override boolean compareSchemaWithSource(final SchemaDefinition schemaDef, final Schema updatedSchema); }这只是示例之一,我还有一些类似的其他类,我将它们作为依赖项注入到其他类中。但它使我的 SchemaFetcher 类像一个单例,我不断地将 schemaDefinition 传递给它的每个方法。这似乎非常程序化,我实际上想让 SchemaDefinition 成为 DatabaseSchemaFetcher 类的实例变量,但在这种情况下,我将无法将 SchemaFetcher 对象注入到我的 Validator 类中,而我应该这样做
验证(字符串模式名称){ SchemaDefinition schemaDef = buildSchemaDefinitionFrom(schemaName); SchemaFetcher fetcher = new DatabaseSchemaFetcher(schemaDef); }但这让我与 fetcher 紧密耦合,这就是我想首先使用依赖注入的原因。
我可以看到我可能有一个 DatabaseSchemaFetcher 的默认构造函数,然后是一个 setSchemaDefintion() 设置器来实现这一点,但这违反了完全使用构造函数构建对象的原则。
如何改进这一点,使其不具有程序样式获取器,同时将我的依赖项注入构造函数?我更喜欢构造函数注入,因为它清楚地定义了我的依赖项,而无需任何人查看类的实现来找出类在我使用工厂或服务定位器时使用的依赖项。
【问题讨论】:
-
我的建议是放松你对构造函数注入的强烈偏好。一方面,他们不允许循环依赖;另一方面,它们不允许注入延迟初始化的对象(可通过查找方法实现)。
标签: java design-patterns refactoring ooad