Spring復(fù)雜對(duì)象創(chuàng)建的方式小結(jié)
在Spring中,對(duì)于簡(jiǎn)單類(lèi)型的創(chuàng)建,我們可以使用set注入和構(gòu)造注入。但是對(duì)于復(fù)雜類(lèi)型的如何創(chuàng)建?
什么是復(fù)雜類(lèi)型,比如連接數(shù)據(jù)庫(kù)的Connection對(duì)象,以及Mybatis中的SqlSessionFactory對(duì)象。
在以前我們是通過(guò)這種方式獲取Connection對(duì)象的:
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)建這種類(lèi)型的對(duì)象?Spring中提供了三種方法來(lái)創(chuàng)建復(fù)雜對(duì)象
第一種:實(shí)現(xiàn)FactoryBean接口
public class ConnectionFactoryBean implements FactoryBean<Connection> {
//用于書(shū)寫(xiě)創(chuàng)建復(fù)雜對(duì)象的代碼
@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>對(duì)這種使用的解讀:FactoryBean接口中有三個(gè)抽象方法

○ 如果就想獲得FactoryBean類(lèi)型的對(duì)象 ctx.getBean("&conn")
獲得就是ConnectionFactoryBean對(duì)象
○ isSingleton方法
返回 true 只會(huì)創(chuàng)建一個(gè)復(fù)雜對(duì)象
返回 false 每一次都會(huì)創(chuàng)建新的對(duì)象
問(wèn)題:根據(jù)這個(gè)對(duì)象的特點(diǎn) ,決定是返回true (SqlSessionFactory) 還是 false (Connection)
○ mysql高版本連接創(chuàng)建時(shí),需要制定SSL證書(shū),解決問(wèn)題的方式
注意:類(lèi)中的幾個(gè)連接數(shù)據(jù)庫(kù)的屬性,是自己添加的,便于在配置文件中注入,實(shí)現(xiàn)解耦合。
第二種方法:實(shí)例工廠(chǎng) 避免Spring框架的侵入整合遺留系統(tǒng)
直接在這個(gè)類(lèi)寫(xiě)創(chuàng)建復(fù)雜對(duì)象的方法,不用實(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)工廠(chǎng)
和實(shí)例工廠(chǎng)類(lèi)似,只不過(guò)這里把實(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;
}
}對(duì)應(yīng)配置文件配置如下:
<bean id="conn" class="com.liu.factorybean.StaticConnectionFactory" factory-method="getConnection"/>
總結(jié):
這些復(fù)雜對(duì)象我們?cè)谝院蠛苌儆玫?,因?yàn)槲覀冊(cè)谡掀渌蚣軙r(shí),其他框架為我們提過(guò)了,創(chuàng)建復(fù)雜對(duì)象的方法,比如Spring整合Mybatis,Mybatis提供了創(chuàng)建SqlSessionFactory對(duì)象的方法。但是學(xué)習(xí)這些也是有必要的,因?yàn)檫@些框架底層使用的就是FactoryBean等這幾種方式。
到此這篇關(guān)于Spring復(fù)雜對(duì)象創(chuàng)建的三種方式的文章就介紹到這了,更多相關(guān)Spring復(fù)雜對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java對(duì)xls文件進(jìn)行讀寫(xiě)操作示例代碼
Java開(kāi)發(fā)項(xiàng)目中經(jīng)常會(huì)碰到處理Excel文件中數(shù)據(jù)的情況,下面這篇文章主要給大家介紹了利用Java對(duì)xls文件進(jìn)行讀寫(xiě)操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-08-08
SpringBoot中的FailureAnalyzer使用詳解
這篇文章主要介紹了SpringBoot中的FailureAnalyzer使用詳解,Spring Boot的FailureAnalyzer是一個(gè)接口,它用于在Spring Boot應(yīng)用啟動(dòng)失敗時(shí)提供有關(guān)錯(cuò)誤的詳細(xì)信息,這對(duì)于開(kāi)發(fā)者來(lái)說(shuō)非常有用,因?yàn)樗梢詭椭覀兛焖僮R(shí)別問(wèn)題并找到解決方案,需要的朋友可以參考下2023-12-12
logback的DuplicateMessageFilter日志過(guò)濾操作源碼解讀
這篇文章主要為大家介紹了logback的DuplicateMessageFilter日志過(guò)濾操作源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
關(guān)于Java的對(duì)象序列化流和反序列化流詳細(xì)解讀
這篇文章主要介紹了關(guān)于Java的對(duì)象序列化流和反序列化流,對(duì)象序列化:就是將對(duì)象保存到磁盤(pán)中,或者在網(wǎng)絡(luò)中傳輸對(duì)象,反之,自己序列還可以從文件中讀取回來(lái),重構(gòu)對(duì)象,對(duì)它進(jìn)行反序列化,需要的朋友可以參考下2023-05-05
java二進(jìn)制運(yùn)算基礎(chǔ)知識(shí)點(diǎn)詳解
在本文里小編給大家分享了關(guān)于java二進(jìn)制運(yùn)算基礎(chǔ)知識(shí)點(diǎn)以及實(shí)例代碼內(nèi)容,需要的朋友們參考學(xué)習(xí)下。2019-08-08
Java Kafka分區(qū)發(fā)送及消費(fèi)實(shí)戰(zhàn)
本文主要介紹了Kafka分區(qū)發(fā)送及消費(fèi)實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

