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接口
package com
.rick
.factorybean
;
import org
.springframework
.beans
.factory
.FactoryBean
;
import java
.sql
.Connection
;
import java
.sql
.DriverManager
;
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&useUnicode=true&characterEncoding=UTF-8=UTF-8&"/>
<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. 整合遗留的代码
package com
.rick
.factory
;
import java
.sql
.Connection
;
import java
.sql
.DriverManager
;
import java
.sql
.SQLException
;
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();
对象生命周期的总结