1、什么是复杂对象
复杂对象:指的就是不能直接通过new构造⽅法创建的对象
Connection
SqlSessionFactory
2、Spring工厂创建复杂对象的3种方式
2.1、FactoryBean接口
-
开发步骤
- 实现FactoryBean接口
-
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
-
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工厂创建对象的总结
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属性 进⾏对象创建次数的控制