Spring復(fù)雜對象創(chuàng)建的方式小結(jié)
在Spring中,對于簡單類型的創(chuàng)建,我們可以使用set注入和構(gòu)造注入。但是對于復(fù)雜類型的如何創(chuàng)建?
什么是復(fù)雜類型,比如連接數(shù)據(jù)庫的Connection對象,以及Mybatis中的SqlSessionFactory對象。
在以前我們是通過這種方式獲取Connection對象的:
Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123456"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }
現(xiàn)在使用Spring如何創(chuàng)建這種類型的對象?Spring中提供了三種方法來創(chuàng)建復(fù)雜對象
第一種:實(shí)現(xiàn)FactoryBean接口
public class ConnectionFactoryBean implements FactoryBean<Connection> { //用于書寫創(chuàng)建復(fù)雜對象的代碼 @Override public Connection getObject() throws Exception { Class.forName(driverClassName); Connection conn = DriverManager.getConnection(url, username, password); return conn; } @Override public Class<?> getObjectType() { return Connection.class; } @Override public boolean isSingleton() { return true; } private String driverClassName; private String url; private String username; private String password; //setter and getter省略
在applicationContext.xml配置文件中
<bean id="conn" class="com.liu.factorybean.ConnectionFactoryBean"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mysql?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>
對這種使用的解讀:FactoryBean接口中有三個抽象方法
○ 如果就想獲得FactoryBean類型的對象 ctx.getBean("&conn")
獲得就是ConnectionFactoryBean對象
○ isSingleton方法
返回 true 只會創(chuàng)建一個復(fù)雜對象
返回 false 每一次都會創(chuàng)建新的對象
問題:根據(jù)這個對象的特點(diǎn) ,決定是返回true (SqlSessionFactory) 還是 false (Connection)
○ mysql高版本連接創(chuàng)建時,需要制定SSL證書,解決問題的方式
注意:類中的幾個連接數(shù)據(jù)庫的屬性,是自己添加的,便于在配置文件中注入,實(shí)現(xiàn)解耦合。
第二種方法:實(shí)例工廠 避免Spring框架的侵入整合遺留系統(tǒng)
直接在這個類寫創(chuàng)建復(fù)雜對象的方法,不用實(shí)現(xiàn)FactoryBean接口。
public class ConnectionFactory { public Connection getConnection(){ Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123456"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } }
但是要在配置文件中進(jìn)行配置
<!--ConnectionFactory實(shí)例 --> <bean id="connFactory" class="com.liu.factorybean.ConnectionFactory"></bean> <!--在factory-bean中應(yīng)用ConnectionFactory實(shí)例id connFactory --> <bean id="conn" factory-bean="connFactory" factory-method="getConnection"/>
第三種方式:靜態(tài)工廠
和實(shí)例工廠類似,只不過這里把實(shí)例方法,替換為靜態(tài)方法。
public class StaticConnectionFactory { public static Connection getConnection(){ Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123456"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } }
對應(yīng)配置文件配置如下:
<bean id="conn" class="com.liu.factorybean.StaticConnectionFactory" factory-method="getConnection"/>
總結(jié):
這些復(fù)雜對象我們在以后很少用到,因?yàn)槲覀冊谡掀渌蚣軙r,其他框架為我們提過了,創(chuàng)建復(fù)雜對象的方法,比如Spring整合Mybatis,Mybatis提供了創(chuàng)建SqlSessionFactory對象的方法。但是學(xué)習(xí)這些也是有必要的,因?yàn)檫@些框架底層使用的就是FactoryBean等這幾種方式。
到此這篇關(guān)于Spring復(fù)雜對象創(chuàng)建的三種方式的文章就介紹到這了,更多相關(guān)Spring復(fù)雜對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JDK1.8下載、安裝和環(huán)境配置超詳細(xì)教程(最新最完整)
jdk1.8是一款功能強(qiáng)大的Java語音軟件開發(fā)工具包,JDK是學(xué)好Java的第一步,本文重點(diǎn)給大家介紹JDK1.8下載、安裝和環(huán)境配置教程,需要的朋友可以參考下2022-11-11教你1秒將本地SpringBoot項(xiàng)目jar包部署到Linux環(huán)境(超詳細(xì)!)
spring Boot簡化了Spring應(yīng)用的開發(fā)過程,遵循約定優(yōu)先配置的原則提供了各類開箱即用(out-of-the-box)的框架配置,下面這篇文章主要給大家介紹了關(guān)于1秒將本地SpringBoot項(xiàng)目jar包部署到Linux環(huán)境的相關(guān)資料,超級詳細(xì),需要的朋友可以參考下2023-04-04Java 中 synchronized的用法詳解(四種用法)
Java語言的關(guān)鍵字,當(dāng)它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多只有一個線程執(zhí)行該段代碼。本文給大家介紹java中 synchronized的用法,對本文感興趣的朋友一起看看吧2015-11-11