Spring概述

Spring是一个开源框架,Spring是为简化企业级应用开发而生的,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能;Spring是JavaEE/JavaSE的一站式框架。JavaEE在开发过程中会将服务器划分为三层:Web层,业务逻辑层,持久层。Spring对于这三层都提供了较为完善的解决方案:在Web层提供了SpringMVC;业务逻辑层提供了用于Bean管理的SpringIOC和事务;持久层提供了JDBC Template,或者与Mybatis等ORM框架进行整合。

优点:

接下来是Spring的模块(本文以Spring4为例进行学习介绍):

Spring Ioc实现原理

下载Spring

Spring官网并不直接提供Spring的下载,Spring现在托管在GitHub上,相应的下载步骤如下:你可以点击这里查看文章下载Spring,或者直接看下面的步骤:

1、进入Spring官网 -> PROJECTS -> SPRING FRAMEWORK:

2、点击GitHub的图标,进入GitHub:

3、进入Spring仓库后,继续按照图示操作进行:

接着点击org -> springframework -> spring,选择要下载的版本,展开它:

Spring目录分析

docs文件夹里是一些html文件,是Spring的API文档。libs文件夹里是Spring的jar包,一共63个。

正如你所看见的文件是三个一组,其中.RELEASE.jar用于项目中,.RELEASE-javadoc.jar是该jar包的说明文档,.RELEASE-source.jar是该jar包的源码,也就是说真正在项目中用的就只有21个。

虽然有这么多包,但是只有4个是Spring的基础包,分别对应Spring核心容器的4个模块,注意它们是Spring项目必须的。

spring-core-5.1.8.RELEASE.jar 是Spring的核心工具类,其它jar包是建立这个包基础上的,都要用到这个包中的类;
spring-beans-5.1.8.RELEASE.jar通常用于配置、创建、管理Bean,同时负责Ioc控制反转和DI依赖注入;
spring-context-5.1.8.RELEASE.jar 用于提供在基础IoC上的扩展服务
spring-expression-5.1.8.RELEASE.jar用于提供对Spring表达式语言的支持。

另外Spring核心容器依赖第三方的commons.logging.jar包,需要自己去下载这个包;通常也会添加log4j包用于开发时的代码调式和测试。

总结起来就是:使用Spring时,需要把Spring自带的21个jar包+1个第三方的commons.logging.jar包添加到项目中即可。

Spring Ioc快速入门

下载安装Spring开发包–>复制Spring jar包至工程–>理解IOC控制反转和DI依赖注入–>编写Spring核心配置文件–>在程序中读取Spring配置文件,并通过Spring获得Bean,最终实现操作Bean的目的。

入门小demo

使用IDEA创建一个webapp项目,接着配置pom.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>

接着在main包下面新建一个java源程序包,然后在main包中新建com/envy.service文件包,里面新建一个接口UserService.java的文件:

1
2
3
public interface UserService {
public void sayHello();
}

为了实现这个接口,在该service包中新建一个UserServiceImpl.java的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class UserServiceImpl implements UserService {
private String name;

public String getName(){
return this.name;
}

public void setName(String name){
this.name=name;
}

public void sayHello() {
System.out.println("hello,spring!");
}
}

接着在main包下面新建一个与java同级的test文件夹,该文件夹是一个测试目录,然后在该test包中新建com/envy.test文件包,里面新建一个测试文件UserServiceTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
  /**
* 传统开发模式
**/
@Test
public void testOne() {
// UserService userService = new UserServiceImpl();
// userService.sayHello();

UserServiceImpl userServiceimpl = new UserServiceImpl();
userServiceimpl.setName("张三");
System.out.println(userServiceimpl.getName());
userServiceimpl.sayHello();
}

上面是传统的开发模式,如果单纯的需要使用sayHello方法,那么可以直接调用被注释的两行代码(只需要让接口的引用指向实现类的引用即可,无需创建实现类对象);如果是需要获取对象的属性,那么需要创建一个实现类对象,然后使用setter和getter方法分别去赋值和获值,这是非常麻烦的,因为涉及到修改实现类中的原始代码。

但是如果你是用SpringIOC 和DI的话,就需要按照如下进行操作:
第一步:在resource包中新建一个applicationContext.xml文件,里面的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 将userService的创建权交给了Spring -->
<bean id="userService" class="com.envy.service.UserServiceImpl">

<!-- 属性控制 -->
<property name="name" value="李四"></property>
</bean>
</beans>

最后在UserServiceTest测试文件中写入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* Spring开发模式
**/
@Test
public void testTwo() {
//创建Spring的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂获得类,参数是applicationContext.xml文件中的Bean的id,返回对象是Bean中的class对象
UserServiceImpl userServiceimpl = (UserServiceImpl) applicationContext.getBean("userService");
//调用对象的方法
System.out.println(userServiceimpl.getName());
userServiceimpl.sayHello();
}

注意到没有,需要使用属性只需在bean中进行property设置,然后在测试文件中直接调用实现类对象的getter方法就可以。更重要的是我们的Bean对象不再是自己来创建了,而是通过Spring来创建。