今日目标
- Spring是什么
- Spring的核心
- Spring的发展历程
- Spring的体系结构
- 程序的耦合和解耦
- IOC概念和Spring中的IOC
- Spring中基于XML的IOC环境搭建
- 依赖注入 (Dependency Injection)
Spring
-
分层的JavaSE/EE 轻量级开源框架
-
以IoC(控制反转) AOP(面向切面编程) 为内核
-
展现层 SpringMVC
-
持久层 Spring JDBC/MyBatis
-
整合 SSM
Spring的优势
- 方便解耦, 简化开发
- AOP编程支持
- 声明式事务的支持
- 程序测试的方便
- 可以集成各种优秀框架Struts, Hibernate, Hessian等
- 降低JavaEE API 的使用难度 对JDBC, JavaMail,远程调用难度降低
Spring 体系结构
Core Container 核心容器控制所有 IOC
耦合关系
传统jdbc连接如何解耦合
- 不使用new 而使用反射创建对象
- 对经常变的字符串 写在配置文件里
模块间的 接口 调用模块方式 传送数据
模块间 耦合 模块间的依赖关系 控制 , 调用 数据传递
- 依赖关系
- 耦合关系
- 类之间的依赖
- 方法之间的依赖
- IOC(控制反转) 只能是解决程序间的耦合关系
- 对象创建交给Spring处理
基础
配置文件 获取要创建的对象的全限定名
读取配置文件的全限定名等信息
通过反射创建对象
Spring的IoC容器是Map类型的
有bean对象 怎么存放的呢
工厂模式
分工
BeanFactory
1. 定义静态代码块
Properties 读取配置文件
2. 定义方法 返回对象
public static Object getBean(String beanName){
Object bean;
try{
String beanPath =
bean = Class.forName(全类名).newInstance();
}catch(Exception e){
}
}
Spring的使用
- Maven工程
- packaging 导入Jar坐标 GroupId, ArtifactId jar包的问题多了aop(基于注解的jar),jcl(把Apache的日志组件集成到这个jar里)
- spring-context 5.0.2.RESLEASE 不是简单的依赖
- Beans Core Context SpEL
- mysql 5.1.6
- bean.xml
- src/java/resource/bean.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">
<!--把对象的创建交给spring来管理 id = 唯一标志 -->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean>
</beans>
- 获取核心容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
- 根据id获取Bean对象
IAccountService iaccountService = (IAccountService)applicationContext.getBean("accountService")
// 此时获取的是Object类型的 强制转换成 IAccountService
2. IAccountDao accountDao = applicationContext.getBean("accountDao",IAccountDao.class);
// 疑惑 用的是 接口的实现类啊
ApplicationContext的三个常用实现类
ClassPathXmlApplicationContext:
加载类路径下的配置文件, 配置文件必须在类路径下,
FileSystemXmlApplicationContext:
加载磁盘任意路径的文件, 跟定绝对路径
AnnotationConfigApplicationContext:
它可以用于读取注解创建容器
核心容器的两个接口的问题
-
ApplicationContext 构建核心容器 立即加载创建对象的形式 读完配置文件 立即使用反射的方式创建对象 创建一次之后就不会再创建了适用与单例设计模式
-
BeanFactory 构建核心容器 延迟加载的方式创建对象,什么时候根据id获取对象,什么时候就创建对象
适用于多例
创建Bean的三种方式
- 默认构造函数(无参构造)创建
- 在Spring的配置文件中使用Bean标签,只设置id, class属性,这是使用默认构造函数创建对象,如果class指定类中没有默认构造无法创建对象 无参构造方法
- 使用普通工厂中的方法创建对象( 使用某个类中的方法创建对象,并存入容器)
该工厂可能是jar包中的类
(使用工厂类中的方法创建对象,存入容器)
创建工厂对象 通过工厂对象 调用工厂里的方法得到需要的类的对象
- 模拟静态工厂类,使用class属性指定 (某个类中的静态方法创建对象)
创建 class指定类的对象,指定id的内容
创建 class 指定的对象 执行 factory-method 用id 取
bean的作用范围
bean标签的scope属性
取值
- singleton 单例
- prototype 多例
- request 作用web应用的请求范围
- session 会话范围
- global-session 集群环境的会话范围
bean的生命周期
main 方法 程序的入口
多态看成自己 父 xx = new 子(); => 子 xx = new 子();
单例对象
- 出生 容器创建时对象出生
- 活着 容器在,对象活着
- 死亡 容器销毁,对象就完了
- 总结 单例对象的生命周期与容器相同
多例对象
- 出生 使用对象时Spring创建
- 活着 对象在使用就活着
- 死亡 GC回收
Spring中的依赖注入
Dependency Injection
依赖关系交给Spring来维护Spring
IoC的作用:
降低程序间的耦合 依赖关系
编写程序 通过控制反转
当前类调用其他类的对象,有Spring给我们提供
依赖关系的管理:
Spring
管理依赖关系 依赖注入
依赖注入 三类 能注入的数据
基本类型 String
其他bean类型,在配置文件中配置过的bean类型
复杂类型/集合类型
注入的方式: 有三种
- 第一种: 使用构造函数提供 constructor-arg
- 第二种:使用setter方法提供
- 第三种:使用注解提供
构造函数注入
可注入的变量 成员变量 数据类型
基本类型
其他bean类型
1. 类中定义可用的成员变量 经常变化的数据,不适用与注入的方式
2. set()方法
bean.xml中
<bean id="" class="">
<constructor-arg type="java.lang.String">
</constructor-arg>
</bean>
优点 : 注入数据是必须的操作
缺点 : 创建对象时,用不到的数据也必须提供
set方法注入
- 只需要set方法
bean标签内部 标签
<bean id = "" class = "" >
<property name ="xxx" value = "" ref ="">
</property>
</bean>
- name 指定注入时所调用的set方法名
- value 提供数据
- ref 指定其他类型的Bean 指 在springIoC中出现的bean对象