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教程后做的笔记。持续更新…