Spring之IoC及DI的理解
博客说明
初次写博客,博客内文章所涉及的资料来自互联网整理及个人学习总结,仅仅用于个人学习和经验汇总,如有侵权或错误,请指认留言,在此表示感谢!
一、IoC和DI的关系
IoC全称:inversion of control ( 控制反转 )
DI全称:Dependency Injection ( 依赖注入 )
-
IoC是Spring 框架核心之一
-
DI(依赖注入)其实就是IOC的另外一种说法,DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。
-
DI是 Spring 框架核心 IOC 的具体实现。
-
在编写程序时,让对象的创建和依赖关系的设置本应该由自行处理的对象,通过spring中IoC是将这些操作交给spring框架(容器),来控制管理应用程序所需要使用的外部资源。资源受Spring管理,以降低耦合度,达到利用率最大化,但是代码中不可能出现没有依赖的情况,因此 IOC 的解耦只是降低他们的依赖关系,不会消除。
-
IoC 是一种思想,是一个重要的面向对象编程的法则,而其本身应该是Servlet自己创建Service的行为交给了spring创建,这就是将控制权由自己交给了别人的行为就叫控制反转(IoC),使用的方法就是依赖注入(DI)。
二、控制反转IoC(inversion of control)
-
控制:控制的双方是什么?谁控制谁?
- 主控方:Spring
- 被控方:应用程序所使用的资源
(原始)应用程序直接控制需要的外部资源
(Spring)Spring控制所需要的外部资源
-
反转:什么是反转?反转什么?
- 正向:应用程序直接调用资源
- 反向:应用程序依赖Spring为其提供资源
- 反转的是资源的控制权
- 应用程序由主动调用资源,变为被动的等待Spring提供资源
-
有什么好处?
- 正向缺点:应用程序控制的资源分布在程序的每一个地方
- 反向的优点:所有的资源都在Spring中,便于管理,降低了耦合度。
-
spring的IOC原理
1_ApplicationContext的三个实现类
-
1. ClassPathXmlApplicationContext:
- 它是从类的根路径下加载配置文件 推荐使用这种 2. FileSystemXmlApplicationContext:
- 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。 3. AnnotationConfigApplicationContext:
-
当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器,它用来读取注
解。
2_BeanFactory和ApplicationContext的区别
- BeanFactory 是Spring容器中的顶层接口。 ApplicationContext 是它的子接口。
- BeanFactory 和 ApplicationContext 的区别:
ApplicationContext:包含BeanFactory的功能,在生产对象后会将对象放入上下文进行管理,只要一读取配置文件,默认情况下就会创建对象。
BeanFactory:作为对象工厂什么使用什么时候创建对象,只有生产对象的基本功能。
3_Spring创建对象
- Spring创建对象的三种方式
- 构造器初始化:
Bean对应的类必须提供一个无参构造方法 - 静态工厂初始化:
提供一个工厂类,使用其中的静态方法获取对象
public class BeanFactory { public static Bean getBean(){ return new Bean(); } } <bean id="beans" factory‐method="getBean" class="com.tzgod.demo.BeanFactory "> </bean>
- 实例工厂初始化:
提供一个工厂类,使用其中的普通方法获取对象
public class BeanFactory { public Bean getBean(){ return new Bean(); } } <bean id="beans" factory‐method="getBean" factory‐bean="factory"></bean> <bean id="factory" class="com.tzgod.demo.BeanFactory "></bean>
- 构造器初始化:
4_Bean的作用域及生命周期
取值范围 | 说明 |
---|---|
singleton | 默认值,单例的 |
prototype | 多例的 |
request | WEB项目中,Spring创建一个Bean的对象,将对象存入到request域中 |
session | WEB项目中,Spring创建一个Bean的对象,将对象存入到session域中 |
global session | WEB项目中,在Portlet环境 |
Column 1 | Column 2 |
- 更改作用域的方法
//scope属性:singleton:单例 ;prototype:非单例
<bean id=”beanId” class=”BeanClassName” scope=”prototype”></bean>
Bean的生命周期
- 单例对象: 一个应用只有一个对象的实例。它的作用范围就是整个引用。
- 生命周期:
- 生:当应用加载,创建容器时,对象就被创建了。
- 活:只要容器在,对象一直活着。
- 死:当应用卸载,销毁容器时,对象就被销毁了。
- 生命周期:
- 多例对象:每次访问对象时,都会重新创建对象实例。
- 生命周期:
- 生:当使用对象时,创建新的对象实例。
- 活:只要对象在使用中,就一直活着。
- 死:当对象长时间不用时,被 java 的垃圾回收器回收了。
- 生命周期:
- 监听
- init-method:
初始化回调方法名,配置的方法必须由bean对象提供 - destroy-method:
销毁回调方法名,配置的方法必须由bean对象提供
- init-method:
三、依赖注入DI(Dependency Injection)
-
什么是依赖?
只要是全局属性都是当前类的依赖。 -
什么是依赖注入?
依赖注入:一般是将外界的对象 注入 到另一个对象里面。
1_依赖注入的数据类型
- 基本数据类型和String
- javaBean类型
- 复杂类型/集合类型
2_依赖注入的方式
-
使用构造函数注入
使用类中的构造函数,给成员变量(简单类型、javaBean)赋值。赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入。 -
使用set方法注入
表示在对某个对象设置属性时,通过其类中提供需要注入成员的set方法给成员变量(简单类型、javaBean)赋值注入的,而不是直接通过属性名称注入的。赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架来为我们注入。 -
使用注解注入
-
@Component(@Repository、@Service、@Controller)
- 作用于类上,用来表示将当前的类交给Spring进行管理(创建对象、注入对象) @Autowired
- 作用于方法上,用来表示当前方法需要被注入一个对象 @Bean
- 作用于方法上,用来表示此方法提供一个对象 @Qualifier
- 作用于方法上,用来表示当前注入一个指定名称的对象 @Configuration
- 作用于类上,用来表示当前类为Spring的初始化配置类(入口类) @ComponentScan
- 作用于类上,一般和Configuration 一起使用,用来表示Spring需要管理的类在哪一个包下
3_复杂对象注入
- 通过sqlsessionfactory创建sqlsession对象
- 扫描注解@Bean通过sqlsession交给spring
- spring工厂创建的DogFood对象
- Spring注射器注入对象