1.什么是复杂对象
复杂对象:指的就是不能直接通过new构造方法创建的对象
Connection
SqlSessionFactory
2.Spring工厂创建复杂对象的三种方法
2.1FactoryBean接口
- 开发步骤
实现FactoryBean接口
public class ConnectionFactoryBean implements FactoryBean<Connection> {
@Override
public Connection getObject() throws Exception {
/*用于书写创建复杂对象的代码*/
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day04", "root", "root");
return conn;
}
@Override
public Class<?> getObjectType() {
return Connection.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
Spring配置文件的配置
如果class中指定的类型是FactoryBean接口的实现类,那么通过id值获取的是这个类所创建的复杂对象 Connection
<bean id="conn"
class="factorybean.ConnectionFactoryBean"/>
- 细节
(1) 如果就想获得FactoryBean类型的对象ctx.getBean("&conn") 获得就是ConnectionFactoryBean对
象
(2) isSingleton⽅法 返回 true 只会创建⼀个复杂对象
返回 false 每⼀次都会创建新的对象 问题:根据这个对象的特点 ,决定是返回true
(SqlSessionFactory) 还是 false (Connection)
(3) mysql⾼版本连接创建时,需要制定SSL证书,解决问题的⽅式
url = "jdbc:mysql://localhost:3306/suns?useSSL=false"
(4)依赖注入的体会(DI)
把ConnectionFactoryBean中依赖的4个字符串信息,进行配置文件的注入
好处:解耦合
<bean id="conn"
class="com.baizhiedu.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总结
FactoryBean总结
Spring中用于创建复杂对象的一种方式,也是Spring原生提供的,后续讲解Spring整合其他框架,大量应用FactoryBean
2.2实例工厂
1.避免Spring框架的入侵
2.整合遗留系统
- 开发步骤
<bean id="connFactory"
class="com.baizhiedu.factorybean.ConnectionFactory"></bean>
<bean id="conn" factory-bean="connFactory" factorymethod="getConnection"/>
2.3静态工厂
- 开发步骤
<bean id="conn"
class="com.baizhiedu.factorybean.StaticConnectionFactory"
factorymethod="getConnection"/>