# 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/
首先下载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>
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());
}
}
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;
}
}
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>
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();
}
}
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"
完整头部
