1. 开发步骤
- 实现FactoryBean接口
public class ConnectionFactoryBean implements FactoryBean<Connection> {
private String driverClassName;
private String url;
private String userName;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
// 用于书写创建复杂对象的方法,并把复杂对象作为方法的返回值返回
@Override
public Connection getObject() throws Exception {
Class.forName(driverClassName);
Connection conn = DriverManager.getConnection(url,userName,password);
return conn;
}
// 返回所创建复杂对象的class对象
@Override
public Class<?> getObjectType() {
return Connection.class;
}
// 是否只创建一次复杂对象(true),每次请求都创建新的复杂对象(false)
@Override
public boolean isSingleton() {
return false;
}
}
- Spring配置文件的配置
<bean id="conn" class="com.daixiang.factorybean.ConnectionFactoryBean"/>
值得注意的是,上述代码片段中,如果Class中指定的类型是FactoryBean接口的实现类,那么通过id值获得的是这个类所创建的复杂对象 Connection。
2. 一些细节
-
如果就想获得FactoryBean类型的对象,在id前添加“&”符号, 获得的就是ConnectionFactoryBean对象。
ctx.getBean("&conn");
-
isSingleton方法
返回 true 只会创建一个复杂对象返回 false 每一次都会创建新的对象
问题:根据这个对象的特点 ,决定是返回true (SqlSessionFactory) 还是 false (Connection) -
mysql高版本连接创建时,需要制定SSL证书,解决问题的方式
url = "jdbc:mysql://localhost:3306?useSSL=false"
-
依赖注入的体会(DI)
将ConnectionFactoryBean中依赖的4个字符串信息 ,进行配置文件的注入
好处:解耦合<bean id="conn" class="com.daixiang.basic.factorybean.ConnectionFactoryBean"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306"/> <property name="userName" value="root"/> <property name="password" value="123456"/> </bean>
3. FactoryBean的实现原理(简易版)
Spring内部运行流程
- 通过conn获得 ConnectionFactoryBean类的对象 ,进而通过instanceof 判断出是FactoryBean接口的实现类
- Spring按照规定 getObject() —> Connection
- 返回Connection
4. FactoryBean总结
FactoryBean是Spring中用于创建复杂对象的一种方式,也是Spring原生提供的,Spring整合其他框架的过程中,大量应用到FactoryBean。