用户国营 发表于 2023-12-22 06:58:32

Spring5学习随笔-IOC(反转控制)、DI(依赖注入)和创建复杂对象

学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】
第七章、反转控制与依赖注入

1.反转(转移)控制(IOC inverse of Control)


[*]控制:对于成员变量赋值的控制权
[*]反转控制:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring工厂和配置文件中。
好处:解耦合
[*]底层实现:工厂设计模式
如果对工厂设计模式不熟悉,可以看看前面的从简单工厂到通用工厂的笔记:Spring5的基本介绍、工厂设计模式
https://img2023.cnblogs.com/blog/3321544/202311/3321544-20231116115543653-1689026322.png
2.依赖注入(Dependency Injection Di)


[*]注入:通过Spring的工厂及配置文件,为对象(bean、组件)的成员变量赋值
[*]依赖注入:当一个类需要另一个类时,就意味着依赖,一旦出现依赖,就可以把另一个类作为本类的成员变量,最终通过Spring配置文件进行注入(赋值)
好处:解耦和
https://img2023.cnblogs.com/blog/3321544/202311/3321544-20231116115638048-601654190.png
第八章、Spring工厂创建复杂对象

https://img2023.cnblogs.com/blog/3321544/202311/3321544-20231116115645571-45450659.png
1.什么是复杂对象


[*]复杂对象:指的就是不能直接通过new构造方法创建的对象(Connection,SqlSessionFactory)
2.Spring工厂创建复杂对象的3种方式

2.1 FactoryBean接口

FactoryBean是Spring原生提供给我们创建复杂对象的方式,同时也是spring中一个非常重要的机制

[*]开发步骤

[*]实现FactoryBean接口
https://img2023.cnblogs.com/blog/3321544/202311/3321544-20231116115729350-657031475.png

[*]Spring配置文件的配置
如果Class中指定的类型 是FactoryBean接口的实现类,那么通过id获取的是这个类所创建的复杂对象。
class虽然指向ConnectionFactoryBean,但是ctx.getBean("conn")获取的是Connection复杂对象。


[*]细节

[*]如果只想获得FactoryBean类型的对象
ConnectionFactoryBean conn = (ConnectionFactoryBean) ctx.getBean("&conn"); getBean的参数加上“&”
[*]isSingleton方法
返回true只会创建一个复杂对象
返回false每一次都会创建新的对象
问题:怎么选择? 根据这个对象的特点,决定是返回true还是false
[*]mysql高版本连接创建时,需要指定ssl证书,在连接数据库的url参数加上 useSSL=false即可解决。
[*]依赖注入的体会

[*]把Connection Factory Bean中依赖的4个字符串信息,进行配置文件的注入
好处:解耦合
<bean id="conn" >
    <property name="driveClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/myschool?useSSL=false"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>


[*]FactoryBean的实现原理(简易版)

[*]接口回调
[*]为什么Spring规定FactoryBean接口 实现 并且 getObject()?
[*]ctx.getBean(”conn”)获得是复杂对象 Connection,而没有获得ConnectionFactoryBean(&)

Spring内部运行流程

[*]通过conn获取ConnectionFactoryBean类的对象,进而通过instanceof判断是FactoryBean接口的实现类
[*]Spring按照规定执行 getObject() ——>Connection
[*]返回Connection
https://img2023.cnblogs.com/blog/3321544/202311/3321544-20231116115759000-1733333091.png

[*]FactoryBean总结
Spring中用于创建复杂对象的一种方式,也是Spring原生提供的,后续讲解Spring整合其他框架,会大量应用FactoryBean。
2.2 实例工厂


[*]避免Spring框架的侵入
implements FactoryBean(是spring提供的,离开了FactoryBean,没有能代替)
[*]整合遗留系统(去到公司后,往往是整合遗留下来的代码)


[*]开发步骤
2.3 静态工厂


[*]开发步骤
3.Spring工厂创建对象的总结

https://img2023.cnblogs.com/blog/3321544/202311/3321544-20231116115815197-1029108565.png
第九章、控制Spring工厂创建对象的次数

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

<bean id="account" scope="singleton | prototype" ></bean>
singleton:只会创建一次简单对象 默认值
prototype:每一次都会创建新的对象2.如何控制复杂对象的创建次数

FactoryBean{
        isSingleton(){
                return true 只会创建一次
                return false 每一次创建新的
        }
}
如没有isSingleton方法 还是通过scope控制次数3.为什么要控制对象的创建次数?


[*]好处:节省不必要的内存浪费(对象创建多次,内存会浪费掉)
[*]什么样的对象只创建一次
[*]SqlSessionFactory
[*]DAO
[*]Service

[*]什么样的对象每次都要创建新的
[*]Connection
[*]SqlSession | Session


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Spring5学习随笔-IOC(反转控制)、DI(依赖注入)和创建复杂对象