Spring復雜對象創建的方式小結

在Spring中,對於簡單類型的創建,我們可以使用set註入和構造註入。但是對於復雜類型的如何創建?

什麼是復雜類型,比如連接數據庫的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();
        }

現在使用Spring如何創建這種類型的對象?Spring中提供瞭三種方法來創建復雜對象

第一種:實現FactoryBean接口

public class ConnectionFactoryBean implements FactoryBean<Connection> {
    //用於書寫創建復雜對象的代碼
    @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 隻會創建一個復雜對象
  返回 false 每一次都會創建新的對象
  問題:根據這個對象的特點 ,決定是返回true (SqlSessionFactory) 還是 false (Connection)
○ mysql高版本連接創建時,需要制定SSL證書,解決問題的方式
註意:類中的幾個連接數據庫的屬性,是自己添加的,便於在配置文件中註入,實現解耦合。

第二種方法:實例工廠 避免Spring框架的侵入整合遺留系統

直接在這個類寫創建復雜對象的方法,不用實現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;
    }
}

但是要在配置文件中進行配置

<!--ConnectionFactory實例 -->
 <bean id="connFactory" class="com.liu.factorybean.ConnectionFactory"></bean>
 <!--在factory-bean中應用ConnectionFactory實例id connFactory -->
 <bean id="conn"  factory-bean="connFactory" factory-method="getConnection"/>

第三種方式:靜態工廠

和實例工廠類似,隻不過這裡把實例方法,替換為靜態方法。

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;
    }
}

對應配置文件配置如下:

<bean id="conn" class="com.liu.factorybean.StaticConnectionFactory" factory-method="getConnection"/>

總結:

這些復雜對象我們在以後很少用到,因為我們在整合其他框架時,其他框架為我們提過瞭,創建復雜對象的方法,比如Spring整合Mybatis,Mybatis提供瞭創建SqlSessionFactory對象的方法。但是學習這些也是有必要的,因為這些框架底層使用的就是FactoryBean等這幾種方式。

到此這篇關於Spring復雜對象創建的三種方式的文章就介紹到這瞭,更多相關Spring復雜對象內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: