第八章 Spring创建复杂对象
)
1.什么是复杂对象
复杂对象 : 指的就是不能通过直接new构造方法创建的对象
Connection
sqlSessionFactory
2.Spring工厂创建复杂对象的3种方式
2.1 FactoryBean接口
-
开发步骤
-
实现FactoryBean接口
//FactoryBean接口实现的方法 public Object getObject(){ //用于书写创建复杂对象的代码,并把复杂对象作为返回值返回 } public Class getObjectType(){ //返回所创建的复杂对象的Class对象 } public Boolean isSingleton(){ //创建一次 return true //每次调用都要创建 return false }
-
Connection连接对象示例 :
```java
//需要指明创建对象的泛型
public class ConnectionFactoryBean implements FactoryBean<Connection> {
//用于书写创建复杂对象的代码,并返回该对象
@Override
public Connection getObject() throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","00000000");
return conn;
}
//返回所创建复杂对象的Class对象
@Override
public Class<?> getObjectType() {
return Connection.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
```
-
Spring配置文件的配置
<bean id="conn" class="com.dong.FactoryBean.ConnectionFactoryBean"/>
-
与创建简单对象的区别
如果class中指定的类型,是FactoryBean接口的实现类,那么通过id值获得的对象,是这个类所创建的复杂对象
-
细节
-
怎么获得FactoryBean类型的对象
context.getBean("&conn")
-
isSingleton方法
根据对象的特点, 返回true还是false 能被共用(sqlSessionFactory),就创建一次,返回true;不能被共用(Connection),每次创建,返回false
-
mysql高版本连接时,指定SSL证书
url="jdbc:mysql://localhost:3306/student?userSSL=false"
-
依赖注入的体会
@Override public Connection getObject() throws Exception { Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root","00000000"); return conn; }
在上面的代码中很明显存在耦合--->"com.mysql.cj.jdbc.Driver" "jdbc:mysql://localhost:3306/student" "root" "00000000"
依赖于这些字符串, 所以我们可以进行依赖注入,来消除耦合
//需要指明创建对象的泛型 public class ConnectionFactoryBean implements FactoryBean<Connection> { private String driverName; private String url; private String username; private String password; ...get set //set注入 @Override public Connection getObject() throws Exception { Class.forName(driverName); Connection conn = DriverManager.getConnection(url,username,password); return conn; }
<bean id="conn" class="com.dong.FactoryBean.ConnectionFactoryBean"> <property name="driverName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/student" /> <property name="username" value="root"/> <property name="password" value="00000000"/> </bean>
-
-
FactoryBean的实现原理(简易版)
-
FactoryBean总结
Spring中用于创建复杂对象的一种方式, Spring原生提供的, Spring整合其他框架大量使用了FactoryBean
2.2 实例工厂
-
为什么使用实例工厂?
避免Spring的侵入 使用FactoryBean,必须要实现FactoryBean接口 整合遗留系统 在开发过程中,我们已经有了获取复杂对象的类,这时,我们需要将这个类整合进Spring来帮助我们获得该对象
-
开发步骤
因为已经有了获取复杂对象的方法, 我们只要在配置文件中进行配置即可
<!--com.dong.factorybean.ConnectionFactory是已经有的创建复杂对象的类--> <bean id="connFactory" class="com.dong.factorybean.ConnectionFactory"/> <bean id="conn" factory-bean="connFactory" factory-method="getConnection"/>
2.3 静态工厂
- 和实例工厂的区别
实例工厂中原有的创建复杂对象的方法不是静态方法
静态工厂中原有的创建复杂对象的方法是静态的
静态方法,Spring底层就可以不用再创建对象,直接通过类名调用获取复杂对象的方法
-
开发步骤
<bean id="conn" class="com.dong.factorybean.StaticConnectionFactory" factory-method="getConnection"/>