使用依赖注入取代硬连接资源(静态工厂单例),也可用于构造方法bulider模式

Posted tabctrlshift

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用依赖注入取代硬连接资源(静态工厂单例),也可用于构造方法bulider模式相关的知识,希望对你有一定的参考价值。

改编自  http://www.cnblogs.com/IcanFixIt/p/8107863.html




 

许多类依赖于一个或多个底层资源。例如,拼写检查器依赖于字典。将此类类实现为静态实用工具类并不少见(条目 4):

//静态方法工具类
public class SpellChecker {
    private static final Lexicon dictionary = ...;

    private SpellChecker() {} // Noninstantiable

    public static boolean isValid(String word) { ... }
    public static List<String> suggestions(String typo) { ... }
}

 

同样地,将它们实现为单例也并不少见(条目 3):

//单例
public class SpellChecker {
    private final Lexicon dictionary = ...;

    private SpellChecker(...) {}
    public static INSTANCE = new SpellChecker(...);

    public boolean isValid(String word) { ... }
    public List<String> suggestions(String typo) { ... }
}

 

这两种方法都不令人满意,因为他们假设只有一本字典值得使用。静态实用类和单例对于那些行为被底层资源参数化的类来说是不合适的

依赖项注入(dependency injection)的一种形式:字典是拼写检查器的一个依赖项,当它创建时被注入到拼写检查器中。

// Dependency injection provides flexibility and testability
public class SpellChecker {
    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary) {
        this.dictionary = Objects.requireNonNull(dictionary);
    }

    public boolean isValid(String word) { ... }
    public List<String> suggestions(String typo) { ... }
}

 

依赖项注入可以使用任意数量的资源和任意依赖图。 它保持了不变性(条目 17),因此多个客户端可以共享依赖对象(假设客户需要相同的底层资源)。 依赖注入同样适用于构造方法,静态工厂(条目 1)和 builder模式(条目 2)。

该模式的一个有用的变体是将资源工厂传递给构造方法。 工厂是可以重复调用以创建类型实例的对象。

尽管依赖注入极大地提高了灵活性和可测试性,但它可能使大型项目变得混乱,这些项目通常包含数千个依赖项。使用依赖注入框架(如Dagger[Dagger]、Guice[Guice]或Spring[Spring])可以消除这些混乱。

以上是关于使用依赖注入取代硬连接资源(静态工厂单例),也可用于构造方法bulider模式的主要内容,如果未能解决你的问题,请参考以下文章

EffectiveJava第三版(最新建议)

《Effective Java》 读书笔记使用依赖注入取代原本的资源依赖

使用依赖注入作为单例的替代方案

Spring 依赖注入(DI)详解 [Spring][依赖注入的 6 种实现方式][setter注入][构造器注入][注解注入][自动装配注入][静态工厂注入][实例工厂注入]

依赖注入方法

SpringBoot默认注入单例模式所带来的的问题