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

Java极客  |  做者  /  铿然一叶
这是Java极客的第 58 篇原创文章

相关阅读:java

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

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

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

2. 依赖注入的时机把握

在spring中,依赖注入有如下几种方式:并发

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

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

扩展性

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

生命周期

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

根据以上这两点,咱们就能够很容易判断什么时候应该使用哪一种方式注入。线程

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

下面,咱们经过java的JUC包下的ThreadPoolExecutor类来看依赖注入是如何提升扩展性的。设计


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

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

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

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

4. 总结

  1. 依赖注入是提升扩展性的最佳方式,他将可扩展性交给了调用者,其自由度更高,而不是自行经过多种默认实现来提供扩展性,二者在扩展的广度上是没法相提并论的。
  2. 根据不一样的场景合理肯定依赖注入的方式是构造器注入仍是方法注入。
  3. 不要由于依赖注入提供了强大的可扩展性,就在任什么时候候都使用它,而应听从适用原则仅在须要的时候使用它。

end.


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

相关文章
相关标签/搜索