首页 > 其他分享 >Spring5学习随笔-IOC(反转控制)、DI(依赖注入)和创建复杂对象

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

时间:2023-11-16 12:12:28浏览次数:41  
标签:DI 对象 Spring 工厂 Connection FactoryBean 创建 IOC Spring5

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

第七章、反转控制与依赖注入

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

  1. 控制:对于成员变量赋值的控制权

  2. 反转控制:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring工厂和配置文件中。

    好处:解耦合

  3. 底层实现:工厂设计模式

如果对工厂设计模式不熟悉,可以看看前面的从简单工厂到通用工厂的笔记:Spring5的基本介绍、工厂设计模式

2.依赖注入(Dependency Injection Di)

  1. 注入:通过Spring的工厂及配置文件,为对象(bean、组件)的成员变量赋值

  2. 依赖注入:当一个类需要另一个类时,就意味着依赖,一旦出现依赖,就可以把另一个类作为本类的成员变量,最终通过Spring配置文件进行注入(赋值)

    好处:解耦和

第八章、Spring工厂创建复杂对象

1.什么是复杂对象

  1. 复杂对象:指的就是不能直接通过new构造方法创建的对象(Connection,SqlSessionFactory)

2.Spring工厂创建复杂对象的3种方式

2.1 FactoryBean接口

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

  • 开发步骤

    • 实现FactoryBean接口

    • Spring配置文件的配置

      如果Class中指定的类型 是FactoryBean接口的实现类,那么通过id获取的是这个类所创建的复杂对象。

      class虽然指向ConnectionFactoryBean,但是ctx.getBean("conn")获取的是Connection复杂对象。

      <bean id=”conn” class=”com.baizhi.factorybean.ConnectionFactoryBean”/>

  • 细节

    • 如果只想获得FactoryBean类型的对象

      ConnectionFactoryBean conn = (ConnectionFactoryBean) ctx.getBean("&conn"); getBean的参数加上“&”

    • isSingleton方法

      返回true只会创建一个复杂对象

      返回false每一次都会创建新的对象

      问题:怎么选择? 根据这个对象的特点,决定是返回true还是false

    • mysql高版本连接创建时,需要指定ssl证书,在连接数据库的url参数加上 useSSL=false即可解决。

    • 依赖注入的体会

      1. 把Connection Factory Bean中依赖的4个字符串信息,进行配置文件的注入

        好处:解耦合

        <bean id="conn" class="com.baizhi.factorybean.ConnectionFactoryBean">
            <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的实现原理(简易版)

    1. 接口回调
    2. 为什么Spring规定FactoryBean接口 实现 并且 getObject()?
    3. 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框架的侵入

    implements FactoryBean(是spring提供的,离开了FactoryBean,没有能代替)

  2. 整合遗留系统(去到公司后,往往是整合遗留下来的代码)

  • 开发步骤
<!-- 2.获取复杂对象 通过实例工厂-->
<bean id="connFactory" class="com.baizhi.factorybean.ConnectionFactory"/>
<bean id="conn" factory-bean="connFactory" factory-method="getConnection"/>

2.3 静态工厂

  • 开发步骤
<!--3. 获取复杂对象 通过静态工厂-->
<bean id="conn" class="xxx.StaticConnectionFactory" factory-method="getConnection"/>

3.Spring工厂创建对象的总结

第九章、控制Spring工厂创建对象的次数

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

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

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

FactoryBean{
	isSingleton(){
		return true 只会创建一次
		return false 每一次创建新的
	}
}
如没有isSingleton方法 还是通过scope控制次数

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

  • 好处:节省不必要的内存浪费(对象创建多次,内存会浪费掉)
  • 什么样的对象只创建一次
    1. SqlSessionFactory
    2. DAO
    3. Service
  • 什么样的对象每次都要创建新的
    1. Connection
    2. SqlSession | Session

标签:DI,对象,Spring,工厂,Connection,FactoryBean,创建,IOC,Spring5
From: https://www.cnblogs.com/eyewink/p/17835950.html

相关文章

  • Redis 缓存与数据库数据不一致问题
    Redis缓存与数据库数据不一致问题是指在使用Redis作为缓存系统时,由于缓存和数据库之间的操作没有同步或处理不当,导致缓存中的数据与数据库中的数据不同步,产生数据不一致的情况。现象:数据库更新后,缓存未更新,导致缓存中的数据是旧的。缓存脏读,即缓存中的数据被更新,而数据库中的数据未......
  • fatal error: bzlib.h: No such file or directory
     001、make编译报错:fatalerror:bzlib.h:Nosuchfileordirectory 002、查找相关的安装包(base)[[email protected]]#yumsearchbzip2 003、安装相关包(base)[[email protected]]#yuminstallbzip2-devel*-y##安装相关包 0......
  • 若依vue启动报Error: error:0308010C:digital envelope routines::unsupported
    解决:若依vue启动报Error:error:0308010C:digitalenveloperoutines::unsupported1.描述:问题产生原因是因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.解决方法:有很多种,我把适合我的写在第一......
  • 8、Flutter Paddiing组件
    Padding组件处理容器与子元素之间的间距。 classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContextcontext){returnContainer(padding:constEdgeInsets.all(20),child:constIcon(Icons.abc_o......
  • nodejs "Client does not support authentication protocol requested by server; con
    登录mysql输入以下命令:--选择mysql数据库:usemysql--laremehpe是登录用户名ALTERUSER'laremehpe'@'localhost'IDENTIFIEDBY'password'PASSWORDEXPIRENEVER;--laremehpe->用户名,123456->密码ALTERUSER'laremehpe'@'localhos......
  • Linux下redis的安装下载以及连接RESP
    一、环境Centos7、redis-6.2.6、gcc依赖、管理员权限将防火墙放通6379/tcp端口或直接关闭防火墙二、安装具体步骤1.安装依赖redis是由C语言开发,因此安装之前必须要确保服务器已经安装了gcc,可以通过如下命令查看机器是否安装:gcc-v如果没有安装则通过以下命令安装:yumins......
  • mendix 连接默认数据库改为mss sql
    mendix支持的默认msssql数据库为2019/2022+先下载连接驱动jdbchttps://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15.当提示"The"Encrypt"propertyissetto"true"andthe"trust......
  • 简单例子理解 Qt 中 QObject: Cannot create children for a parent that is in a dif
    c++guiprogrammingwithqt中关于QThread的用法的限制下面这句话的翻译不清QObjectisreentrant,buttherearethreeconstraintstokeepinmind:ChildQObjectsmustbecreatedintheirparent'sthread.Inparticular,thismeansthattheobjectscreatedina......
  • Linux 部署 Swagger Editor 接口文档并且实现远程访问教程
    SwaggerEditor是一个用于编写OpenAPI规范的开源编辑器。它提供了一个可视化的界面,使得用户可以更加方便地编写和管理API文档。SwaggerEditor远程访问的好处是您可以随时随地访问和编辑您的SwaggerAPI文档,而不需要在本地安装Swagger编辑器。此外还可以轻松地与团队成员共......
  • 最新版本的AndroidStudio新建Android项目时设置语言为java
    我们之前用AndroidStudio新建项目时是这样的 选择EmptyActivity,下一步 怎么没了语言选项了,java呢?改为EmptyViewsActivity这个就好了 ......