Spring 概念和耦合解耦、IOC、依赖注入
主要内容:spring框架的概述以及spring中基于XML的IOC配置
要明白的知识:
spring的IoC能解决什么问题
如果搭建spring中基于XML的IOC配置
如何使用spring的注入实现类之间的依赖关系
1、Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架
a. 以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核
b. 提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术
优点:
- 方便解耦,简化开发
通过 Spring 提供的 IoC 容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。 - AOP编程的支持
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。 - 声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量 - 方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作 - 方便集成各种优秀框架
Spring 可以降低各种框架的使用难度,提供了对各种优秀框架( Struts、 Hibernate、 Hessian、 Quartz等)的直接支持。 - 降低 JavaEE API 的使用难度
Spring 对 JavaEE API(如 JDBC、 JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的使用难度大为降低。 - Java 源码是经典学习范例
Spring 的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对 Java 设计模式灵活运用以
及对 Java 技术的高深造诣。它的源代码无意是 Java 技术的最佳实践的范例。
2、 IOC的概念,程序的耦合和解耦
工厂模式解耦:
一个创建Bean对象的工厂
Bean:在计算机英语中,有可重用组件的含义
JavaBean:用java语言编写的可重用组件
Javabean > 实体类
它就是创建我们的service和dao对象的
第一个:需要一个配置文件来配置我们的service和dao
配置的内容:唯一标识=全限定类型(key=value)
第二个:通过读取配置文件中配置的内容,反射创建对象
我的配置文件可以是xml也可以是properties
IoC的概念
IoC 控制反转,把创建对象的权利交给框架,IoC包括依赖注入(Dependency Injection DI)和依赖查找(Dependency Lookup)
IoC 的作用:
削减计算机程序的耦合(解除我们代码中的依赖关系)。
IoC只能解决程序间的依赖关系
3、spring IoC解决程序耦合
-
spring基于XML的IoC环境搭建和入门:
- spring依赖说明:
- Spring的体系结构:
获取配置文件,创建独享,并把对象放入map中 的工作交给spring来解决
用户需要的就是创建配置文件,把配置信息交给spring,并且换一个对象,去得到核心容器再根据唯一标志的到容器即可
- spring依赖说明:
ApplicationContext的三个常用实现类:
- ClassPathXmlApplicationContext:可以加载类路径下的配置文件,要求配置文件必须在类路径下,不在的话,加载不了
- FileSystemXmlApplicationContext:它可加载磁盘任意路径下的配置文件(必须由访问权限)
- AnnotationConfigApplicationContext:它用于读取注解创建容器
核心容器的两个接口引发出的问题:
-
ApplicationContext:单例模式适用
一般适用此接口定义容器对象它在创建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。
-
BeanFactory:多例模式适用
它在创建核心容器时,创建对象采用的策略是采用延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。
4、spring框架中的bean细节
spring框架对bean的管理细节
- 创建bean的三种方法
- 第一种:使用默认的构造函数创建
在spring的配置中使用bean标签,配以id和class属性之后,且没有其他属性和标签时
采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建
问:通过class获取的是InstanceFactory类,如果没有默认构造函数,xml文件没有办法取到该类中的构造函数返回的对象,取不到返回值对象
-
第二种:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器
有一个工厂对象,里面有方法可以为我们创建service对象,
需要定义一个service对象,里面有个id 需要把对象取出来, 这个id是由factory-bean中的方法中的factory-method方法取出来的 -
第三种:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
这个其实是jar包中的文件
- bean对象的作用范围
bean的作用范围调整
bean标签的scope属性
作用:用于指定bean的作用范围
取值:常用的就是单例的和多例的
singleton:单例的(默认值)
prototype:多例的
request:作用于web应用的请求范围
session:作用于web应用的会话范围
global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session
负载均衡:
全局session:
- bean对象的生命周期
- 单例对象:立即
出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象消亡
总结:单例对象的生命周期和容器相同 - 多例对象:延迟
出生:当我们使用对象时spring框架为我们创建
活着:对象在使用过程中就一直活着
死亡:当对象长时间不用且没有别的对象引用时,由java的垃圾回收器回收
5、spring的依赖注入
- 依赖注入:
Dependency Injection - IoC的作用:
降低程序间的耦合(依赖关系) - 依赖关系的管理:
以后都交给了spring来维护 - 在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明依赖关系的维护。(依赖注入)
依赖注入:
能注入的数据:
① 基本类型和String
② 其他bean类型(在配置文件中或注解配置过的bean)
③ 复杂类型/集合类型
注入方式:
③ 使用注解提供