7.反转控制 与 依赖注入
1.反转控制
控制: 对于成员变量赋值的控制权
反转控制:把成员变量的赋值,从代码中反转(转移)到spring的配置文件中完成
好处:解耦合
底层实现原理:工厂设计模式
2.依赖注入
注入: 通过spring工厂或配置文件,为对象(bean,组件)的成员变来个就行注入
依赖注入:当一个类需要另一个类时,就意味着依赖,如果出现了依赖,就可以把另一个类作为本类的成员变量,最终通过spring哦配置文件进行注入(赋值)
好处: 解耦合
8.spring工厂创建复杂对象
1.什么是复杂对象
复杂对象:指的就是不能通过直接new的方式创建的对象
Connection
SqlSessionFactory
2.spring工厂创建复杂对象的三种方式
2.1 FactoryBean接口
开发步骤
- 实现FactoryBean接口
注意:如果创建的对象时FactoryBean的实现类,那么创建的对象是复杂对象
<bean id="conn" class="xxx.ConnectionFactoryBean"/>
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. 为什么Spring规定实现FactoryBean接口,并且把创建复杂对象的步骤写在getObject()中?
2. 为什么使用ctx.getBean("conn")获得的是复杂connection对象,而没有获得ConnectionFactoryBean(&)
spring内部运行及流程
1. 通过conn获得ConnectionFactoryBean类的对象,然后通过instanceof方法来判断是不是FactoryBean接口的实现类
2. 按照接口规定,spring调用getBean,创建Connect对象
3. 返回Connect
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