Spring学习 反转控制 与 依赖注⼊

1、 反转(转移)控制(IOC Inverse of Control)

1、控制:对于成员变量赋值的控制权
2、反转控制:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring⼯⼚和配置⽂件中完成
3、 好处:解耦合
4、底层实现:⼯⼚设计模式
在这里插入图片描述

2、 依赖注⼊ (Dependency Injection DI)

1、注⼊:通过Spring的⼯⼚及配置⽂件,为对象(bean,组件)的成员变量赋值
2、依赖注⼊:当⼀个类需要另⼀个类时,就意味着依赖,⼀旦出现依赖,就可以把另⼀个类作为本类的成员变量,最终通过Spring配置⽂件进⾏注⼊(赋值)。
3、 好处:解耦合
在这里插入图片描述

3、Spring⼯⼚创建复杂对象

在这里插入图片描述

1、 什么是复杂对象

复杂对象:指的就是不能直接通过new构造⽅法创建的对象
比如: Connection、 SqlSessionFactory

2、Spring⼯⼚创建复杂对象的3种⽅式

2.1 FactoryBean接⼝

开发步骤
实现FactoryBean接⼝
在这里插入图片描述Spring配置⽂件的配置

# 如果Class中指定的类型 是FactoryBean接⼝的实现类,那么通过id值获得的是这个类所创建的复杂对象Connection
<bean id="conn" class="com.baizhiedu.factorybean.ConnectionFactoryBean"/>

细节
如果就想获得FactoryBean类型的对象ctx.getBean("&conn") 获得就是ConnectionFactoryBean对象

isSingleton⽅法 返回 true 只会创建⼀个复杂对象
返回 false 每⼀次都会创建新的对象 
问题:根据这个对象的特点 ,决定是返回true(SqlSessionFactory) 还是 false (Connection)


mysql⾼版本连接创建时,需要制定SSL证书,

解决问题的⽅式
url ="jdbc:mysql://localhost:3306/suns?useSSL=false"


依赖注⼊的体会(DI)

把ConnectionFactoryBean中依赖的4个字符串信息 ,进⾏配置⽂件的注⼊
好处:解耦合
<bean id="conn" class="com.baizhiedu.factorybean.ConnectionFactoryBean">
 <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
 <property name="url" value="jdbc:mysql://localhost:3306/suns?useSSL=false"/>
 <property name="username" value="root"/>
 <property name="password" value="123456"/>
</bean>

FactoryBean的实现原理[简易版]

接⼝回调
1. 为什么Spring规定FactoryBean接⼝实现 并且 getObject()?
2. ctx.getBean("conn") 获得是复杂对象 Connection ⽽没有 获得ConnectionFactoryBean(&)

Spring内部运⾏流程
1. 通过conn获得ConnectionFactoryBean类的对象 ,进⽽通过instanceof 判断出是FactoryBean接⼝的实现类
2. Spring按照规定 getObject() --->Connection
3. 返回Connection

在这里插入图片描述

FactoryBean总结

Spring中⽤于创建复杂对象的⼀种⽅式,也是Spring原⽣提供的,后续讲解Spring整
合其他框架,⼤量应⽤FactoryBean

2.2 实例⼯⼚

  1. 避免Spring框架的侵⼊
  2. 整合遗留系统

开发步骤

<bean id="connFactory"  class="com.baizhiedu.factorybean.ConnectionFactory"></bean>
<bean id="conn" factorybean="connFactory" factorymethod="getConnection"/>

2.3 静态⼯⼚

开发步骤

<bean id="conn" class="com.baizhiedu.factorybean.StaticConnectionFactory" factorymethod="getConnection"/>

在这里插入图片描述

4、控制Spring⼯⼚创建对象的次数

1、如何控制简单对象的创建次数

<bean id="account" scope="singleton|prototype"  class="xxxx.Account"/>
sigleton:只会创建⼀次简单对象 默认值
prototype:每⼀次都会创建新的对象

2、如何控制复杂对象的创建次数

FactoryBean{
    isSingleton(){
       return true 只会创建⼀次
      return false 每⼀次都会创建新的
 }
}

如没有isSingleton⽅法 还是通过scope属
性 进⾏对象创建次数的控制

3、为什么要控制对象的创建次数?

好处:节省不别要的内存浪费

什么样的对象只创建⼀次?

  1. SqlSessionFactory
  2. DAO
  3. Service

什么样的对象 每⼀次都要创建新的?

  1. Connection
  2. SqlSession | Session
  3. Struts2 Action
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章