- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为我的团队创建一个 Java SDK,让他们能够创建一个简单的 Java 类(某种插件),将其注册到某个地方,并让 Java 在运行时选择要使用哪个 Java 类插件.
让我们举一个简单的例子:我有 3 个 Java 类。每个内部都有一个函数,它接受一个字符串并分别打印出“Short Greeting”+ inputStr、“Long Greeting”+ inputStr 和“Blah”+ inputStr)。假设它们都实现了一个接口(interface)。
我想要一个设计,这些类将在某个地方注册,明天其他人可以编写第四个类,它会打印出其他内容(也实现相同的接口(interface))。选择哪个类的决定应该基于用户的输入?
即。我可以说 java -jar my.jar -inputString "John"-pluginName="long"
并且 jar 将实例化正确的类并实现正确的逻辑。
我知道我可以有一个简单的 switch case 语句或 if else if 和 else 逻辑,但这是一个微不足道的案例,实际上我希望我的代码模块化,以便将来添加的插件彼此完全独立。
我被告知要研究 IOC 和依赖注入(inject),但我在网上没有找到任何好的教程。任何帮助将不胜感激,提前致谢
<小时/>是的,也许一个简单的例子不合适。我正在设计一个SDK,用于确定要调用哪个数据存储。我有其他开发人员设计适配器来调用 a(n):
CouchBase(CouchBaseReterival.java)
REST 服务(ServiceRetreival.java)
HBASE 实例(HBASERetreival.java)
所有这些适配器都实现一个接口(interface) (InformationRetreival.java),该接口(interface)具有 getInformation() 方法。
此 SDK 将由微服务中的 REST 调用本身调用。因此,客户端调用将包含参数 x、y、z 和 couchBase 的“cb”。微服务将调用 informationRetrieval.getInformation(x,y,z,"cb")。代码应该注入(inject)正确的适配器并执行逻辑以返回正确的响应。
Switch-Case/if-else 逻辑并没有那么复杂(也许我不应该使用这个词),因为当有多个适配器被独立开发和测试时,它不是一个好的设计模式。 (一个要求是代码的松耦合)我不想每次添加新适配器时都修改代码的逻辑。反射是一种选择,但同样需要更改代码。我正在寻找更多关于利用 Spring 或 PicoContainer 的依赖注入(inject)建议/教程的建议。
最佳答案
在您的具体示例中,对于初学者来说,您会更倾向于“开放/封闭原则”:
interface Greeter {
public String getGreetingFor(String name);
}
abstract class BaseGreeter implements Greeter {
public final String getGreetingFor(String name) {
return getPrefix() + " : " + name;
}
protected abstract String getPrefix();
}
class ShortGreeter extends BaseGreeter {
@Override
public String getPrefix() { return "Short greeting"; }
这里的想法是:您不希望每个Greeter实现都有自己的实现。相反,您放入另一个可以更改的抽象(您可以添加其他问候语),但对修改关闭(问候函数本身不能再被子类覆盖)。
[显然:如果您的接口(interface)的所有实现都确实不同,那么此模式不起作用 - 但至少在您的示例中并非如此]
对于第二部分 - 默认方法是使用 reflection :因为这允许您在运行时仅在字符串上实例化任意类;像:
String pluginClassNameFromUser = "whatever.package.SomeClass";
Class<Greeter> someClassInstance = (Greeter) Class.forName(pluginClassNameFromUser);
但是:听起来 ifs/switches 对你来说已经感觉“复杂”了;所以这对我来说意味着,反射(reflection)远远超出了你目前的技能。
所以,更简单的选择实际上是这样的:
public Greeter fetchGreeterFromUserInput(String userInput) {
switch userInput.trim().toLowerCase(): {
case "short": return new ShortGreeter();
case "long" : ...
我希望这能给您一些如何处理您的项目的灵感。
最后:如果您正在寻找一个广泛的(尽管是高级的示例)来进行“真正的”设计,请查看 Robert Martin 所著的“敏捷实践”(您可以在互联网;即使您不懂 C#,这也是一个很好的起点)。
关于java - 如何使用控制反转在java中创建即插即用代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39198414/
我正在尝试将我在本文档中阅读的内容付诸实践: https://sar.informatik.hu-berlin.de/research/publications/SAR-PR-2006-05/SAR-
我一直在尝试编写一个可以改变这个的 terraform 表达式: subnets = { my_subnet_1 = { nsg = "my_nsg_1", ad
我有一个HashMap,它将两个字符串转换为单词,然后将单词添加到 map 中。我拥有它,以便一个键可以指向多个值。现在我想创建一个循环来反转表,以便所有值都指向键。不要为一个指向多个逆值的键而烦恼。
我对 ~ 运算符有点困惑。代码如下: a = 1 ~a #-2 b = 15 ~b #-16 ~ 是如何工作的? 我想,~a 会是这样的: 0001 = a 1110 = ~a 为什么不呢? 最佳
如果执行 ResourceManager.GetString(Key),您可以获取资源中某个项目的值。有没有一种方法可以进行反向查找以从给定值的资源中获取 key (本质上是反翻译)? 最佳答案 您应
我在 R 中编写了一个代码来反转一个数字。但是我得到了 inf作为输出。 digit0){ rev_num=rev_num*10 + digit %% 10 digit=digit / 10 }
这个问题已经有答案了: Invert keys and values of the original dictionary (3 个回答) 已关闭 9 年前。 我正在寻找在 python 上转置一本字
所以我试图反转我当前制作的形状的输出。我想知道我应该扭转这种情况吗?我尝试更改变量“a”和“c”的值,最终陷入无限循环。 class IRT { public static void main
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: PHP mysql_real_escape_string() -> stripslashes() leavi
从 Wordpress 模板中提取一些预先存在的代码来绘制椭圆阴影。阴影呈椭圆形向下辐射。只有椭圆的下半部分可见,从而形成底部阴影效果。 我只是想“反转”椭圆的“阴影效果”,以便只有阴影的顶部 一半可
我有一个函数应该找到两个弧度的中间 function mrad(rb,ra){return (rb+ra)/2;} 但有时,当我用 Math.sin 和 Math.cos 绘制 x 和 y 时,这两个
给定此代码(http://jsfiddle.net/bzf1mkx5/) .intern { -webkit-animation: in 1s 1 reverse forwards; } .i
我对 ~ 运算符有点困惑。代码如下: a = 1 ~a #-2 b = 15 ~b #-16 ~ 是如何工作的? 我想,~a 会是这样的: 0001 = a 1110 = ~a 为什么不呢? 最佳
我需要以相反的顺序从列表中提取项目(从最后一个条目到第一个)。我设法得到了所有元素,但是,从第一个到最后一个。这是我正在使用的部分代码: 该列表位于不同的网站集上。 using (SPSit
由于一些证书问题,我不得不写 ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chai
是否有一个函数接受一个函数列表和一个输入,并输出一个对输入进行操作的函数列表? 所以像 map,但倒退: >>>map(lambda x: 2*x,[1,2,3,4,5,6,7,8,9]) [2, 4
考虑下表团队消息: 15:10 | Peter | I'm off to the store, call my mobile phone if you need me. 15:11 | Susy |
算法如下: int encryption(int a, int b) { short int c, c2; uint8_t d; c = a ^ b; c2 = c;
我正在寻找一种方法来逆转 a CRC32 checksum .周围有解决方案,但它们要么是 badly written , extremely technical和/或 in Assembly .汇编
使用批处理文件,处理所有在文件名或扩展名中共享字符串的文件就足够简单了,例如: FOR /R %F IN (*.EXE) DO @ECHO %F 但是,如果我想反转文件集的含义怎么办?比如,处理所有不
我是一名优秀的程序员,十分优秀!