1.0Spring的学习路线
- Spring的概述,SpringIOC入门(XML),Spring的Bean管理,Spring属性注入
- Spring的IOC的注解方式,Spring的AOP开发(XML)
- Spring的AOP的注解开发,Spring的声明式事务。JdbcTemplate
- SSH的整合,HibernateTemplate的使用,OpenSessionInViewFilter的使用。
1.1Spring的概述:
1.1.1什么是Spring?
-
Spring叫做EE开发的一站式框架。
- 一站式框架:有EE开发的每一层解决方案。
- WEB层 :SpringMVC
- Service层:Spring的Bean层,Spring声明式事务。
- DAO层:Spring的Jdbc模块,Spring的ORM模块
- 一站式框架:有EE开发的每一层解决方案。
1.1.2为什么学习Spring?
1.1.3Spring版本
- Spring 3.x Spring 4.x
1.2Spring的入门(IOC)
1.2.1什么是IOC
- IOC:Inversion of Control(控制反转)
- 控制反转:将对象的创建权反转给(交给)Spring
1.2.2下载Spring的开发包
下载地址:https://spring.io/
1.2.4解压Spring
- docs:Spring的开发规范和API
- libs:Spring的开发的jar和源码
- schema:Spring的配置文件相关
1.2.5Spring的体系
IOC入门创建项目:
1.2.6创建项目引入jar包
路径:
包名:
同时Spring一样需要日志记录,所以我们找到Spring的依赖包。导入日志文件jar
创建完成:
1.2.6编写第一个传统方法以做比较。
传统方式有什么不好的呢?
注意:这里的问题是如果Service换成是Dao ,假如这个是JDBC的实现方式,如果这个Dao换成一个Hibernate的实现方式,那么就需要改写底层的代码,这就是如果要改成另一种方式实现就很不方便了,所以能不能在不修改的源代码的情况下对程序进行扩展 应该怎么做?
方案:
原理:同理这就是现实IOC的实现原理,即 工厂+反射+配置文件
1.2.7将实现类交给Spring管理
在Spring开发包中找到:
spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
找到末尾:
引入:
<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">
1.2.8Spring的入门配置:
整个项目包:
编写 Spring IOC方法测试:
@Test
public void TestSpring01() {
ApplicationContext applicationcontext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao dao=(UserDao)applicationcontext.getBean("UserDao");
dao.Save();
}
换一种方式(如上文所模拟的用Hibernate实现)
只需要修改配置文件类名的路径。
1.2.9IOC和DI
- IOC:控制反转,将对象的创建权反转给Spring
- DI:依赖注入,前提是必须要有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。 -
- 面向对象的时候
- 依赖
classA{
}
class B{
public void xxx(A a){
}
}
- 依赖
- 继承:is a
class A{
}
class B extends A{
}
- 聚合:has a
依赖案例
如:需要添加一个属性让这个方法依赖这个属性那么。
package com.st.spring.demo01;
public class UserDaoImp implements UserDao {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
@Override
public void Save() {
// TODO Auto-generated method stub
System.out.println("UserDao方式实现....."+name);
}
}
测试类中:
@Test
public void TestSpring() {
UserDaoImp dao=new UserDaoImp();
dao.setName("测试依赖属性name");
dao.Save();
}
换DI依赖 测试:
配置方式
package com.st.spring.demo01;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/*
* 传统的方式调用service
* */
public class TestDemo {
@Test
public void TestSpring() {
UserDaoImp dao=new UserDaoImp();
dao.setName("测试依赖属性name");
dao.Save();
}
@Test
public void TestSpring01() {
ApplicationContext applicationcontext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao dao=(UserDao)applicationcontext.getBean("UserDao");
dao.Save();
}
}
运行结果:
1.3Spring 的工厂类
1.3.1Spring 的工厂类
1.3.2Spring 的工厂类的结构图
- ApplicationContext继承了BeanFactory。
1.3.3BeanFactory:老版本的工厂类
- BeanFactory:调用getBean的时候,才会生成类的实例。
1.3.4ApplicationContext:新版本的工厂类
- ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化
- ApplicationContext有两个实现类
- ClassPathXmlApplicationContext:加载类路径下的配置文件
- FileSystemXmlApplicationContext:加载文件系统下的配置文件
注意:加载类的磁盘配置文件需要把配置文件放入 磁盘。
/*
* 加载磁盘上的配置文件
* */
public void demo3(){
ApplicationContext applicationcontext=new FileSystemXmlApplicationContext("D:\\applicationContext.xml");
UserDao dao=(UserDao)applicationcontext.getBean("UserDao");
dao.Save();
}
两种方式:
1.4Spring 的配置
## 1.4.1XML的提示配置
配置文件中复制这段:http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
一样在eclipse中配置。
路径:spring-framework-4.2.4.RELEASE-schema\beans\spring-beans-4.2.xsd
## 1.4.2Bean标签的配置
## 1.4.2.1<Bean标签的id和name的配置
-
id :使用了约束中的唯一约束。里面不能出现特殊字符
-
name :没有使用约束的唯一约束(理论上可以重复的,但是实际开发不能出现的)。里面可以出现特殊字符
- Spring和Struts1框架整合的时候
<bean name="/user" class=""/>
-
class这个属性 是类的全路径。
1.4.2.2Bean的生命周期的配置
例子:
- init-method:创建 当执行
ClassPathXmlApplicationContext applicationcontext=new ClassPathXmlApplicationContext(“applicationContext.xml”);
时候会初始化。 - destory-method:当工厂关闭时候会 销毁(注意:这里默认是单列模式创建的)
applicationcontext.close();
## 1.4.2.2Bean的作用范围的配置(重点)
-
scope :Bean的作用范围
- singleton :默认的,Spring会采用单列模式创建这个对象。
- prototype :多列模式。(Struts2和Spring整合的时候一定会用到)
- request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
- session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
- globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境 就相当于配置一个session
1.5Spring的Bean管理(XML方式)
1.5.1Spring的属性注入
1.5.2Spring的属性注入例子
构造方法方式注入:
package com.st.spring.demo03;
public class Car {
private String name;
private double price;
public Car(String name, double price) {
super();
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car [naem=" + name + ", price=" + price + "]";
}
}
package com.st.spring.demo03;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/*
* 属性注入方式
* */
public class TestSpringDemo03 {
@Test
public void testdemo03() {
ApplicationContext applicationcontext=new ClassPathXmlApplicationContext("applicationContext.xml");
Car car=(Car)applicationcontext.getBean("car");
System.out.println(car);
}
}
set方法方式注入:
以类方式方法注入:
1.5.3Spring的P名称属性注入
- 通过引入P名称空间完成属性的注入:
-
写法:
- 普通属性 P:属性名=“值”
- 对象属性 p:属性名-ref=“值”
-
引入p名称空间:
使用p名称空间:
修改set普通方式
修改属性对象方式:
1.5.3SpEL的属性注入
set方式
类对象方式
在SpEl可以更加灵活的使用各种参数 例如计算等:
1.5.4数组类型的属性注入
案例:
在这里不管是set或者是 map等的集合实现的方式都是差不多的。
1.6Spring的分模块开发配置
1.6.1将Spring的配置文件分成多个
1.6…1.1在加载配置文件的时候,加载多个
1.6.1.1.2在一个配置文件中引入多个配置文件