第四章复杂对象
4.1什么是复杂对象:不能直接通过new创建出来的对象
- SqlSessionFactrory
- Connetction
4.2Spring工厂创建复杂对象
4.2.1FactoryBean接口
-
实现FactoryBean接口
public class ConnectionFactoryBean implements FactoryBean<Connection> { public Connection getObject() throws Exception { Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager .getConnection("jdbc:mysql://localhost:3306/atguidudb", "root", "123456"); return connection; } public Class<?> getObjectType() { return Connection.class; } public boolean isSingleton() { // true 为单实例 return true; } }
-
配置文件
<!--配置复杂对象 简单对象的话返回的是class类的对象而复杂对象则是getObject()方法返回的对象--> <bean id="dbconn" class="com.xia.basic.factorybean.ConnectionFactoryBean"/>
-
细节
-
如果想获得FactioryBean对象 : ctx.getBean("&dbconn");
-
public boolean isSingleton()方法:
返回true只会创建一个对象(单实例)
Connection(false) 不能被共用
SqlSessionFactory(true)线程安全
-
-
按照依赖注入思想修改代码
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; } public Connection getObject() throws Exception { Class.forName(driverClassName); Connection connection = DriverManager .getConnection(url, username, password); return connection; } public Class<?> getObjectType() { return Connection.class; } public boolean isSingleton() { // true 为单实例 return true; } }
<!--配置复杂对象--> <bean id="dbconn" class="com.xia.basic.factorybean.ConnectionFactoryBean"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/atguigudb?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>
-
FactoryBean实现简易思想
1.为什么要实现FactoryBean接口?实现getObejct()方法 2.ctx.getBean("conn")获得的是复杂对象 Connection 而不是 ConnectionFactoryBean 1.通过bean标签中的class是不是FactoryBean接口的实现 是: 复杂对象 调用getObejct()方法 否: 简单对象 直接创建对象
4.2.2实例工厂
避免Spring框架的侵入
整合遗留系统
<bean id="connFactory" class="com.xia.basic.factorybean.ConnectionFactory">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/atguigudb?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="conn" factory-bean="connFactory" factory-method="getObject"/>
4.2.2静态工厂
<bean id="staticConn" class="com.xia.basic.factorybean.StaticConnectionFactory" factory-method="getConnection"/>
区别:静态工厂不需要对象,所以可以直接配置类