Spring-第八章、Spring工厂创建复杂对象

在这里插入图片描述

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"/>

3.Spring工厂创建对象的总结

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_47298981/article/details/107578810