复杂对象:不能直接通过 new 构造方法创建的对象
Spring创建复杂对象的三种方式:
- FactoryBean 接口
- 实例工厂
- 静态工厂
FactoryBean 接口
1、实现 FactoryBean 接口
public class MyFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
// 用于书写创建复杂对象的代码并把复杂对象作为方法的返回值返回
return null;
}
@Override
public Class<?> getObjectType() {
// 返回所创建复杂对象的Class对象
return null;
}
@Override
public boolean isSingleton() {
// 根据所创建对象是否为单例
return false;
}
}
**
2、Spring 文件的配置
<!-- 如果Class中的对象是 FactoryBean 的实现类,那么在 Spring 中通过 id 获得是这个类所创建得复杂对象 -->
<bean id="bean" class="com.example.MyFactoryBean"/>
注意事项:
- context.getBean(“bean”):获得的是 FactoryBean 创建的复杂对象
context.getBean(“&bean”):获得的是 FactoryBean 类型的对象 - isSingleton方法:返回true,为单例;返回 false,为多实例
使用:根据对象特性,决定是否单例- SqlSessionFactory(重量级资源),返回 true
- Connection(数据库连接),返回false
- 原理:反射 + 接口回调
- 通过conn获得ConnectionFactoryBean类的对象,进而通过instanceof判断出是FactoryBean的实现类
- Spring按照规定 getObject() -> Connection
- 返回Connection
实例工厂
实例工厂原因:
- 避免Spring工厂的侵入
- 整合遗留系统
步骤:
1、假设存在遗留的工厂类:
public class ConnectionFactory {
public Connection getConnection(){
Connection connection = null;
try{
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost/mp?useSSL=false",
"root",
"root");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return connection;
}
}
2、在Spring配置文件中进行配置:即正常的创建步骤
- 先创建工厂实例:ConnectionFactory factory = new ConnectionFactory();
- 再调用工厂方法:factory.getConnection()
<!-- 使用Spring管理工厂类 -->
<bean id="connectionFactory" class="top.songfang.ConnectionFactory"/>
<!-- 使用工厂类实例创建相应的bean -->
<bean id="connection" factory-bean="connectionFactory" factory-method="getConnection"/>
静态工厂
1、静态工厂
将上述的工厂类转换成 static ,因此在调用时直接可以使用工厂类名.工厂方法
调用,即ConnectionFactory.getConnection()
2、Spring配置文件:
<bean id="connection" class="top.songfang.ConnectionFactory" factory-method="getConnection"/>