Spring IOC 工厂【三】复杂对象、控制Spring工厂创建对象的次数、对象的生命周期

    技术2024-11-07  8

    Spring IOC 工厂【三】复杂对象、控制Spring工厂创建对象的次数、对象的生命周期

    复杂对象1、什么是复杂对象2、Spring创建复杂对象的3种方式FactoryBean接口1、实现FactoryBean接口2、Spring配置文件的配置3、细节4、FactoryBean实现原理的简单分析5、FactoryBean接口总结 实例工厂好处 静态工厂 3、Spring工厂创建对象总结 控制Spring工厂创建对象的次数1、控制简单对象的创建次数2、控制复杂对象的创建次数3、为什么要控制对象的创建次数 对象的生命周期1、什么是对象的生命周期2、为什么要学习对象的生命周期3、生命周期的3个阶段创建阶段初始化阶段两种定义初始化方法注意 销毁阶段两种定义销毁方法注意 对象生命周期的总结

    复杂对象

    1、什么是复杂对象

    复杂对象:指的就是不能直接通过new()构造方法创建关键的对象 Connection SqlSession

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

    FactoryBean接口

    1、实现FactoryBean接口

    //ConnecntionFactoryBean.java package com.rick.factorybean; import org.springframework.beans.factory.FactoryBean; import java.sql.Connection; import java.sql.DriverManager; /** * @author Rick * @crate 2020-07-03 21:11 */ public class ConnecntionFactoryBean implements FactoryBean<Connection> { @Override public Connection getObject() throws Exception { Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test","root","123"); return conn; } @Override public Class<?> getObjectType() { return Connection.class; } @Override public boolean isSingleton() { return false; } }

    2、Spring配置文件的配置

    #如果class中指定的类型是FactoryBean接口的实现类,那么通过ID值获得的是这个类所创建的复杂对象 Connection <bean id="conn" class="com.rick.factorybean.ConnectionFactoryBean"/>

    3、细节

    1. 获得FactoryBean类型的对象 加上&即可 ctx.getBean("&conn"); 2. isSinglethon方法 return ture:只会创建一个复杂对象 return false:每次都创建建一个新的复杂对象 小结:根据对象的特点决定返回true or false 3. 依赖注入的体会(DJ) 把ConnectionFactoryBean中以来的4个字符串,通过配置文件注入 好处: 解耦合 <bean id="conn" class="com.rick.factorybean.ConnecntionFactoryBean"> <property name="dirverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhostL3306/test?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=UTF-8=UTF-8&amp;"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean>

    4、FactoryBean实现原理的简单分析

    接口回调 1. 通过bean标签的id"conn"标签获得ConnectionFactoryBean类对象,进而通过instanceof判断出是否为FactoryBean接口的实现类 2. Spring按照规定 getObject() ----> Connection

    5、FactoryBean接口总结

    Spring中用于创建复杂对象的一种方式,也是Spring原生提供的,后续Spring整合其他框架时将会大量应用FactoryBean(MyBatis、MongoDB等)

    实例工厂

    好处

    1. 避免Spring框架的侵入 2. 整合遗留的代码 //--------------------遗留的ConnectionFactory.java package com.rick.factory; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * @author Rick * @crate 2020-07-03 22:32 */ public class ConnectionFactory { public Connection getConnection() { Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC&userUnicode=true&characterEncoding=UTF-8", "root", "123"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException throwables) { throwables.printStackTrace(); } return conn; } } #整合,通过配置applicationContext.xml文件即可 <bean id="connFactory" class="com.rick.factory.Connection Factory"/> <bean id="conn" factory-bean="connFactory" factory-method="getConnection"/>

    静态工厂

    1. 避免Spring框架的侵入 2. 整合遗留的代码 <bean id="conn" class="com.rick.factory.StaticConnectionFactory" factory-method="getConnection"/>

    3、Spring工厂创建对象总结

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

    1、控制简单对象的创建次数

    在<bean>标签中添加scope属性,设置相应的值即可: sigleton:只会创建一次(默认值) prototype:每一次创建都会创建新的对象

    2、控制复杂对象的创建次数

    FactoryBean实现类: s设置isSingleton()的返回值即可 true:一次 false:每次创建时都创建新的对象 非FactoryBean实现类: 在<bean>标签中添加scope属性,设置相应的值即可

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

    1. 好处 节省不必要的内存浪费 2. 什么样的对象只创建一次? SqlSessionFactory DAO Service(无状态) 3. 什么样的对象需要每次创建时新的对象 Connection SqlSession/Session Struts2: Action

    对象的生命周期

    1、什么是对象的生命周期

    指的是一个对象创建、消亡的一个完整过程

    2、为什么要学习对象的生命周期

    对象由Spring负责对象的创建、存活、销毁,了解其生命周期,有利于我们使用后Spring为我们创建的对象

    3、生命周期的3个阶段

    创建阶段

    Spring工厂何时创建对象

    scope = “singleton”

    Spring工厂创建的同时,对象创建 若在单例模式下,不想Spring工厂创建的同时创建对象,想在获取对象的同时获创建对象,只需在相应的标签中添加lazy-init属性并设置其值为true即可

    scope = “prototype”

    Spring工厂会在获取对象时的同时,创建对象

    ​ ctx.getBean(“user”);

    初始化阶段

    Spring工厂在创建完对象后,调用对象的初始化方法,完成的对象的初始化操作

    1. 初始化方法的提供 由程序员根据需求,提供相应的初始化方法,最终完成初始化操作 2. 初始化方法的调用 Spring工厂进行调用

    两种定义初始化方法

    实现initializingBean接口

    public void afterPropertiesSet(){ }

    在对象中定义一个普通的初始化方法,并编写配置文件

    public void myInit(){ } <bean id="person" class="com.rick.domain.Person" init-method="myInit"/>

    注意

    1. 若一个对象既实现了initializingBean()接口的同时又提供了普通的初始化方法,则执行顺序为: InitializingBean(优先) 普通初始化方法(较后) 2. 注入一定发生在初始化操作的前面 3. 什么时候初始化操作 资源的初始化:数据库、IO、网络......

    销毁阶段

    Spring销毁对象前,会调用对象的销毁方法,完成销毁操作

    1. Spring什么时候销毁所创建的对象 ctx.close(); 2. 销毁方法: 程序员根据需求,定义销毁方法,完成销毁操作 调用: Spring工厂调用

    两种定义销毁方法

    实现DisposableBean接口

    public void destory()throws Exception(){ }

    在对象中定义一个普通的销毁方法,并编写配置文件

    public void myDestory()throws Exception(){ } <bean id="person" class="com.rick.domain.Person" init-method="myInit" destory-method="myDestory"/>

    注意

    1. 销毁方法只适用于scope = "singleton" 2. 什么叫做销毁操作 主要指资源的释放操作 io.close(); connection.close();

    对象生命周期的总结

    Processed: 0.064, SQL: 9