JAVA编程思想(一)通过依赖注入增加扩展性

2,982 阅读3分钟

banner窄.png

铿然架构  |  作者  /  铿然一叶 这是铿然架构的第 60 篇原创文章

相关阅读:

JAVA编程思想(二)如何面向接口编程
JAVA编程思想(三)去掉别扭的if,自注册策略模式优雅满足开闭原则
JAVA编程思想(四)Builder模式经典范式以及和工厂模式如何选?
Java编程思想(五)事件通知模式解耦过程
Java编程思想(六)事件通知模式解耦过程
Java编程思想(七)使用组合和继承的场景
JAVA基础(三)ClassLoader实现热加载
Java并发编程入门(十一)限流场景和Spring限流器实现
HikariPool源码(二)设计思想借鉴
人在职场(一)IT大厂生存法则

1. 依赖注入如何提高扩展性

当注入的是接口,再由调用者注入具体接口实现类时就提高了扩展性。

2. 依赖注入的时机把握

在spring中,依赖注入有以下几种方式:

  1. 通过类成员注入
  2. 通过构造器注入
  3. 通过方法参数注入

普通的java程序也可以通过这几种方式注入,那么什么时候用什么依赖注入方式合适? 这要从下面几个方面考虑:

扩展性

通过属性注入,注入的类在类定义时已经固定写死,不可改变;而通过构造器注入和方法注入,则可以由调用者在调用时传入,增加了可扩展性。

生命周期

通过属性注入和构造器注入,意味着注入类的生命周期和宿主类的生命周期一样,只要宿主类存在注入类就存在,也就是说这段时间注入类会一直占用内存;而通过方法注入,意味着一般情况下注入类仅在此方法内使用,方法结束,注入类的生命周期就结束,占用内存得以释放。

根据以上这两点,我们就可以很容易判断何时应该使用哪种方式注入。

3. 依赖注入提高扩展性举例

下面,我们通过java的JUC包下的ThreadPoolExecutor类来看依赖注入是如何提高扩展性的。


其中绿色部分都是接口,可由调用者提供具体实现并注入,这样就极大的提高了扩展性。各个接口职责说明如下:

职责
ThreadPoolExecutor线程执行器
BlockingQueue线程池所使用的缓冲队列,队列长度决定了能够缓冲的最大工作线程数量
Runnable线程队列中的Runnable
ThreadFactory创建工作线程的线程工厂
RejectedExecutionHandler线程执行器中线程队列满时增加新线程的处理策略接口
DiscardOldestPolicy抛弃线程队列中最老的未执行工作线程,添加新的工作线程。
CallerRunsPolicy重复执行,直到成功,在closeConnectionExecutor中使用。
AbortPolicy抛弃超出线程队列负载的工作线程,并抛出异常。
DiscardPolicy忽略超出线程队列复杂的工作线程,不做任何处理。

各接口的注入方式为构造器注入:

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {

4. 总结

  1. 依赖注入是提高扩展性的最佳方式,他将可扩展性交给了调用者,其自由度更高,而不是自行通过多种默认实现来提供扩展性,两者在扩展的广度上是无法相提并论的。
  2. 根据不同的场景合理确定依赖注入的方式是构造器注入还是方法注入。
  3. 不要因为依赖注入提供了强大的可扩展性,就在任何时候都使用它,而应遵从适用原则仅在需要的时候使用它。

end.


<--感谢三连击,左边点赞和关注。