Spring⼯⼚创建复杂对象3种方式
1. 什么是复杂对象
1.简单对象:
指的就是可以 直接通过new 构造方法创建对象
例如:
userDAO
User
2.复杂对象
指不能直接通过new 构造方法创建对象
例如:
Connection
SqlSesscionFactory
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?useSSL=false", "root", "123456");
return conn;
}
@Override
public Class<?> getObjectType() {
return Connection.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
2.Spring配置文件配置
## 如果Class中指定的类型 是FactoryBean接⼝的实现类,那么通过id值获得的是
这个类所创建的复杂对象 Connection
<bean id="conn" class="cn.antblog.factorybean.ConnectionFactoryBean"></bean>
注意:
- 如果想获取FactoryBean对象需要在获取对象的方法中加入("&");
- isSingleton 方法返回true之创建一个复杂对象,返回false,每次都会创建一个复杂对象。根据这个特点,决定是返回true(SqlSessionFactory) 还是 false (Connection)。
- FactoryBean实现原理
问:
1.为什么Spring规定FactoryBean接⼝ 实现 并且 getObject()?
2.ctx.getBean(“conn”) 获得是复杂对象 Connection ⽽没有 获得ConnectionFactoryBean(&)
spring内部运行流程:
1.通过conn获得ConnectionFactoryBean类的对象,进而通过 instanceOf判断出是否是FactoryBean接口的实现类。
2.Spring按照规定getObject 返货 conn。
2.2 实例工厂
用处:
1.避免spring框架的侵入。
2.整合遗留的系统。
开发步骤
- 创建实例工厂
public class ConnectionFactory {
public Connection getConnection(){
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/suns?useSSL=false", "root", "123456");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
2.修改配置文件
<bean id="connFactory" class="cn.antblog.factorybean.ConnectionFactory"></bean>
<bean id="conn" factory-bean="connFactory" factorymethod="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?useSSL=false", "root", "123456");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
2.修改配置文件
<bean id="conn" class="cn.antblog.factorybean.StaticConnectionFactory" factorymethod="getConnection"/>
若有错误,希望大佬指出。
对你有帮助给点个👍再走呗。