java - 两个简单类的上下文中的依赖注入
问题描述
我在掌握依赖注入时遇到了问题(或者让我说它的好处)。所以我决定写两段简单的代码,一段没有DI,另一段有DI。
所以我有一个A类
public class A {
public void foo(){
B b = new B();
b.fooB();
}
}
如上所示,A取决于B,B是
public class B {
public void fooB(){
Log.e("s", "y");
}
}
我们可以使用 A like
public void do(){
A a = new A();
a.foo();
}
但是据说 A 不应该简单地初始化 B,因为它依赖于它,但是我们应该有一个在两个类之间有某种契约的服务。例如,如果我错了,请告诉我
所以让我们有一个接口 BService
public interface BService {
void fooB();
}
B变成DiB
public class DiB implements BService {
@Override
public void fooB(){
Log.e("s", "y");
}
}
A变成DiA
public class DiA {
BService bService;
public DiA(BService bService){
this.bService = bService;
}
public void foo(){
bService.fooB();
}
}
我们可以使用 A like
public void dIdo(){
BService service = new diB();
diA a = new diA(service);
a.foo();
}
所以我读到 DI 的好处是:
- 可测试代码:因为我实际上可以在 JUnit 中测试这两个代码(我不想在这里发布测试以避免冗长的问题)
- 解耦:据说如果 B 类发生变化,那么 A 不应该受到影响,我无法理解,因为如果我将 B 类中的 fooB() 更改为 fooB2(),我将不得不更改 BService 中的覆盖方法,这反过来意味着我将不得不在 A 类中更改它
两种代码似乎都可以正常工作,我无法理解其中一个的好处,只是另一个更复杂。那么,请您在这个简单的 A 类和 B 类的上下文中告诉我更多的好处。我没有得到什么?
解决方案
首先,我不同意您的“据说A不应该简单地初始化B,因为它取决于它”..因为相同的代码在.NET中对我有用
class Program
{
static void Main(string[] args)
{
A aobj = new A();
aobj.foo();
}
}
public class A {
public void foo()
{
B bojb = new B();
bojb.fooB();
Console.WriteLine("From A.foo() ..");
Console.ReadLine();
}
}
public class B {
public void fooB()
{
Console.WriteLine("From B.fooB() ..");
Console.ReadLine();
}
}
除此之外,猜测您对依赖注入的基础知识感到困惑。依赖词本身传达了任何类的注入源。
- 首先,可以在类的实例期间识别依赖关系,并且构造函数是第一种类型。
- 其次,一旦对象被实例化,在我们调用任何方法之前,都会对属性或公共字段进行一些赋值。虽然它是可选的,但是,顺序是这样的。于是,第二种。
- 最后是方法注入。
建议您在制作案例之前阅读更多内容。
推荐阅读
- mongodb - 在文档中存储表达式/条件
- amazon-web-services - Terraform 错误 EntityAlreadyExists:名为 iam_for_lambda 的角色已存在
- python - 如何打印一个字符串,显示字符串中每个字符重复的次数?
- javascript - 自定义 CTA 按钮插件 CK5Editor
- python - 如何持续交付部署在 Azure 中的 Python 函数应用程序?
- python - 在 Pandas Dataframe 中创建具有组中行位置的新列
- c# - AutoMapperMappingException:缺少类型映射配置或不支持的映射
- c - Activate some bits of a number in C
- r - 为什么 col_search 有时有效,有时无效,无论是否有效
- c# - 将正确信息添加到新工作表