Dependency Injection & Spring Framework是关于什么的?

2022-09-03 03:39:16

可能的重复:
什么是依赖注入?
春天到底是干什么用的?

我想知道什么是弹簧框架?为什么以及何时应该在Java企业开发中使用它?答案是“依赖注入框架”。好吧,使用依赖关系注入框架时,我们有什么优势?用 setter 值和/或构造函数参数来描述类的想法对我来说似乎很奇怪。为什么会这样呢?因为我们可以在不重新编译项目的情况下更改属性?这就是我们所得到的一切吗?

那么,我们应该用什么对象来描述呢?所有对象还是仅几个对象?beans.xml

欢迎最简单的答案


答案 1

我们使用依赖注入(DI)来实现松散耦合。任何特定DI容器的选择都不是那么重要。

每次使用关键字创建类的实例时,都会将代码与该类紧密耦合,并且无法用其他实现替换该特定实现(至少在不重新编译代码的情况下不能)。new

这在C#中看起来像这样(但在Java中是等效的):

public class MyClass
{
    public string GetMessage(int key)
    {
        return new MessageService().GetMessage(key)
    }
}

这意味着,如果您以后想使用其他消息服务,则不能。

另一方面,如果你将一个接口注入到类中,并遵守Liskov Substition原则,你将能够独立地改变消费者和服务。

public class MyClass
{
    private readonly IMessageService messageService;

    public MyClass(IMessageService messageService)
    {
        if(messageService == null)
        {
            throw new ArgumentNullException("messageService");
        }

        this.messageService = messageService;
    }

    public string GetMessage(int key)
    {
        return this.messageService.GetMessage(key)
    }
}

虽然这看起来更复杂,但我们现在已经设法遵循单一责任原则,确保每个协作者只做一件事,并且我们可以彼此独立地改变两者。

此外,我们现在可以在不改变类本身的情况下改变MyClass的行为,从而遵循开放/封闭原则


答案 2

重新配置被高估了。使用 DI 最重要的事情是可测试性。由于您的类不依赖于实现,而是依赖于抽象,因此您可以在单元测试中用模拟/存根替换它们。

不带 DI:

class SaleAction{

 private BillingService billingService;

 public SaleAction(){
   billingService = new CreditCardService(); //dependency is hardcoded
 }

 public void pay(long amount){
   //pre payment logic
   billingService.pay(amount);
   //post payment logic
 }

}

在该示例中,假设您要对 ...你不能,因为耦合和可能运行你的测试会产生虚假的付款。SaleActionSaleActionCreditCardService

现在,DI 的相同示例:

 class SaleAction{

     private BillingService billingService;

     public SaleAction(BillingService service){
       billingService = service; //DI
     }

     public void pay(long amount){
       //pre payment logic
       billingService.pay(amount);
       //post payment logic
     }

    }

现在与任何实现分离,这意味着在您的测试中您可以执行.SaleActionSaleAction action = new SaleAction(new DummyBillingService());

希望有所帮助,还有一篇关于DI的文章,由Martin Fowler撰写,您可以在这里找到


推荐