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

在这里插入图片描述

1.什么是复杂对象

1.复杂对象:指的就是不能直接通过new构造⽅法创建的对象
 Connection
 SqlSessionFactory

2.Spring⼯⼚创建复杂对象的3种⽅式

2.1FactoryBean接口

开发步骤:

1.实现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/suns","root","123456");
        return conn;//返回连接对象
    }
    @Override
    public Class<?> getObjectType() {
        //返回连接对象的class
        return Connection.class;
    }
    @Override
    public boolean isSingleton() {
        return false;
    }
}

2.Spring配置文件的配置

如果Class中指定的类型是FactoryBean接⼝的实现类,那么通过
id值获得的 是这个类所创建的复杂对象 Connection
简而言之 这个对象就是 实现接口方法的 public Connection getObject() 所返回的对象
<bean id="conn" class="com.dy.factorybean.ConnectionFactoryBean"/>

在这里插入图片描述

细节:

1.如果就想获得FactoryBean类型的对象 在id前加个&符号       ctx.getBean("&conn") 获得就是类ConnectionFactoryBean的对象。
2.isSingleton⽅法 返回 true 只会创建⼀个复杂对象	返回 false 每⼀次都会创建新的对象。
3.问题:根据这个对象的特点 ,决定是返回 true (SqlSessionFactory:mybatis中的工厂对象 重量级资源是线程安全的---可以被共用),还是 false (Connection---连接对象不能被共用:如果两个conn共用一个对象,在mysql中事务2用完了提交,假如这时候事务1还没完成,事务2提交了连接对象就会出现错误。)
4.mysql⾼版本(8以上)连接创建时,需要制定SSL证书,解决问题的⽅式	url ="jdbc:mysql://localhost:3306/suns?useSSL=false" 
5.依赖注⼊的体会(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>

3.FactoryBean的实现原理[简易版]

接口回调
1. 为什么Spring规定FactoryBean接⼝ 实现 并且 getObject()?
2. 为什么ctx.getBean("conn") 获得是复杂对象 Connection ⽽没有获得实现类 ConnectionFactoryBean 的对象
原因:
Spring内部运⾏流程
1. 通过conn获得ConnectionFactoryBean类的对象 ,进⽽通过instanceof 判断出是FactoryBean接⼝的实现类
    public class ConnectionFactoryBean implements FactoryBean<Connection> {}
2. Spring按照规定 getObject() --->Connection
3. 返回Connection 

在这里插入图片描述

4.FactoryBean总结

Spring中⽤于创建复杂对象的⼀种⽅式,也是Spring原⽣提供的,后续讲解Spring整合其他框架(mybatis、Redis),⼤量应用FactoryBean

2.2实例工厂

1.避免Spring框架的侵⼊
//如果要用FactoryBean的话 必须实现FactoryBean接口,以后要是离开Spring的话那个ConnectionFactoryBean就没有意义了,没有人提供FactoryBean了。
2.整合遗留系统

开发步骤:

//步骤1 :自定义一个工厂类
public class ConnectionFactory {
    public Connection getConnection() {//实例方法
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/suns", "root", "123456");
        } catch (Exception e) {
            e.printStackTrace();
        }
            return  conn;//返回连接对象
    }
}
//步骤2: 配置文件
<bean id="connFactory"class="com.baizhiedu.factorybean.ConnectionFactory"></bean>
   
<bean id="conn" factory-bean="connFactory" factory-method="getConnection"/>

2.3静态工厂

开发步骤:

//步骤1 :自定义一个工厂类
public class StaticConnectionFactory {
    public  static Connection getConnection(){//静态方法
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/suns", "root", "123456");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  conn;
    }
}
//步骤2: 配置文件
<bean id="conn"class="com.baizhiedu.factorybean.StaticConnectionFactory"     
    factory-method="getConnection"/>
    //实例工厂需要先创建工厂对象,之后再指定工厂类中的方法,返回连接对象。而静态工厂不需要创建对象,此时只需要直接指定工厂方法就行了。

3.Spring⼯⼚创建对象的总结

在这里插入图片描述

本系列文章从Spring5原理开始深入浅出,从工厂特性=>依赖注入–IOC=>AOP编程=>Spring事务=>纯注解开发。本文来自观看B站孙帅Spring教程后做的笔记。持续更新…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值