`
zhuzhiguosnail
  • 浏览: 110474 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring精髓 15分钟搞明白

阅读更多
  几年的学校和工作项目开发过程中,spring一直伴随左右。
  在实际的开发中,我们反复尽量避免尽量降低对象间的依赖关系即耦合度。但是如何才能作到呢? 通常的业务对象之间都是依赖关系的,业务对象与业务对象,业务对象与持久层,业务对象与各种资源之间都存在这样和那样的依赖关系。
  IoC (Inversion Of Control)中文名为控制反转,就是由容器来控制业务对象之间的依赖关系,而非传统实现中,由代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。控制权的转移带来的好处就是降低了业务对象之间的依赖程度。
  IoC实现策略:
  1)  依赖查找:容器中的受控对象通过容器的API来查找自己所依赖的资源和协作对象。这种方式虽然降低了对象间的依赖,但是同时也使用到了容器的API,造成了我们无法在容器外使用和测试对象。
  2)  依赖注入:对象只提供普通的方法让容器去决定依赖关系,容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的 getter和setter,.NET中的property)或者是构造子传递给需要的对象。通过属性注射依赖关系的做法称为设值方法注入(Setter Injection),将构造子参数传入的做法称为构造子注入(Constructor Injection)
  IoC的第二种策略 依赖注入是一种更加合适的方法。让容器去全权负责依赖查询,受控对象只要暴露属性和代参数的构造子,使容器可以在初始化对象的时候设置对象间的依赖关系。这种方式往往不需要依赖特定API和接口,完全只要依赖语言本身就可以实现了。Spring之父Rod Johnson称之为language-based IoC。
  这样做的好处:
  1)  查询依赖操作和应用代码分离。
  2)  受控对象不会使用到容器的特定的API。这样我们的受控对象可以搬出容器单独使用。
  现在让我们来看看依赖注入的两种实现方法。
  (一)设值方法注入(Setter Injection)
  使用设值方法注入的时候,受控对象通过属性来表达自己所依赖的对象和所需配置的值。Java实现中,只要对象提供JavaBean标准的属性就可以了。例如:
  Java代码
1.    
2. 
3.public class MyBusinessObject {  
4. 
5.private DataSource ds;  
6. 
7.   
8. 
9.public DataSource  getDataSource() {  
10. 
11.    return ds;  
12. 
13.}  
14. 
15.   
16. 
17.public void setDataSource(DataSource ds) {  
18. 
19.    this.ds = ds;  
20. 
21.}  
22. 
23.   
24. 
25.// 具体的业务逻辑  
26. 
27.}  
28.  
 

public class MyBusinessObject {

private DataSource ds;



public DataSource  getDataSource() {

    return ds;

}



public void setDataSource(DataSource ds) {

    this.ds = ds;

}



// 具体的业务逻辑

}
  这样当容器实例化对象MyBusinessObject的时候,会立即调用设值方法,将所需的DataSource传递给MyBusinessObject。
  可以看出MyBusinessObject只是一个普通的Java对象,完全没有依赖IoC容器。这样它就可以在容器外运行。
  (二)构造子注入(Constructor Injection)

如果使用构造子注入MyBusinessObject大概会是这样的。

Java代码
1.     
2.public class MyBusinessObject {  
3. 
4.private DataSource ds;  
5. 
6.   
7. 
8.public MyBusinessObject(DataSource ds) {  
9. 
10.    this.ds = ds;  
11. 
12.}  
13. 
14.   
15. 
16.// 具体的业务逻辑  
17. 
18.}  
19.  
  
public class MyBusinessObject {

private DataSource ds;



public MyBusinessObject(DataSource ds) {

    this.ds = ds;

}



// 具体的业务逻辑

}


可以看出这也是一个简单的Java对象,它也同样不依赖IoC容器。



比起以前在应用代码中的查找,创建依赖对象的方法来看,这两种注入方法都有着巨大的进步。但是我们该如何选择呢。到底是使用设值方法注入还是构造子注入呢。



让我先来看看这两种方法的优缺点。



设值方法注入的主要优点:

1)  每个设值方法都有一个对应的读取方法,这样就可以要求受控对象汇报自身的状态。

2)  父类的属性可以被子类继承而无需重新编码。



设值方法注入的主要缺点:

1)  设置方法的调用次序无法规定

2)  在使用对象前,可能存在不是所有的设值方法都会调用到,可能存在着未配置完全的状态。



构造子注入的主要优点:

1)  在使用之前,对象必定处于配置完全的状态。

2)  比起多个设值方法来说一个构造函数的代码量可能更少,当然两者的复杂程度是没有区别的。



构造子注入的主要缺点:

1)  构造子无法被自动被继承。

2)  构造子参数太多和构造子操作太多都不方便于使用

3)  IDE对设值方式要比构造子参数列表有更好的支持。



由此可见在下列情况下,设值方法注入更有优势:

1)  需要配置的属性很多

2)  对象位于继承体系中

3)  对象必须提供运行时修改依赖关系的途径(我认为这点是最主要的)
2
0
分享到:
评论

相关推荐

    spring从入门到精髓

    spring从入门到精髓卷一,很不错的关于spring的书籍

    spring Boot 2精髓.rar

    这个“Spring Boot 2精髓”压缩包显然包含了一份关于Spring Boot 2核心概念和技术的详细指南,可能是电子书的形式,具有高清质量和方便的目录书签。 Spring Boot的核心特性包括自动配置、起步依赖和嵌入式Web服务器...

    spring Boot 2 精髓

    本书系统介绍了Spring Boot 2的主要技术,侧重于两个方面,一方面是极速开发一个Web应用系统,详细介绍Spring Boot框架、Spring MVC、视图技术、数据库访问技术,并且介绍多环境部署、自动装配、单元测试等高级特性...

    spring Boot 2精髓带源码带书签目录高清版

    《Spring Boot 2精髓》是一本深度探讨Spring Boot 2框架的权威指南,结合源码与高清书签目录,为读者提供了丰富的学习资源。这本书详细介绍了如何利用Spring Boot简化Java应用开发,提升效率,以及如何在实际项目中...

    Spring Boot 2精髓带书签目录高清版.pdf

    这份“Spring Boot 2精髓带书签目录高清版.pdf”文档,无疑是对Spring Boot 2深入理解和学习的宝贵资源。 1. **核心概念**: - **起步依赖(Starter Dependencies)**:Spring Boot的核心概念之一,允许开发者通过...

    Spring Boot 2精髓带书签目录高清版

    Spring Boot 2精髓带书签目录高清版,文字可复制,内容丰富,涵盖Spring Boot框架、Spring MVC、视图技术、数据库访问技术,并且介绍多环境部署、自动装配、单元测试等高级特性,包括使用Spring实现RESTful架构,在...

    Spring Boot 2精髓.rar

    《Spring Boot 2精髓》这份压缩包文件,其核心内容显然围绕着Spring Boot 2这一热门的Java开发框架展开。Spring Boot是Spring生态系统中的一个重要组成部分,它极大地简化了创建独立的、生产级别的基于Spring的应用...

    Spring Boot 2精髓:从构建小系统到架构分布式大系统 源码.zip

    Spring Boot 2精髓:从构建小系统到架构分布式大系统 源码

    spring Boot 2精髓带书签目录高清版

    《Spring Boot 2精髓》是一本深度探讨Spring Boot 2框架的权威指南,旨在帮助开发者高效、快速地构建基于Spring的应用程序。这本书包含了全面的知识点,涵盖了从基础概念到高级特性的方方面面,让读者能够充分利用...

    Spring Boot 2精髓带书签pdf打包送张志君视频教程

    在这个"Spring Boot 2精髓带书签pdf打包送张志君视频教程"中,你将深入学习Spring Boot 2的核心概念和实践技巧。 首先,Spring Boot 2的启动机制是其核心之一。它通过自动配置(Auto Configuration)特性,使得开发者...

    Spring技术内幕:深入解析Spring架构与设计原理

    你不仅能从本书中参透Spring框架的出色架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块...

    Spring Integration + Spring WS 整合

    Spring Integration + Spring WS 整合 在 Java 领域中,Spring Integration 和 Spring WS 是两个常用的框架,它们分别负责集成系统和 Web 服务。今天,我们将探讨如何将这两个框架整合在一起,实现一个完整的 Web ...

    Spring Boot整合Spring Batch,实现批处理

    在Java开发领域,Spring Boot和Spring Batch的整合是构建高效批处理系统的一种常见方式。Spring Boot以其简洁的配置和快速的启动能力深受开发者喜爱,而Spring Batch作为Spring框架的一部分,专注于批量处理任务,...

    spring2.0升级到spring3.0.5的开发包

    Spring框架是Java应用程序开发中的一个核心组件,它提供了一个丰富的IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)功能,使得开发者能够更方便地管理对象和实现模块化...

    spring配置 spring配置 spring配置 spring配置 spring配置

    spring配置 spring配置 spring配置 spring配置 spring配置

    spring揭秘.rar_Spring揭秘 下载_spring mvc_spring 揭秘_spring揭秘

    spring揭秘,了解spring内在运行逻辑

    Spring MVC 基础实例,能明白SpringMVC是怎么回事

    Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、高性能和灵活的Web应用程序。它作为Spring框架的一部分,提供了一种模型-视图-控制器(MVC)架构,简化了处理HTTP请求和响应的复杂性。在这个基础实例中...

    Spring技术内幕:深入解析 Spring架构与设计原理.pdf

    你不仅能从本书中参透Spring框架的优秀架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块...

    spring-petsore spring官方最新demo

    《深入剖析Spring PetClinic官方示例》 Spring PetClinic是Spring官方提供的一款用于教学和展示Spring框架功能的开源项目。...通过深入研究这个示例项目,开发者可以更全面地理解和掌握Spring框架的精髓。

    SpringBatch+Spring+Mybatis+MySql (spring batch 使用jar)

    Spring Batch是一个轻量级的,完全面向Spring的批处理框架,可以应用于企业级大量的数据处理系统。Spring Batch以POJO和大家熟知的Spring框架为基础,使开发者更容易的访问和利用企业级服务。Spring Batch可以提供...

Global site tag (gtag.js) - Google Analytics