# Spring基础

# 特点

轻量级框架,Java EE的春天,当前主流框架。 "一站式"的企业应用开发框架。

# 目标

使现有技术更加易用,推进编码最佳实践。

# 内容

  • IoC容器
  • 控制反转
  • AOP面向切面编程
  • 数据访问支持、简化JDBC/ORM框架,声明式事务
  • Web功能的集成

# Spring体系结构

# Spring设计理念

Spring是面向Bean的编程

Beans 通过把对象封装到Bean里面,实现对对象的管理和其他的操作。

Context 提供Beans生存和运行环境,它可以发现对象与对象之间的关系,并建立和维护这种关系。

Core Spring的util工具类

生动例子:

如果把Spring比作是一场演出。

那么Beans就是这场演出的主角。

而Context就是这场演出的舞台。

而Core就是演出所需要的道具。

# Spring两大核心技术

控制反转:IoC(Inversion of Control)/ 依赖注入:DI(Dependency Injection)

面向切面编程(AOP:Aspect Oriented Programming)

# 控制反转IoC容器

将组建对象的控制权从代码本身转义到外部容器当中。

组件化的思想:分离关注点,使用接口,不再关注实现。

最终目的就是为了让我们的程序解耦合。

其实IoC相当于工厂模式。

工厂模式:根据我们提供的对象实例描述,为我们生产所需的产品。

工厂模式四要素:

产品的规范、产品、工厂、客户端/调用

# Spring环境搭建

# 1.Jar包下载

http://https://repo.spring.io/
1

首先下载spring框架。

下载完后解压

docs:存放官方API的帮助文档

libs:存放jar包

schema:存放Spring配置文件的元素所依赖的文件

Spring环境所需的基本jar包

commons-logging-1.2可以去搜索下载。

log4j是日志jar包。

其余的4个spring框架包中找到。

然后将Jar包导入IDE中。

# 2.配置Spring的XML

一般我们对于Spring的配置文件命名

SpringAppcationContext.xml

XML基础头部

<?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">
    
    <!-- 省略代码 -->
</beans>
1
2
3
4
5
6
7
8

# Spring IOC

# 描述

控制反转:IoC(Inversion of Control)/ 依赖注入:DI(Dependency Injection)

控制反转也相当于依赖注入,降低程序代码之间的耦合度。

在java中我们service要调用DAO的方法时,需要实例化一个DAO,而通常这样做的后果是如果DAO发生改变,我们需要修改service的代码。

而依赖注入则很好的解决了这个代码耦合度高的问题,因为他依赖的是Spring给他进行注入,我们不需要手动写上实例化的代码,交由Spring进行管理。

让我们能够专心的去做业务代码,当Dao发生改变时,我们只需要配置一下Spring的XML就可以对整个项目生效。

一句话概括:让我们可以面向接口编程

# 例1:打印HelloSpring我爱你

HelloSpring类

package cn.springdemo;

public class HelloSpring {
	//定义变量who,它的值通过spring框架进行注入
	private String who;
	private HelloSpringObj helloSpringObj;
	//Spring注入时必须有对应属性的set方法
	public void setWho(String who) {
		this.who = who;
	}
	public void setHelloSpringObj(HelloSpringObj helloSpringObj) {
		this.helloSpringObj = helloSpringObj;
	}

	//打印内容
	public void print() {
		System.out.println("hello," + this.who + "!");
		//输出另外一个对象中的str属性。
		System.out.println(helloSpringObj.getStr());
	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

HelloSpringObj类

package cn.springdemo;

public class HelloSpringObj {
	private String str = "我爱你";

	public String getStr() {
		return str;
	}

}
1
2
3
4
5
6
7
8
9
10

XML配置

<?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">

	<!-- bean元素声明spring创建的对象实例-->
	<!-- id属性指定对象的唯一标识符(等同于方法名)  -->
	<!-- class指定该类的全类名 -->
	<bean id="helloSpring" class="cn.springdemo.HelloSpring">
		<!-- 指定被赋值的属性名 -->
		<property name="who">
			<!-- 赋值的内容 -->
			<value>Spring</value>
		</property>
		<!-- 给helloSpringObj对象注入对象,ref等于后面helloSpringObj申明的id -->
		<property name="helloSpringObj" ref="objSpring" />
	</bean>
	<!-- 申明一个HelloSpringObj id是objSpring给上面ref引用。-->
	<bean id="objSpring" class="cn.springdemo.HelloSpringObj" />
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Test类

package test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.springdemo.HelloSpring;

public class HelloSpringTest {

	@Test
	public void test() {
        //Spring内置的一个读取配置文件的方法
		//ClassPathXmlApplicationContext读取配置文件
        //getBean中的值对应的是XML中Bean元素的id
		ApplicationContext context = 
				new ClassPathXmlApplicationContext("ApplicationContext.xml");
		Object obj = context.getBean("helloSpring");
		HelloSpring helloSpring = (HelloSpring)obj;
        //调用打印方法测试输出信息
		helloSpring.print();
	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 多种方式实现依赖注入

# 构造注入

# 描述

Spring提供了构造方法复制的能力,构造注入!

# 特点

构造注入的时效性好,灵活性不足。

# 示例

下面例子中说明构造注入的使用。

业务类

Spring的XML配置

Test类

输出

上述例子中,我们使用了构造注入,对UserTest业务类的userName属性进行构造注入。

不需要提供set方法,利用constructor-arg来实现构造注入。

一个constructor-arg元素表示构造方法的一个参数,使用时不区分顺序。

# 注意

当构造方法的参数出现混淆,无法区分时,通过constructor-arg元素的index属性指定位置索引,从0开始。

constructor-arg还提供了type属性用来指定参数的类型,避免字符串和基本数据类型的混淆。

# P命名空间注入

# 简述

Spring配置文件从2.0版本开始采用schema形式,使用不同的明明空间管理不同类型的配置。

# 特点

使用属性而不是子元素的形式配置Bean的属性,从而简化了Bean的配置。

# 语法

p:属性名="属性值"

p:对象名-ref="Bean的Id"

# 示例

使用P命名空间需要先进行XML的头部声明。

xmlns:p="http://www.springframework.org/schema/p"
1

完整头部

最近更新: 2019/10/17 上午4:20:42