【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的三个实现类

Idea查看继承关系源码下,右键->Diagrams->show diagrams选中ApplicationContext-> show implementations

1. ClassPathXmlApplicationContext
它是从类的根路径下加载配置文件 推荐使用这种
2. FileSystemXmlApplicationContext
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
3. AnnotationConfigApplicationContext:
当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器,它用来读取注
解。

2_BeanFactory和ApplicationContext的区别

  • BeanFactory 是Spring容器中的顶层接口。 ApplicationContext 是它的子接口。
  • BeanFactoryApplicationContext 的区别:
    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多例的
requestWEB项目中,Spring创建一个Bean的对象,将对象存入到request域中
sessionWEB项目中,Spring创建一个Bean的对象,将对象存入到session域中
global sessionWEB项目中,在Portlet环境
Column 1Column 2
  • 更改作用域的方法
//scope属性:singleton:单例 ;prototype:非单例
<bean id=”beanId” class=”BeanClassName” scope=”prototype”></bean>

Bean的生命周期

  • 单例对象: 一个应用只有一个对象的实例。它的作用范围就是整个引用。
    • 生命周期
      1. 生:当应用加载,创建容器时,对象就被创建了。
      2. 活:只要容器在,对象一直活着。
      3. 死:当应用卸载,销毁容器时,对象就被销毁了。
  • 多例对象:每次访问对象时,都会重新创建对象实例。
    • 生命周期
      1. 生:当使用对象时,创建新的对象实例。
      2. 活:只要对象在使用中,就一直活着。
      3. 死:当对象长时间不用时,被 java 的垃圾回收器回收了。
  • 监听
    • init-method
      初始化回调方法名,配置的方法必须由bean对象提供
    • destroy-method
      销毁回调方法名,配置的方法必须由bean对象提供

三、依赖注入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_复杂对象注入

  1. 通过sqlsessionfactory创建sqlsession对象
  2. 扫描注解@Bean通过sqlsession交给spring
  3. spring工厂创建的DogFood对象
  4. Spring注射器注入对象
sqlsession交给spring
注入
sqlsessionfactory创建sqlsession对象
spring工厂创建的DogFood对象
Spring注射器
Food对象
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值