什么是依赖注入和Spring框架?

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

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

那么,我们应该在beans.xml中描述哪些对象? 所有对象还是只有几个?

最简单的答案是受欢迎的


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

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

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

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

这意味着如果您稍后想要使用不同的MessageService,则不能。

另一方面,如果您向课堂注入接口并坚持Liskov替代原则,您将能够独立改变消费者和服务。

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的行为而不改变类本身,从而遵守开放/封闭原则。


重新配置被高估。 使用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
 }

}

在那个例子中,假设您想单元测试SaleAction的预付款逻辑和后付款逻辑...您不能因为SaleActionCreditCardService耦合,并且可能运行您的测试会产生虚假付款。

现在与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
     }

    }

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

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


Spring已经变成了一个巨大的框架,如果你只是试图围绕依赖注入打包头,这可能会让你感到困惑。 Google Guice项目很小,只有纯Java的DI才能使用 - 不需要XML,也没有额外的功能。 有一个很好的解释DI的介绍性视频。 http://code.google.com/p/google-guice/

链接地址: http://www.djcxy.com/p/14399.html

上一篇: What are Dependency Injection & Spring Framework about?

下一篇: What is Dependency Injection?