Spring 框架

Posted 飞龙dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 框架相关的知识,希望对你有一定的参考价值。

一. Spring入门

  Spring模块都打包成JAR文件,其命名格式如下:

spring-maluleName-x.y.z.RELEASE.jar

  其中module name是模块的名字,而x.y.z是spring的 版本号。例如:Spring的4.1.12版本中的beans模块的包 全名为:spring-beans-4.1.12.RELEASE.jar。

  推荐采用Maven或Gradle工具来下载Spring模块, 具体操作步骤可以参见Spring官网:

http://projects.spring.io/spring-framework

  使用maven加载Spring需要在pom.xml文件加入

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>

  采用类似Maven以及Gradle这样的工具有一个好 处,即下载一个Spring模块时会自动下载其所依赖的模 块。

   如果不熟悉以上两种工具,则可以通过如下链接下 载包括所有模块的压缩文件:

http://repo.spring.io/release/org/springframework/spring/

  注意:压缩文件中包括依赖库,必须单独下载。

二. 依赖注入

  在过去数年间,依赖注入技术作为代码可测试性的 一个解决方案已经被广泛应用。实际上,Spring、谷歌 Guice等伟大框架都采用了依赖注入技术。那么,什么 是依赖注入技术?

  很多人在使用中并不区分依赖注入和控制反转 (IoC),尽管Martin Fowler在其文章中已分析了二者 的不同。

http://martinfowler.com/articles/injection.html

  简单来说,依赖注入的情况如下。 有两个组件A和B,A依赖于B。假定A是一个类, 且A有一个方法importantMethod使用到了B,如下:

public class A {
public void importantMethod() {
B b = ... // get an instance of B
b.usefulMethod();
...
}
...
}

  要使用B,类A必须先获得组件B的实例引用。若B 是一个具体类,则可通过new关键字直接创建组件B实 例。但是,如果B是接口,且有多个实现,则问题就变 得复杂了。我们固然可以任意选择接口B的一个实现 类,但这也意味着A的可重用性大大降低了,因为无法 采用B的其他实现。

  依赖注入是这样处理此类情景的:接管对象的创建 工作,并将该对象的引用注入需要该对象的组件。以上 述例子为例,依赖注入框架会分别创建对象A和对象 B,将对象B注入到对象A中。

  为了能让框架进行依赖注入,程序员需要编写特定 的set方法或者构建方法。例如,为了能将B注入到A 中,类A会被修改成如下形式:

public class A {
private B b;
public void importantMethod() {
// no need to worry about creating B anymore
// B b = ... // get an instance of B
b.usefulMethod();
...
}
public void setB(B b) {
this.b = b;
}
}

  修改后的类A新增了一个setter方法,该方法将会被 框架调用,以注入一个B的实例。由于对象依赖由依赖 注入,类A的importantMethod方法不再需要在调用B的 usefulMethod方法前去创建一个B的实例。

  当然,也可以采用构造器方式注入,如下所示:

public class A {
private B b;
public A(B b) {
this.b = b;
}
public void importantMethod() {
// no need to worry about creating B anymore
// B b = ... // get an instance of B
b.usefulMethod();
...
}
}

  本例中,Spring会先创建B的实例,再创建实例 A,然后把B注入到实例A中。

注意: Spring管理的对象称为beans。

  通过提供一个控制反转容器(或者依赖注入容 器),Spring为我们提供一种可以“聪明”地管理Java对 象依赖关系的方法。其优雅之处在于,程序员无须了解 Spring框架的存在,更不需要引入任何Spring类型。

  从1.0版本开始,Spring就同时支持setter和构造器 方式的依赖注入。从2.5版本开始,通过Autowired注 解,Spring支持基于field方式的依赖注入,但缺点是程 序必须引入 org.springframework.beans.factory.annotation.Autowired, 这对Spring产生了依赖,这样,程序无法直接迁移到另 一个依赖注入容器内。

  使用Spring,程序几乎将所有重要对象的创建工作 移交给Spring,并配置如何注入依赖。Spring支持XML 和注解两种配置方式。此外,还需要创建一个 ApplicationContext对象,代表一个Spring控制反转容 器,org.springframework.context.ApplicationContext接口 有多个实现,包括ClassPathXmlApplicationContext和 FileSystemXmlApplicationContext。这两个实现都需要 至少一个包含beans信息的XML文件。 ClassPathXmlApplicationContext尝试在类加载路径中加 载配置文件,而FileSystemXmlApplicationContext则从 文件系统中加载。

  下面为从类路径中加载config1.xml和config2.xml的 ApplicationContext创建的一个代码示例:

三.

四.

五.

 

以上是关于Spring 框架的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

Spring boot:thymeleaf 没有正确渲染片段

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段