Spring工厂创建复杂对象【Spring学习笔记五】

323 阅读2分钟

微信截图_20211101092848.png

1、什么是复杂对象

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

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

2.1、FactoryBean接口

  • 开发步骤

    • 实现FactoryBean接口

微信截图_20211101093030.png

  • Spring配置文件的配置

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

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

    • isSingleton方法返回true只会创建一个复杂对象

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

    • 依赖注入的体会(DI)

      把ConnectionFactoryBean中依赖的4个字符串信息 ,进⾏配置⽂件的注⼊
      好处:解耦合
      <bean id="conn" class="cn.njtech.edu.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
    

微信截图_20211101093705.png

  • FactoryBean总结

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

2.2、实例工厂

1. 避免Spring框架入侵
2. 整合遗留系统
  • 开发步骤
<bean id="connFactory" class="cn.edu.njtech.factorybean.ConnectionFactory"></bean>

<bean id="conn" factory-bean="connFactory" factorymethod="getConnection"/>

2.3、静态工厂

  • 开发步骤

    <bean id="conn" class="cn.edu.njtech.factorybean.StaticConnectionFactory" factorymethod="getConnection"/>
    

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

微信截图_20211102102307.png

4、控制Spring工厂创建对象的次数

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

好处: 节省不必要的内存浪费
  • 什么样的对象只创建一次?

    1. SqlSessionFactory
    2. DAO
    3. Service
    
  • 什么样的对象 每一次都要创建新的?

    1. Connection
    2. SqlSession | Session
    3. Struct2 Action
    

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

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

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

FactoryBean{
    isSingleton(){
        return true 只会创建⼀次
        return false 每⼀次都会创建新的
    }
}
如没有isSingleton⽅法 还是通过scope属性 进⾏对象创建次数的控制