- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请原谅我的无知。我对 Java 很陌生。我研究过Spring DI。我们提供的任何基于 xml 或注释的配置都将用于以声明方式注入(inject)依赖项。但是,我认为我们不能动态更改依赖项。
因此,我创建了以下示例代码,它可以通过扩展类路径来提供依赖项(扩展类路径的代码未显示)。我们可以称之为 DI 吗?
标记界面
public interface IRule {
}
扩展 IRule 的接口(interface)
public interface IFooRule extends IRule {
public boolean validate(String json);
}
实现 IFooRule 的类
public class FooRuleImplemetor {
private FooRuleImplemetor implementor;
private FooRuleImplemetor() {
}
public boolean validateRule(String json) {
--Business Logic--
}
public static synchronized FooRuleImplemetor getInstance() {
if (implementor == null) {
implementor = new FooRuleImplemetor();
}
return implementor;
}
}
规则工厂。几乎任何 IS-A IRule 类的工厂类
public class RulesFactory {
public <T extends IRule> T getRuleImplementation(String clazz) {
try {
Class<?> ruleObject = Class.forName(clazz);
Method factoryMethod = ruleObject.getMethod("getInstance");
return (T) factoryMethod.invoke(null);
} catch (ClassNotFoundException e) {
logger.error("ClassNotFoundException", e);
} catch (IllegalAccessException e) {
logger.error("IllegalAccessException", e);
} catch (SecurityException e) {
logger.error("SecurityException", e);
} catch (NoSuchMethodException e) {
logger.error("NoSuchMethodException", e);
} catch (IllegalArgumentException e) {
logger.error("IllegalArgumentException", e);
} catch (InvocationTargetException e) {
logger.error("InvocationTargetException", e);
}
return null;
}
}
XML配置(仅部分)
<rule>
<action class="com.mycompany.FooRuleImplemetor">
<rule>
不属于类路径的xml将被动态读取。客户端将被移交 FooRuleImplemetor 的实例,如下所示(类从 xml 中读取)。
RulesFactory rulesFactory = new RulesFactory();
IFooRule fooRule = rulesFactory.getRuleImplementation(clazz);
这种模式叫什么名字?我们可以称之为依赖注入(inject)吗?
更新
我还想知道这种模式的潜在缺点(如果有的话)。是否有我可以使用的经过充分测试的替代模式?
最佳答案
你描述的更像是一个服务定位器,你用它来解决依赖关系。但依赖项本身并未注入(inject)——没有控制反转,您通过 rulesFactory.getRuleImplementation(clazz)
调用控制依赖项解析。
来自 Martin Fowler 的 Inversion of Control Containers and the Dependency Injection pattern (我建议您阅读):
The fundamental choice is between Service Locator and Dependency Injection. The first point is that both implementations provide the fundamental decoupling that's missing in the naive example - in both cases application code is independent of the concrete implementation of the service interface. The important difference between the two patterns is about how that implementation is provided to the application class. With service locator the application class asks for it explicitly by a message to the locator. With injection there is no explicit request, the service appears in the application class - hence the inversion of control.
The disadvantages are arguable因为与大多数模式一样,它取决于您的要求。因此,我称它们为权衡取舍。
在这种情况下,它们是主要优势(解耦)的结果。在进行模块化设计时,请记住要最大限度地减少耦合,同时也要最大限度地提高内聚性。因此,请确保您没有创建粒度太细的模块。
列举一些权衡:
我的建议是,仅当您拥有具有多个实现的稳定接口(interface)时才使用它,或者至少您确定很快就会有另一个实现。只是不要去做,以防万一有一天您的界面可能会有另一种实现。如果这样做,您很可能会发现自己以牺牲编译时检查或 IDE 辅助之类的东西为代价进行了过度设计。
这是服务定位器和依赖注入(inject)模式的主要共同点。
关于java - 我们可以将以下模式称为 DI 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27254405/
有谁知道如何实现称为 PRUNING 的图像处理技术?任何想法,例子等?我正在使用 OpenCV 和 C#,如果有人可以提供帮助,我将不胜感激。 最佳答案 我假设您希望从图像中移除不需要的杂散和伪影。
假设我已经构建了一个可调用对象数组 callables = [] callables << block1 callables << block2 callables << block3 callabl
这个问题在这里已经有了答案: std::shared_ptr of this (2 个答案) 关闭 8 年前。 我正在学习 C++11 特性,特别是 shared_ptr,我在引用 this 并将其
我主要是一个oracle新手,所以如果这是一个愚蠢的问题,请原谅我...... 我已经阅读了很多关于 authID 的文章,我的理解是 AUTHID 子句指示 Oracle 是否以调用者的权限 (CU
我使用的是 Python 2.7。 按照惯例,__iter__、__init__、__str__ 等内置方法使用双下划线来标识它们。为什么 next() 函数没有这个? 它与这里的其他内置函数一起
这是疏忽吗?还是跟JVM有关? 最佳答案 Java 确实有指针——不能在指针上执行指针运算。 来自可敬的JLS : There are two kinds of types in the Java p
我越来越多地发现宣传“原生”桌面应用程序的服务,但在下载或研究后发现它们是在 Electron 或类似的 Web View 框架中构建的 Web View 。他们误解了“本地人”还是我? 另外,我可以
我尝试在 Wordpress 中使用,但它在控制台中显示 jstree 不是函数在 header PHP 文件中: /dist/libs/jquery.js"> /dist/themes/defaul
我想让 scons 调用带有目录列表的 nosetests。执行此操作的最佳方法是什么? 最佳答案 如果您需要分析外部应用程序的返回码(例如,如果您调用测试),您需要使用 Command() + py
这是一些尝试使用 OOB(紧急)数据的基本代码。我的问题是,如果客户端使用 C 或 Java,则服务器部分的行为不同。请注意,您可能认为这两个客户端都有些棘手,但如果我使用 C 服务器(以更好地控制
虚拟文件系统 (VFS) 或虚拟文件系统交换机是更具体文件系统之上的抽象层。 VFS的目的是允许客户端应用程序以统一的方式访问不同类型的具体文件系统。 如果我们看到 VFS 的实际工作,这个定义似乎是
"Effective Go"状态: By convention, one-method interfaces are named by the method name plus an -er suff
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 3 个月前。 社区审核了是否
在深入研究 Scala 时,我遇到了 这个词。类型类 . 它一直令人困惑,因为一个类是一个类型,而一个类型可以 在 Scala 中是一个类,“类型”和“类”本身就是抽象术语。 在阅读了一些示例后,我感
我正在尝试编写一个简单地杀死我的程序的函数。它被称为退出聊天。但是,当我调用函数 messenger:quitChat() 时,出现此错误。 ** exception error: bad argum
我正在尝试编写一个简单地杀死我的程序的函数。它被称为退出聊天。但是,当我调用函数 messenger:quitChat() 时,出现此错误。 ** exception error: bad argum
如果您向 DB2/zOS 引擎 DBA 询问有关 DB2 行为的问题,DBA 会将 DB2 引擎称为“他”,就像水手使用“她”来指代他的船一样。 例如:“一旦您填充了可用空间,DB2 仍希望在表空间中
案例:我有 2 个具有以下 OneToMany 关系的表:TagAbstract 1..* TagConf,其中: tag_abstract_ID 是一个字段,用于标识许多 TagConf 记录,这些
我有一个表格,我想让第一行“自动固定”(这意味着当向下滚动时它固定在顶部,而如果不向下滚动,它就不固定)。这是代码:``` table { background: yellow; } td
其他动词对我来说都有意义,但我对“发布”作为动词没有太多上下文。它是像在邮局发帖(这有一定道理,虽然看起来有点牵强)还是像在公告板上发帖(对我来说意义不大)?有谁知道是谁决定了“POST”以及为什么选
我是一名优秀的程序员,十分优秀!