复杂对象:不能直接通过 new 构造方法创建的对象
Spring创建复杂对象的三种方式:
- FactoryBean 接口
- 实例工厂
- 静态工厂
FactoryBean 接口
1、实现 FactoryBean 接口
public class MyFactoryBean implements FactoryBean {@Overridepublic Object getObject() throws Exception {// 用于书写创建复杂对象的代码并把复杂对象作为方法的返回值返回return null;}@Overridepublic Class<?> getObjectType() {// 返回所创建复杂对象的Class对象return null;}@Overridepublic 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"/>
