Spring框架学习(三):Spring工厂复杂对象的创建与创建次数的控制

7.反转控制 与 依赖注入

1.反转控制
控制: 对于成员变量赋值的控制权
反转控制:把成员变量的赋值,从代码中反转(转移)到spring的配置文件中完成
	好处:解耦合
底层实现原理:工厂设计模式
2.依赖注入
注入: 通过spring工厂或配置文件,为对象(bean,组件)的成员变来个就行注入
依赖注入:当一个类需要另一个类时,就意味着依赖,如果出现了依赖,就可以把另一个类作为本类的成员变量,最终通过spring哦配置文件进行注入(赋值)
	好处: 解耦合

在这里插入图片描述

8.spring工厂创建复杂对象

1.什么是复杂对象
复杂对象:指的就是不能通过直接new的方式创建的对象
Connection
SqlSessionFactory

在这里插入图片描述

2.spring工厂创建复杂对象的三种方式
2.1 FactoryBean接口

​ 开发步骤

  1. 实现FactoryBean接口

在这里插入图片描述

  1. spring配置文件进行配置
注意:如果创建的对象时FactoryBean的实现类,那么创建的对象是复杂对象
<bean id="conn" class="xxx.ConnectionFactoryBean"/>
  1. 细节
1. 如果想获取FactoryBean类型的对象 ctx.getBean("&conn");
	获得的就是ConnectionFactoryBean对象
2. isSiongleton方法
	true:只会创建一个复杂对象
	false:每次都会创建新对象
	根据实际问题进行判断返回true还是false
3. MySQL高版本在创建连接时,需要指定SSL证书,解决问题的方式
	url="jdbc:mysql://localhost:3306/stu?useSSL=false"
4. 依赖注入的体会
	可以把ConnectionFactoryBean中的4个字符串信息,进行配置文件的注入
	    <bean id="conn" class="com.xxc.factorybean.ConnectionFactoryBean"
        p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/stu?useSSL=false"
        p:userName="root" p:password="123456"/>
  1. FactoryBean实现原理(简易)
接口回调
1. 为什么Spring规定实现FactoryBean接口,并且把创建复杂对象的步骤写在getObject()中?
2. 为什么使用ctx.getBean("conn")获得的是复杂connection对象,而没有获得ConnectionFactoryBean(&)

spring内部运行及流程
1. 通过conn获得ConnectionFactoryBean类的对象,然后通过instanceof方法来判断是不是FactoryBean接口的实现类
2. 按照接口规定,spring调用getBean,创建Connect对象
3. 返回Connect

在这里插入图片描述

  1. FactoryBean总结
spring中用于创建复杂对象的一种方式,也是spring原生提供的,后续在spring整合其他框架时,大量应用FactoryBean
2.2 实例工厂
1. 避免spring框架的侵入(实现FactoryBean接口)
2. 整合遗留系统

开发步骤

    <bean id="connectFactory" class="com.xxc.factorybean.ConnectionFactory"/>
    <bean id="conn1" factory-bean="connectFactory" factory-method="getConnection"/>
2.3 静态工厂

开发步骤

<bean id="conn2" class="com.xxc.factorybean.StaticConnectionFactory" factory-method="getConnection"/>
3.Spring工厂创建对象的总结

在这里插入图片描述

9.控制spring工厂创建对象的次数

1. 如何控制简单对象创建次数
<bean id="account" class="xxx/Account" scope="singleton"/>
singleton: 只会创建一次简单对象(默认)
prototype: 每次都会创建新对象
2. 如何控制复杂对象创建次数
public xxx implement FactoryBean{
    isSingleton(){
        return true;//只创建一次
        return false;//每次都会创建新的对象
    }
}
如果没有isSingleton方法,那么就还是通过 scope 属性进行控制对象创建次数
3. 为什么要控制对象的创建次数
好处: 节省不必要的内存浪费
  • 什么样的对象只创建一次?
1. SqlSessionFactory
2. DAO
3. Service
  • 什么样的对象每次都需要创建?
1. Connect
2. Sqlsession | Session
3. Struts中的 Action
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值