1.Spring框架的优点
-
Spring是一个轻量级的非侵入式框架,不强制要求实现Spring框架中的接口或实现Spring框架中的类,使应用程序对框架的依赖最小化;
-
提供IOC容器。使用IOC容器管理对象以及对象之间的依赖关系,当对象之间的依赖关系发生变化时,只需要修改配置文件,不需要修改代码;
-
AOP,面向切面编程,是对OOP的补充和完善,将所有的横切关注功能配置到切面中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现业务逻辑和系统服务之间的分离;
-
MVC:为web表示层提供了很好的解决方案;
-
事务管理:接收多种持久层技术,并提供声明式的事务管理。
2. IoC
2.1 基本概念
IoC是控制转移,是Spring框架的核心之一,它是指将组件对象和对象之间的依赖关系的控制权从程序代码转移到容器中,使用容器实现对象的配置和管理,解放手动创建的过程,让类与类之间的关系达到最低耦合度,提高灵活性和可维护性。IoC重点是在系统的运行过程中,动态地向某个对象提供它所需要的其他对象。
2.2 实现步骤
- 定义用来描述Bean的配置的Java类(注解配置)或xml文件(xml配置);
- 解析Bean的配置,转换为BeanDefinition对象保存在内存中,使用HashMap进行存储;
- 遍历HashMap,取每个BeanDefinition对象,使用反射机制实例化该对象,再将实例化后的对象存储到另一个HashMap中。
2.3 Spring容器装配Bean
参考链接,该链接有非常清楚且详细的解释
xml配置
<beans/>是顶级标签,用于引入核心命名空间;
<bean/>是<beans/>的子标签,声明需要被IoC容器创建的类对象:
<bean name="***" class="com.*.*.***"/>
<property/>是<bean/>的子标签,作用是为该类注入其它依赖对象:
//ref是代表注入对象的属性,要求被注入的类要有对应的set方法
<property name="testDao" ref="testDao"/>
注解配置(详细的解释见上述链接)
定义用来描述Bean的配置的Java类
@Configuration注解表明BeanConfiguration类,等价<beans/>;
@Bean表明需要被创建的对象,等价<bean/>。
3. DI依赖注入
3.1 基本概念
DI依赖注入是IoC的一种实现方式,它可以在组件需要实例对象的时候通过反射机制动态创建,并且可以为该类注入其它对象。
(也有文章说DI是IoC的一部分,只用于将一个实例Bean注入到需要它的实例Bean中)
3.2 注入方式
Setter注入:需要类提供无参构造函数或无参静态工厂方法
- 注入类中要有被注入对象的set方法
- setter注入在Bean实例创建完之后执行
- 对象注入使用<property/>标签的ref属性,简单值注入使用value属性,也可以注入map、list、set和数组
构造函数注入
- 构造函数的参数一般是依赖项
- 可以注入简单类型、引用类型和集合类型
- 使用<bean/>的子标签<constructor-arg/>标签注入,引用类型和简单类型分别对应"ref"属性和"value"属性
- 存在循环依赖的问题
4. 自动装配
4.1 自动装配的模式
-
No:不自动装配
-
byName:根据Bean的名字自动装配
-
byType:根据Bean的类型自动装配,存在多个类型相同、名称不同的实例Bean时会注入失败,可以使用Bean标签的autowired_candidate=false过滤不需要注入的Bean
-
constructor:根据构造器的参数类型自动装配,存在单个实例时优先按照类型进行参数匹配,存在多个类型相同的实例时优先按照名称进行匹配,没有找到对应的名称则注入失败,可以使用autowired_candidate=false进行过滤
-
autodetect:如果有默认的构造器,则使用constructor方式自动装配,否则使用byType类型自动装配
4.2 自动装配的方法
基于xml的自动装配
使用<bean/>标签的autowired属性设置自动装配模式,包括byType/byName/constructor/autodetect
基于注解的自动装配
基于@Autowired注解
- 默认按类型匹配;
- 可以与@Qualifier注解结合按名称装配
-
@Autowired
@Qualifier("testDao")
基于@Resource注解
- 有name和type两个属性,分别代表byName和byType两种注入方式,默认使用byName方式注入
-
@Resource(name="testDao1")
@Resource(Type="testDao")
基于@Value注解
- 用于简单值类型的注入
5. BeanFactory和ApplicationContext
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。
BeanFactory是最底层的接口,包含了各种Bean的定义、可以读取配置文档、管理Bean的加载和实例化、控制Bean的生命周期、维护依赖关系等等。由于它比较古老,因此无法支持Web等Spring插件。除此之外,它采用延迟加载的方式注入Bean,真正使用实例对象时才初始化,这样做节省内存,但是运行速度变慢;
ApplicationContext是BeanFactory的一个子接口,对BeanFactory的基础功能进行了扩展,支持国际化、进行了上下文分层并实现了继承。此外,如果配置的Bean的Singleton的话,ApplicationContext会进行预加载,虽然浪费内存空间,但是运行速度会变快。
6.Bean的作用域
使用<bean/>标签的scope属性指定或使用@Scope("prototype")指定
-
Singleton:单例模式,Spring的默认作用域,每个Bean实例只被创建一次,而且Spring容器在整个应用程序生存期中都可以使用。设它为默认作用域是因为开销比较小,Bean实例一旦创建成功便可以重复使用
-
Prototype:原型模式,每次调用Bean都会返回新的实例
-
Request:每次HTTP请求都创建新的Bean,接收参数的时候可能需要Bean实例来装载一些参数,因此希望每一个请求都有一个新的Bean
-
HTTPSession:同一个HTTPSession共享同一个Bean,不同HTTPSession使用不同的Bean
-
GlobalSession:同一个全局Session共享同一个Bean,适用于基于分布式开发的web应用程序